Documente Academic
Documente Profesional
Documente Cultură
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:
if ( readyProcesses(PCBs) ) {
nextPCB = selectProcess(PCBs);
run( nextPCB );
} else {
run_idle_process();
}
Planificarea proceselor (cont)
• 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 */
pid_t childpid; /* variable to store the /* parent will wait for the child to
child's pid */ complete */
} }
}
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