Upload
jerome-galland
View
105
Download
0
Embed Size (px)
Citation preview
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]$