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

Post on 04-Apr-2015

105 views 0 download

Transcript of 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...

Processus 1.2

Environnement d'exécution

Processeurprocesseur

Bus système

mémoireentrées/sorties

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

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

Processus 1.5

Interruptions

Processeurprocesseur

Bus système

mémoireentrées/sorties

horloge

Processus 1.6

Systèmes Multiprogrammés "Batch"

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

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).

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

Processus 1.9

Creation d’un Processus

• code source :

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

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>

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

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

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

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];

...};

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;

...};

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

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)); }}

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$

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.

...

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

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$

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

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));

}

}

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$

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]$