25
Processus 1.1 Introduction à la programmation système …de l'exécution de code aux processus...

1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Embed Size (px)

Citation preview

Page 1: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.1

Introduction à la programmation système

…de l'exécution de code aux processus...

Page 2: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.2

Environnement d'exécution

Processeurprocesseur

Bus système

mémoireentrées/sorties

Page 3: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.3

fonctionnement de la pile

• Consiste en un pointeur (registre du processeur) et une zone de mémoire

• 2 instructions pour la manipuler :

– push <registre> copie le contenu du registre au sommet de la pile, puis ajuste (ex: décrémente) le pointeur de pile

– pop <registre> copie le sommet de la pile dans le registre

• utilisée par le processeur lors des appels de fonction

– pour stocker l'adresse de retour

• utilisée par le compilateur

– pour les variables locales aux fonctions

– pour sauvegarder le contenu des registres avant de les utiliser

Page 4: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.4

Contenu de la mémoire

pile

code

données

0x0000

0x7FFF

0x8000

0xBFFF

0xC000

0xFFFF

mémoire

processeur

Pointeur pile

Pointeur pgm.

0x3FFF

0x4000

Page 5: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.5

Interruptions

Processeurprocesseur

Bus système

mémoireentrées/sorties

horloge

Page 6: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.6

Systèmes Multiprogrammés "Batch"

Plusieurs "jobs" sont présent simultanément en mémoire et se partage le processeur

Page 7: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.7

système en multiprogrammation

• Fonctions d'Entrée/Sortie fournies par le système

• Système de gestion de la mémoire (allocation à différents jobs)

• partage du CPU – Le système doit choisir entre tous les travaux prêts

• Allocation des périphériques (bandes magnétiques).

Page 8: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.8

Système d'exploitation

Matérielcpu, mémoire, E/S

processus

Système d'exploitation

processus

processus

Ensemble de fonctions et de structures de données destiné à optimiser l'utilisation du système

Page 9: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.9

Creation d’un Processus

• code source :

#include <stdio.h>int i=0;int j;main(){ char c; printf("Hello World\n");}

Page 10: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.10

Production de l'Executable

• Compilation :

> lshello.c> cc -c hello.c> lshello.c hello.o

• Edition de liens :

> cc -o hello hello.o> lshello hello.c hello.o

• Execution :

> helloHello World>

Page 11: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.11

Etapes de la compilation

[couveep@pegtst2 os]$ cc -o hello -v hello.c

Reading specs from /usr/lib/gcc-lib/ia64-redhat-linux/2.96/specs

gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-101)

/usr/lib/gcc-lib/ia64-redhat-linux/2.96/cpp0 -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=96 -D__GNUC_PATCHLEVEL__=0 -D__linux -D_LONGLONG -D__LP64__ -D__ELF__ -D__ia64__ -D__unix__ -D__linux -D__unix -Asystem(linux) -Acpu(ia64) -Amachine(ia64) -D__NO_INLINE__ -D__LONG_MAX__=9223372036854775807L hello.c /tmp/ccVEo6LF.i

GNU CPP version 2.96 20000731 (Red Hat Linux 7.1 2.96-101) (cpplib) (IA-64)

#include "..." search starts here:

#include <...> search starts here:

/usr/local/include

/usr/include

/usr/lib/gcc-lib/ia64-redhat-linux/2.96/cc1 /tmp/ccVEo6LF.i -mb-step -quiet -dumpbase hello.c -version -o /tmp/ccYMqMGb.s

GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-101) (ia64-redhat-linux) compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-101).

as -x -o /tmp/ccD85dDL.o /tmp/ccYMqMGb.s

/usr/lib/gcc-lib/ia64-redhat-linux/2.96/collect2 -dynamic-linker /lib/ld-linux-ia64.so.2 -o hello /usr/lib/gcc-lib/ia64-redhat-linux/2.96/../../../crt1.o /usr/lib/gcc-lib/ia64-redhat-linux/2.96/../../../crti.o /usr/lib/gcc-lib/ia64-redhat-linux/2.96/crtbegin.o -L/usr/lib/gcc-lib/ia64-redhat-linux/2.96 -L/usr/lib/gcc-lib/ia64 -redhat-linux/2.96/../../../tmp/ccD85dDL.o -lgcc -lc -lgcc /usr/lib/gcc-lib/ia64-redhat-linux/2.96/crtend.o /usr/lib/gcc-lib/ia64-redhat-linux/2.96/../../../crtn.o

Page 12: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.12

Espace d'adressage du processus

Pile d'exécution

Données noninitialisées

Code

Données initialisées

Segment TEXT

Segment DATA

Segment BSS

Segment STACK

Mémoire centrale

0x00000100

0x00010000

0x00020000

0xFFFFF000

Page 13: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.13

Les processus vus par le système

• Le système identifie chaque processus par un numéro unique : le PID

• Chaque processus est géré par le système au moyen de structures de donnée

– sur LINUX : "task_struct" et "mm_struct"

• Les processus ont des relations de parenté : PPID

Page 14: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.14

structure task_struct (LINUX)

struct task_struct {

volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */

...

pid_t pid;

...

struct task_struct *parent; /* parent process */

struct list_head children; /* list of my children */

struct list_head sibling; /* linkage in my parent's children list */

...

/* process credentials */

uid_t uid,euid,suid,fsuid;

gid_t gid,egid,sgid,fsgid;

...

struct mm_struct *mm;

struct rlimit rlim[RLIM_NLIMITS];

...

char comm[16];

...};

Page 15: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.15

Structure mm_struct (LINUX)

struct mm_struct {

...

unsigned long start_code, end_code, start_data, end_data;

unsigned long start_brk, brk, start_stack;

unsigned long arg_start, arg_end, env_start, env_end;

...};

Page 16: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.16

appels système

• PID = fork();

– création d'un nouveau processus par clonage du processus appelant

– 1 processus appelle le service noyau

– 2 processus recoivent le code de retour de fork(); pour le processus qui a fait l'appel : PID du processus crée pour le processus qui vient d'être créé : 0

• rc = exec ("<nom_programme>");

– chargement dans le contexte du processus courant d'un nouvel executable

• exit(code-retour);

– destruction du processus courant

• PID = wait();

– attente de la mort d'un processus fils

Page 17: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.17

FORK() - exemple 1

#include <stdio.h>#include <sys/wait.h>

main(){int pid, rc=0;char c;

c = getchar(); pid = fork(); if (pid == 0) { /* je suis le fils */ printf("Je suis le fils : pid = %d\n", pid); exit(10); } else { /* je suis le pere */ c = getchar(); printf("Je suis le pere : pid = %d\n", pid); pid = wait(&rc); c = getchar(); printf("Mon fils %d m'a rendu %d\n", pid, WEXITSTATUS(rc)); }}

Page 18: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.18

Resultat Exemple 1

neptune.couveep$ prog

Je suis le fils : pid = 0

Je suis le pere : pid = 197450

Mon fils 197450 m'a rendu 10

neptune.couveep$

Page 19: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.19

Commande ps86 A2 41JX -- AIX 4.3 Commands Reference -- Copyright Bull March 1999

ps Command

Purpose

Shows current status of processes.

Syntax

ps [ -A ] [ -N ] [ -a ] [ -d ] [ -e ] [ -f ] [ -k ] [ -l ] [ -F format] [ -o Format ] [ -G Glist ] [ -g Glist ][ -m ] [ -n NameList ] [ -p Plist ] [ -t Tlist ] [ -U Ulist ] [ -u Ulist ]

Description

The ps command writes the current status of active processes and (if the -m flag is given) associated kernel threads to standard output. Note that while the -m flag displays threads associated with processes using extra lines, you must use the -o flag with the THREAD field specifier to display extra thread-related columns.

Without flags, the ps command displays information about the current workstation. The -f, -o, l, -l, s, u, and v flags only determine how much information is provided about a process; they do not determine which processes are listed. The l, s, u, and v flags are mutually exclusive.

...

Page 20: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.20

Resultats de ps

• Après lancement du programme :

neptune.couveep$ ps -f -ucouveep

UID PID PPID C STIME TTY TIME CMD

couveep 75334 220436 0 16:07:47 pts/117 0:00 prog

couveep 121188 218360 0 11:24:35 pts/118 0:00 -ksh

couveep 133832 121188 6 16:14:15 pts/118 0:00 ps -f -ucouveep

couveep 177262 7524 0 11:15:25 - 0:00 /usr/bin/X11/xterm

couveep 218360 7524 0 11:24:33 - 0:01 /usr/bin/X11/xterm

couveep 220436 177262 0 11:15:27 pts/117 0:00 -ksh

Page 21: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.21

Resultats de ps

• Après premier getchar() :

neptune.couveep$ ps -f -ucouveep

UID PID PPID C STIME TTY TIME CMD

couveep 35086 75334 0 0:00 <defunct>

couveep 75334 220436 0 16:07:47 pts/117 0:00 prog

couveep 121188 218360 1 11:24:35 pts/118 0:00 -ksh

couveep 153044 121188 7 16:28:21 pts/118 0:00 ps -f -ucouveep

couveep 177262 7524 0 11:15:25 - 0:00 /usr/bin/X11/xterm

couveep 218360 7524 0 11:24:33 - 0:01 /usr/bin/X11/xterm

couveep 220436 177262 0 11:15:27 pts/117 0:00 -ksh

neptune.couveep$

Page 22: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.22

Resultats de ps

• Après second getchar() :

neptune.couveep$ps -f -ucouveep

UID PID PPID C STIME TTY TIME CMD

couveep 121188 218360 1 11:24:35 pts/118 0:00 -ksh

couveep 75334 220436 0 16:07:47 pts/117 0:00 prog

couveep 177262 7524 0 11:15:25 - 0:00 /usr/bin/X11/xterm

couveep 192504 121188 6 16:34:26 pts/118 0:00 ps -f -ucouveep

couveep 218360 7524 0 11:24:33 - 0:01 /usr/bin/X11/xterm

couveep 220436 177262 0 11:15:27 pts/117 0:00 -ksh

Page 23: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.23

FORK() - exemple 2

#include <stdio.h>

#include <sys/wait.h>

main()

{

int pid, rc=0;

char c;

c = getchar();

pid = fork();

if (pid == 0)

{

/* je suis le fils */

printf("Je suis le fils : pid = %d\n", pid);

execlp("/usr/bin/ls", "ls", 0);

} else {

/* je suis le pere */

c = getchar();

printf("Je suis le pere : pid = %d\n", pid);

c = getchar();

pid = wait(&rc);

printf("Mon fils %d m'a rendu %d\n", pid, WEXITSTATUS(rc));

}

}

Page 24: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.24

Resultat Exemple 2

neptune.couveep$ prog2

Je suis le fils : pid = 0

433 WPS books bulldrv.tar.Z io prog.c

LP2 atf bulldrv fc.h legato prog2

SB book1.ps bulldrv.tar hostinfo prog prog2.c

Je suis le pere : pid = 224318

Mon fils 224318 m'a rendu 0

neptune.couveep$

Page 25: 1.1 Processus Introduction à la programmation système …de l'exécution de code aux processus

Processus 1.25

Connexion au système

Connecting to host "pegtst2"......success.

Red Hat Linux release 7.2 (Enigma)

Kernel 2.4.19 on an ia64

login: couveep

Password:

Last login: Tue Feb 11 08:52:04 from pccouvee

[couveep@pegtst2 couveep]$ ps -f

UID PID PPID C STIME TTY TIME CMD

couveep 17645 17557 0 13:54 pts/97 00:00:00 -bash

couveep 17881 17645 0 13:55 pts/97 00:00:00 ps -f

[couveep@pegtst2 couveep]$id

uid=10523(couveep) gid=64(ia64) groups=64(ia64)

[couveep@pegtst2 couveep]$