Controlul și Gestiunea Proceselor în Linux

Previzualizare laborator:

Extras din laborator:

Sistemul de operare Linux pune la dispoziţie apeluri sistem pentru controlul şi gestiunea proceselor, cum ar fi apeluri pentru crearea şi terminarea unui proces, înlocuirea programului executat de un proces sau punerea în aşteptare a unui proces până la terminarea altui proces.

Lansarea şi terminarea execuţiei unui program C sub Linux

Termenul de program specifică, de cele mai multe ori, un fişier executabil aflat pe un suport de memorare extern - hard disk. O instanţă a unui program aflat în lucru poartă numele de proces. Acesta conţine imaginea fişierului executabil (segmentele de cod, date şi stivă) precum şi resursele utilizate în momentul execuţiei (regiştri, fişiere deschise, etc.).

Un program este executat de nucleul sistemului de operare (eng. kernel) prin intermediul funcţiei exec. Lansarea în execuţie a unui program C presupune (i) căutarea unui fişier ce conţine cod executabil, (ii) încărcarea în memorie a conţinutului său şi (iii) predarea controlului către acest program. Compilatorul C şi editorul de legături (eng. link-editor) adaugă programului o funcţie specială, denumită rutină de start C, care va primi controlul în momentul lansării programului în execuţie şi va apela apoi funcţia main. Rutina de start mai are rolul de a prelua de la nucleul sistemului de operare argumentele programului din linia de comandă şi variabilele de mediu. Modul în care se execută un program este schiţat în fig. 2.1. n u c l e u L i n u x rutina de start C funcţia main() funcţii utilizator sau apeluri de sistem funcţia exit handler exit handler exit rutina de curăţare I/O apel return return return apel apel _exit _exit _exit exec apel apel return return exit exit exit proces utilizator

Fig. 2.1. Execuţia unui program sub Linux

După ce funcţia main primeşte controlul, ea poate apela alte funcţii utilizator sau poate solicita servicii de la sistemul de operare (prin intermediu apelurilor sistem). Terminarea execuţiei unui program se poate face normal (prin revenire naturală din main sau prin apelurile de sistem exit şi _exit) sau anormal (prin apelul sistem abort sau prin primirea unui semnal). Apelurile sistem exit şi _exit au următoarele prototipuri:

- include <stdlib.h>

void exit(int status)

- include <unistd.h>

void _exit(int status)

Controlul şi gestiunea proceselor în Linux 2

Argumentul status reprezintă codul prin care programul transmite starea de terminare a procesului. Uzual, terminarea normală a unui proces este semnalizată prin status = 0, dar şi alte valori mai mici decât 128 au semnificaţia unei terminări normale. Valorile peste 128 indică o terminare anormală a procesului.

Diferenţa dintre cele două apeluri constă în aceea că exit asigură terminarea corespunzătoare a operaţiilor de I/O în curs de execuţie, golirea bufferelor utilizate de proces şi închiderea fişierelor deschise. După rezolvarea acestor probleme, exit apelează _exit. Există posibilitatea de a se înregistra cu ajutorul funcţiei C atexit anumite funcţii care să fie executate de exit, cu scopul de a se efectua anumite operaţii înainte de terminarea procesului.

Apeluri sistem pentru crearea proceselor (fork şi vfork)

Fiecare proces Linux primeşte, în momentul creării, un identificator unic numit PID (Process ID). Acest identificator este un număr întreg, a cărui unicitate este garantată de sistemul de operare. Un proces poate afla propriul PID cu ajutorul funcţiei C getpid.

- include <sys/types.h>

- include<unistd.h>

pid_t getpid(void)

Crearea unui proces se face cu ajutorul funcţiilor fork şi vfork:

- include <sys/types.h>

- include<unistd.h>

pid_t fork(void)

pid_t vfork(void)

Apariţia unei erori la execuţia apelului fork este semnalizată prin returnarea valorii -1. În cazul unei execuţii reuşite, la ieşirea din apelul fork există un nou proces. Procesul care a apelat fork se numeşte proces părinte, iar procesul creat se numeşte proces fiu.

Funcţia fork returnează PID-ul procesului fiu în procesul părinte şi 0 în procesul fiu. Toate resursele deţinute de procesul părinte sunt duplicate în procesul fiu (segmentele de cod, date şi stivă, fişierele deschise, variabilele de mediu, etc.), cu excepţia lacătelor pe fişiere puse de părinte, alarmelor în aşteptare pentru părinte şi semnalelor în aşteptare pentru părinte. Altfel spus, imediat după fork cele două procese vor avea segmente de cod, date şi stivă identice, aceleaşi fişiere deschise, etc.

Obs. Atunci când se creează un proces cu funcţia fork, nu trebuie făcută nici o presupunere legată de ordinea de execuţie a celor două procese înrudite. Această ordine este dependentă de algoritmul de planificare a proceselor. Dacă se doreşte impunerea unei anumite ordini trebuie să se recurgă la mecanisme de sincronizare între cele două procese.

Observații:

Lab 2

Download gratuit

Documentul este oferit gratuit,
trebuie doar să te autentifici in contul tău.

Structură de fișiere:
  • Controlul si Gestiunea Proceselor in Linux.pdf
Alte informații:
Tipuri fișiere:
pdf
Nota:
7/10 (1 voturi)
Nr fișiere:
1 fisier
Pagini (total):
8 pagini
Imagini extrase:
8 imagini
Nr cuvinte:
2 854 cuvinte
Nr caractere:
15 236 caractere
Marime:
175.13KB (arhivat)
Publicat de:
NNT 1 P.
Nivel studiu:
Facultate
Tip document:
Laborator
Domeniu:
Sisteme de Operare
Predat:
la facultate
Materie:
Sisteme de Operare
Profesorului:
Marius Şutu
Sus!