Sunteți pe pagina 1din 51

Cursul 3: Procese

Cursul 2: Recapitulare (Cont.)


Rolul SO in executia programelor
0xFFF…
Executable
Program Source OS

compiler
int main()

Execute
editor

Load &
{…; data stack

Memory
}
instructions heap

a.out data
foo.c
• Incarca instructiunile si segmentul de instructions
date in memorie 0x000…
• Creeaza stiva si Heap-ul PC:

• Transfera controlul catre program registers


Processor
• Asigura servicii catre program
(system calls) Sursa: UCB
Cursul 2: Recapitulare
Cursul 2: Recapitulare (Cont.)
Cursul2: Recapitulare (Cont.)
Cursul2: Recapitulare (Cont.)
Capitolul 3: Procese
• Conceptul de proces
• Planificarea proceselor
• Operatii ale proceselor
• Cooperarea dintre procese
HW/ Servicii OS/ Abstractizare 👤
Ce este un proces?
Conceptul de Proces
• Proces – un program in executie; executia procesului
trebuie sa progreseze secvential

• Procese in diferite sisteme:


• Sisteme Batch – job-uri
• Sisteme Time-shared – sarcini (tasks)
• Putem considera termenii jobs/tasks/process similari
Imaginea unui proces in
memorie
Conceptul de Proces
• Un proces include:
• Instructiunile programului
• Un contor de program (program counter)/IP (instruction
pointer/Intel)
• Stiva si SP
• Datele programului
• Spatiul de Heap pt date dinamice
• Valorile registrilor
• Lista fisierelor deschise
• Starea procesului
• Etc
Imaginea unui proces in
memorie
Starile unui proces
Starile proceselor
Starile proceselor
• Pe masura ce un proces se executa, acesta isi schimba
starea
• Nou (New): Procesul este creat
• In rulare (Running): Instructiunile sunt executate
• In asteptare (Waiting): Procesul asteapta ca un
eveniment sa se termine
• Gata de executie (Ready): Procesul asteapta sa fie
alocat catre procesor; este gata de executie
• Terminat (Finished): Procesul si-a incheiat executia iar
OS il curata
Starile proceselor - exemplu
Structura unui proces - PCB
Blocul de control al procesului
/ Process Control Block (PCB)
- Structura de date
folosita de SO
- Necesara pentru
gestionarea proceselor;
urmareste executia si
locatia fiecarui proces
- SO creaza un PCB la
crearea fiecarui proces
si il plaseaza intr-o
coada
- SO dezaloca PCB la
terminarea procesului
PCB
Categorii de informatii asociate unui
proces
• Starea procesului
• Contorul program
• Registrii CPU
• Informatii despre planificarea
proceselor
• Informatii despre memoria alocata
• Informatii de auditare
• Informatii legate de statusul operatiilor
cu dispozitive I/O
Comutare CPU de la un
proces la altul
Comutarea de context (context
switch)
• Cand CPU comuta catre o alta sarcina
sistemul trebuie sa salveze starea vechiului
proces (PCBa) si sa incarce starea anterior
salvata a noului proces (PCBb)
• Reprezinta un overhead pentru sistem
• Timpul de comutare este dependent de
hardware
Planificarea proceselor
Cozi de procese (gata de executie, in
asteptare pe tipuri de device-uri)
Planificarea proceselor
Planificatorul

if ( readyProcesses(PCBs) ) {
nextPCB = selectProcess(PCBs);
run( nextPCB );
} else {
run_idle_process();
}
Planificarea proceselor (cont)

• Procesele pot fi descrise ca:


• Procese I/O (I/O-bound )– petrec mai mult timp
ocupandu-se de I/O decat de computing, cicluri
scurte de calcul intensiv (burst)
• Procese de calcul (CPU-bound ) – petrec mai
mult timp executand calcule; cicluri lungi de calcul
intensiv (burst)
Operatii ale proceselor
Crearea proceselor
• Procesul “parinte” creaza procese “copii”, care
la randul lor creaza alti copii determinand un
arbore de procese
• Model de executie
• Parintele si copiii se executa concomitent
• Parintele asteapta pana ce copiii termina
Crearea proceselor
Crearea proceselor (Cont.)
• Spatiu de adrese
• Copilul devine un duplicat al parintelui
• Copilul incarca un nou program in spatiul de adrese

• Exemple UNIX
• Apelul de sistem fork() creaza noi procese
• Apelul de sistem exec() este folosit dupa fork()
pentru a inlocui memoria procesului cu noul
program
Crearea proceselor (Cont.)
• pid_t fork(); -- copiaza procesul curent
• Noul proces are un PID diferit
• Valoarea intoarsa de fork(): pid (similar cu un
intreg)
• > 0:
• Rulare in contextual Parent process
• Valoarea intoarsa este pid al noului copil
• = 0:
• Rulare in contextul Child process
• < 0:
• Error! Trebuie gestionata
• Ruleaza in procesul original
Crearea proceselor
• Fiecare comanda UNIX este un copil al
procesului shell; implicit fork() + exec()
• & permite rularea proceselor in background,
ex: sleep 200 &
Crearea proceselor (Cont.)
Program C pentru crearea
unui nou proces – simple
version
#include <unistd.h> int main()
{
#include <errno.h>
pid_t pid;
#include <sys/wait.h> /* fork another process */
#include <stdlib.h> pid = fork();
if (pid < 0) { /* error occurred */
#include <stdio.h>
fprintf(stderr, "Fork Failed");
#include <sys/types.h> exit(-1);
}
else if (pid == 0) { /* child process */
execlp("/bin/ls", "ls", NULL);
}
else { /* parent process */
/* parent will wait for the child
to complete */
wait (NULL);
printf ("Child Complete");
exit(0);
}
}
Executie fork()
Program C pentru crearea
unui nou proces – extended
version
#include <unistd.h> else if (childpid == 0) { /* child process */

printf("CHILD: I am the child process!\n");


#include <errno.h>
printf("CHILD: Here's my PID: %d\n", getpid());
#include <sys/wait.h>
printf("CHILD: My parent's PID is: %d\n", getppid());

#include <stdlib.h> printf("CHILD: The value of my copy of childpid is: %d\n",


childpid);
#include <stdio.h> printf("CHILD: Sleeping for 1 second...\n");

#include <sys/types.h> sleep(1); /* sleep for 1 second */

execlp("/bin/ls", "ls", NULL);


int main(void)
}
{
else { /* parent process */

pid_t childpid; /* variable to store the /* parent will wait for the child to
child's pid */ complete */

printf("PARENT: I am the parent


int retval; /* child process: user- process!\n");
provided return code */
printf("PARENT: Here's my PID: %d\n", getpid());
int status; /* parent process: child's printf("PARENT: The value of my copy of childpid is %d\n",
exit status */ childpid);

printf("PARENT: I will now wait for my child to exit.\n");


/* fork another process */
wait (&status);
childpid = fork();
printf ("Child Complete \n");
if (childpid < 0) { /* error occurred */ printf("PARENT: Child's exit code is: %d\n",
WEXITSTATUS(status));
fprintf(stderr, "Fork Failed");
printf("PARENT: Goodbye!\n");
exit(-1); exit(0);

} }

}
Compilare program C in
terminal Linux
sudo -s
gcc main.cpp -o main.out
./main.out
Arbore de procese pe un
sistem Solaris
Terminarea proceselor
• Procesul executa ultima comanda si cere SO
sa il stearga – exit()
• Transmite datele de la “copil” catre “parinte” – prin
apel wait()
• Resursele procesului sunt dezalocate de catre SO
• Parintele poate sa opreasca executia
proceselor copiilor - abort()/kill() daca:
• Copilul a depasit limita de resurse alocate
• Sarcina atribuita copilului nu mai este necesare
• Daca procesul parinte se inchide:
• Unele SO nu permit procesului copilului sa continue
executia data procesul parintele se inchide - terminare in
cascada
Process Info
pstree
top

----------
ls –l /proc/
cd /proc/PID
Cooperarea dintre procese
Procese cooperante
• Proces independent - nu poate afecta si nu
poate fi afectat de executia unui alt proces
• Proces cooperant - poate afecta si poate fi
afectat de executia altor procese
• Avantajele proceselor cooperante
• Partajare de informatii
• Calcule mai rapide
• Modularitate
Modele de comunicare

Schimb de mesaje Memorie partajata


Alte modele de procese cooperante
Alte modele de procese cooperante
Conducte | Pipes
Pipes
• Implementare: atat in UNIX/Linux cat si in
Windows
• Iesirea (stdout) unui program devine intrare
pentru alt program (stdin)
• Comunicare unidirectionala (de la stanga la
dreapta)
• Ex: ls /bin | more
Alte modele de procese cooperante
Schimb de mesaje client - server
Comunicarea Client-Server
• Sockets
• Apeluri de Procedura de la Distanta (Remote
Procedure Calls - RPC)
• Invocare de Metode la Distanta (Remote
Method Invocation - Java)
Comunicarea prin Sockets
Sfarsitul cursului 3

S-ar putea să vă placă și