Sunteți pe pagina 1din 64

PROIECTAREA SISTEMELOR DE OPERARE

SUB 1MEMORIA CACHE; STRUCTURI DE DATE


Structura unui buffer Un buffer consta in doua parti: - o zona de date (contine datele de pe disc) - un antet (identifica bufferul) Antetul unui buffer contine: - un camp numar de dispozitiv (reprezinta numarul sistemului de fisiere logic) - un camp numar de bloc - un camp de stare - un pointer la zona de date a bufferului - doua seturi de pointeri, folositi de algoritmi de alocare a bufferelor o pointer la bufferul anterior din lista de hash o pointer la bufferul urmator din lista de hash o pointer la bufferul anterior din lista bufferelor libere o pointer la bufferul urmator din lista bufferlor libere Starea unui buffer Este o combinatie intre urmatoarele conditii: - bufferul este momentan blocat (locked, busy) - bufferul contine date valide - kernelul trebuie sa scrie continutul bufferului pe disc inainte de a realoca bufferul (delayed- wait) - kernelul momentan citeste sau scrie continutul bufferului pe disc - un proces asteapta ca bufferul sa devina liber Lista bufferelor libere

Bufferele din listele hash


1

Scenarii pentru regsirea unui buffer: 1. Kernel-ul gsete blocul n lista hash i buffer-ul su este liber. 2. Kernel-ul nu gsete blocul n lista hash i aloc un buffer din lista buffer-elor libere ( free list ). 3. Kernel-ul nu gsete blocul n lista hash i, n ncercarea de a aloca un buffer din free list( ca n scenariul 2 ), gsete un buffer marcat ca delayed-write. Kernel-ul trebuie s scrie acest buffer pe disc i s aloce alt buffer. 4. Kernel-ul nu gsete blocul n lista hash i lista buffer-elor libere este goal. 5. Kernel-ul gsete blocul n lista hash dar buffer-ul este momentan ocupat ( busy ).

SUB 2MEMORIA CACHE; ALGORITMUL GETBLK


Algoritmul getblk intrari:numarul sistemului de fisiere numarul blocului iesire:buffer blocat care poate fi asociat blocului { while(bufferul nu este gasit) { if(blocul este in lista hq) { if(buffer ocupat) /*scenariul5*/ { sleep(evenimentul buffer devine liber); continue; /*salt la while*/ } marcheaza bufferul ocupat; /*scenariul1*/ sterge bufferul din FLB; return buffer; } else /*blocul nu este in lista hq*/ { if(nu exista buffere in FLB) /*scenariul4*/ { sleep(pana cand orice buffer devine liber); continue; /*salt la while*/ } Starge bufferul din FLB; if(bufferul marcat pentru scriere intarziata) /*scenariul3*/ { scriere asincrona a bufferului pe disc; continue; /*salt la while*/ } /*scenariul2gasirea unui buffer liber*/ sterge bufferul din lista hq; pune bufferul in noua lista hq; return buffer; } } } Cand citeste date dintr-un anumit bloc disc,nucleul verifica daca blocul este in pool. Daca nu este ii asigneaza un buffer liber. Cand scrie datele unui anumit bloc disc, nucleul verifica daca blocul este in pool-ul de buffere, iar daca nu este, asigneaza un buffer liber pentru acest bloc. Algoritmii pentru citirea si scrierea blocurilor disc utilizeaza algoritmul getblk pentru alocarea de buffere de pool.

Exista cinci scenarii tipice pe care nucleul le urmeaza in algoritmul getblk pentru alocarea unui buffer pentru un bloc disc: 1. Nucleul gaseste blocul in lista hq, iar bufferul este liber; 2. Nucleul nu gaseste blocul in lista hq, astfel ca el alocaun buffer din FLB; 3. Nucleul nu gaseste blocul in lista hq si incercand sa aloce un buffer din FLB (ca in scenariul 2), il gaseste marcat delayed-write. Nucleul trebuie sa scrie acest buffer pe disc si sa aloce alt buffer; 4. Nucleul nu poate gasi blocul in lista hq, iar FLB este goala; 5. Nucleul gaseste blocul in lista hq, dar bufferul este momentan ocupat

SUB 3ALG. BREAD, BREADA, BWRITE


Dup prezentarea algoritmului de alocare a bufferelor, procedurile pentru citirea i scrierea blocurilor disc vor fi mai uor de neles. Pentru a citi un bloc disc , un proces folosete algoritmul getblk pentru a-l cuta n buffer cache, nucleul l poate returna imediat fr citirea fizic a blocului de pe disc. Dac nu este n memoria cache nucleul apeleaz driverul de disc pentru a "planifica" o cerere de citire i se pune n ateptare pn la terminarea operaiilor de I/O. Driverul de disc specific controlerului de disc c dorete s citeasc date, iar acesta transmite apoi datele la buffer. n final, controlerul de disc ntrerupe procesorul cnd s-au terminat operaiile de I/O i rutina de tratare a ntreruperii de disc trezete procesele care ateapt, coninutul blocului disc fiind acum n buffer. Algoritmul bread algoritm bread /* citire bloc */ intrare: numrul blocului din sistemul de fiiere; ieire: buffer coninnd date; { obine buffer pentru bloc (algoritm getblk); if (datele din buffer sunt valide) return (buffer); iniiaz operaia de citire a discului; sleep (pn la ncheierea operaiei de citire) return (buffer); } Modulele de nivel nalt ale nucleului (cum ar fi subsistemul de fiiere) pot anticipa necesitatea unui al doilea bloc disc cnd un proces citete secvenial un fiier. Modulele solicit a doua operaie asincron de I/O n sperana c datele vor fi n memorie cnd va fi nevoie de ele, sporind astfel performanele sistemului. Pentru a realiza aceasta, nucleul execut algoritmul de citire n avans a blocului, breada :nucleul verific dac primul bloc este n memoria cache i, dac nu este, invoc driverul de disc pentru a citi acel bloc. Dac al doilea bloc nu este n bufferul cache, nucleul instruiete driverul de disc s-l citeasc asincron. Apoi procesul se pune n ateptare pn cnd operaiile de I/O cu primul bloc s-au terminat. Algoritmul breada algoritm breada /* citire bloc i citire n avans */ intrri: (1) numrul blocului din sistemul de fiiere pentru citire imediat; (2) numrul blocului din sistemul de fiiere pentru citire asincron; ieire: buffer cu date din citirea imediat; { if (primul bloc nu este n memoria cache); { obine buffer pentru blocul (1) (algoritm getblk); if (datele din buffer nu sunt valide) iniiaz citirea de pe disc; } if (blocul (2) nu este n memoria cache) { obine buffer pentru al doilea bloc (algoritm getblk); if (datele din buffer sunt valide)
5

elibereaz bufferul (algoritm brelse); else iniiaz citirea de pe disc; } if (blocul (1) era iniial n memoria cache) { citete blocul (1) (algoritmul bread); return buffer; } sleep (pn cnd primul buffer alocat conine date valide); return buffer; } Nucleul informeaz driverul de disc c are un buffer al crui coninut ar trebui scris, iar driverul planific blocul pentru operaii de I/O. Dac scrierea este sincron, procesul apelant se pune n ateptare pn la terminarea operaiilor de I/O, iar la trezire elibereaz bufferul. Dac scrierea este asincron, nucleul ncepe scrierea pe disc, dar nu ateapt terminarea acesteia. Nucleul va elibera bufferul la terminarea operaiilor I/O. Algoritmul bwrite algoritm bwrite /* scriere bloc */ intrare: buffer; ieire: niciuna; { iniiaz scrierea pe disc; if (operaiile de I/O sunt sincrone) { sleep (pn la terminarea operaiilor de I/O); elibereaz bufferul (algoritm brelse); } else if (bufferul este marcat pentru scriere ntrziat) marcheaz bufferul s fie pus n capul FLB; }

SUB 4INODURI
Fiecare fisier Unix are un sinur inod. I-nodurile sunt structuri ale sistemului de operare care contininformatii necesare unui proces despre fisierul respectiv, cum ar fi: proprietarul fiserului, drepturile de acces, marimea fisierului si localizarea datelor din fisier in sistemul de fisiere. Procesele acceseaza fisierele cu ajutorul apelurilor sistem(system callc) si a numelui fisierului. Fiecare nume indica un singur fisier, iar kernelui converteste acest numein nr, inode-ului fisierului specificat

Definirea INODE-URILOR Inode-urile exista intr-o forma statica pe disk(disk inode) iar kernelul le citeste intr-un inod din memorie(in-core inode) pentru a le putea manipula(modifica). Disk inode contine urmatoarele campuri: Identificatorul proprietarului fisierului Tipul fiserului: fisierul poate fi de tip regular, director, caracter sau bloc special,FIFO( la pipe) Permisiunile de acces asupra fisierului:sunt de 3 tipuri: pentru proprietar, pentru grup si pentru restul utilizatorilor. Permisiunea de executie la directoare da de fapt dreptul de a cauta un fisier in directorul respectiv; Timpii de acces ai fisierului-cand a fost modificat ultima data, cand a fost accesat ultima data, cand a fost modificat ultima data inodul Numarul de linkuri catre acel fisier-nr de nume de directoare din ierarhia sa Tabela de continut-adresele de pe disk ale datelor din fisier Marimea fisierului

IN-CORE INODE
Copia inode-ului de pe disk in memorie(in-core inode) mai are catevacampuri in plus fata de inode-ul de pe disk : statutul in-core inode-ului : daca inode-ul este blocat (locked); daca un proces asteapta ca inode-ul sa devina liber;
7

reprezentarea in-core inode-ului difera de inode-ul de pe disk datoritaschimbarii datelor din inode; -reprezentarea in-core inode-ului difera de inode-ul de pe disk datoritaschimbarii datelor din fisier; -daca fisierul este un punct de montare (mount point); numarul logic al device-ului; numarul inode -ului; pointeri catre alte in-core inode-uri -folositi pentru urmatorul inode din hash queue sau din free list; reference count -indica numarul de instante ale fisierului care sunt active. INODE-URI Multe campuri din in-core inode sunt asemanatoare cu cele din buffer (cache) header, din aceasta cauza si manipularea inodeurilor este la fel cu cea a buffer-elor. Blocarea unui inode previne celelalte procese ca nu pot accesa inode-ul ,acestea setand un flag prin care arata ca sunt in asteptarea eliberarii inode-ului. Marea diferenta intre in-core inode si buffer (cache) header este in-core reference count-ul,care contorizeaza instantele active ale unui fisier. Un inode este activ cand un proces il aloca,asemenea cu deschiderea unui fisier. Un inode este in free list daca reference count-ul sau este 0 , ceea ce inseamna ca se poate reaaloca in-core inode-ul pentru alt disk inode (alocarea acestui in-core inode o face kernel-ul).

SUB 5ALOCAREA IN-CORE INODE-URILOR--ALG IGET


intrare: numr inod din sistemul de fiiere ieire: inod blocat { while (execuia nu s-a ncheiat) { if (inodul este n cache) { if (inodul este blocat) { sleep (pn la deblocarea inodului); continue; /* salt la while */ } /* execuie special n cazul n care este punct de montare (Capitolul 5) */ if (inodul este n FLI) terge inodul din FLI; incrementeaz contorul de referin al inodului; return (inod); } /* inodul nu este n cache-ul de inoduri (listele hq) */ if (nu este nici un inod n FLI) return (eroare); terge noul inod din FLI; reseteaz numrul inodului i sistemul de fiiere; terge inodul din vechea list hq, plaseaz-l n cea nou; citete inodul de pe disc (algoritm bread); iniializeaz inodul (de exemplu, contorul=1); return (inod); } } ACCESAREA INODE-URILOR Kernelul identifica inode-ul dupa numarul sau si dupa numarul file system-ului si ii aloca un in-core inode la cererea algoritmilor de nivel inalt. Algoritmul iget aloca un in-core inode inode-ului de pe disk;este aproape identic cu algoritmul getblk pentru gasirea unui bloc in buffer cache. Algoritmul iget cauta numarul inode-ului si il cauta in hash queue.Daca nu il gaseste ,aloca un inode din free list si il blocheza . Kernelul gaseste numarul blocului unde se afla inode-ul cu formula: block num = ((inode num. -1)/number of inodes per block)+start block of inode list Offset-ul inode-ului in block se afla cu ajutorul formulei : offset=((inode num. -1) modulo(number of inodes per block))*size of diskinode Kernel-ul manipuleaza independent blocarea inode-ului si reference count-ul. Blocarea care se face pe timpul executarii unui apel sistem este necesara pentru a preveni celelalte procese ca nu pot accesa inodeul. Kernel-ul va elibera inode-ul la sfarsitul apelului sistem.

ELIBERAREA INODE-URILOR ALGORITMUL IPUT


algoritm iput /* elibereaz un inod */ intrri: pointer la un inod din memorie ieiri: niciuna { blocheaz inodul dac nu este deja blocat; decrementeaz contorul de referin; if (contorul de referin == 0) { if (contorul de legturi == 0) { elibereaz blocurile disc ale fiierului (algoritm free); seteaz tipul fiier la 0; elibereaz inod(algoritm ifree); } if (fiierul a fost accesat sau inodul modificat sau fiierul modificat) actualizeaz coninutul inodului disc; pune inodul n FLI; } deblocheaz inodul; } Cand kernel-ul elibereaza un inode ( prin algoritmul iput ) ,decrementeaza reference count-ul din in-core inode-ulcorespunzator . Atunci cand reference count-ul ajunge la 0 , kernel-ul,kernel-ulscrie inode-ul pe disc in cazul in care in-core inode-ul a fostmodificat ( cand datele din fisier au fost modificate , timpiiacessului la fisier au fost modificati , s-a schimbat proprietarulsau permisiunile de acces . Kernel-ul pune apoi inode-ul in lista inode-urilor libere , putandsterge toate datele asociate fisierului in cazul in care numarullink-urilor catre fisier este 0 .

10

SUB 6CONVERSIA NUME FIIER-INODE


Accesul iniial la un fiier se face preciznd numele cii sale (vezi apelurile sistem open, chdir i link). Deoarece nucleul opereaz intern cu inoduri (i nu cu numele cii), pentru a accesa un fiier convertete numele cii sale n inod. Algoritmul namei analizeaz numele cii component cu component, convertind fiecare component pe baza numelui ei i a directorului n care se execut cutarea, i returneaz ventual inodul corespunztor numelui cii dat ca intrare Fiecare proces are asociat un directorul curent, iar zona sa u area conine un pointer ctre inodul directorului curent. Directorul curent al primului proces din sistem (procesul 0) este directorul rdcin. Directorul curent al oricrui alt proces este directorul curent al procesului printe din momentul crerii. Procesele schimb directorul lor curent folosind apelul sistem chdir. Cutarea ncepe din directorul curent dac primul caracter din cale nu este "/", altfel va ncepe din directorul rdcin. n ambele situaii nucleul gsete uor inodul din care ncepe cutarea, deoarece directorul curent se regsete n zona u area a procesului, iar inodul rdcinii sistemului este memorat ntr-o variabil global.
algoritm namei /* convertete nume cale ntr-un inod */

intrare: nume cale ieire: inod blocat { if (numele cii ncepe din rdcin) inod de lucru = inodul rdcin (algoritm iget ); else inod de lucru = inodul directorului curent (algoritm iget ); while (mai sunt componente neparcurse) { citete urmtoarea component din nume cale; verific dac inodul de lucru este al unui director, permisiunile de acces n regul; if (inodul n lucru este al rdcinii i componenta este "..") continue; citete directorul (inodul de lucru) prin folosirea repetat a algoritmilor bmap, bread i brelse; if (componenta se potrivete cu numele unei intrri n director (inodul de lucru)) { citete numrul inodului din intrarea corespunztoare componentei identificate; elibereaz inodul de lucru (algoritm iput ); inodul de lucru = inodul componentei din intrare (algoritm iget); } else /* componenta nu este n director */ return (nici un inod); } return (inodul de lucru); }
11

OBSERVAII LA ALGORITMUL NAMEI Algoritmul namei utilizeaz inoduri intermediare n analiza unui nume de cale, numite inoduri de lucru (working inode). Primul inod de lucru, este cel din care se ncepe cutarea. Pe durata fiecrui ciclu din namei, nucleul se asigur c inodul de lucru este al unui director. Altfel, sistemul ar nclca aseriunea c fiierele care nu sunt directoare pot fi doar noduri frunz n arborele de fiiere. Procesul trebuie s aib i permisiunea de a cuta n director (permisiunea de citire nu este suficient). Pentru aceasta identificatorul utilizator (UID) al procesului trebuie s se potriveasc cu identificatorul proprietarului sau grupului (GID) fiierului, sau fiierul trebuie s permit tuturor utilizatorilor cutarea.Astfel cutarea eueaz.

12

SUB 7 ACCESUL LA INF.FISIERELOR; ALG. BMAP, TABELA DE CUPRINS


Kernel-ul poate minimiza fragmentarea spaiului de memorare prin executarea periodic a unui set de proceduri destinate compactrii spaiului disponibil, ns aceast operaie ar diminueaz din puterea de procesare. Pentru o mai mare flexibilitate, nucleul aloc unui fiier cte un bloc la un moment dat, i elimin necesitatea pstrrii contigue a datelor fiirului, permitnd ca acestea s fie memorate peste tot n sistemul de fiiere. Dar aceast schem de alocare complic sarcina localizrii datelor. Pentru a nu fi nevoie sa se aloce dinamic saptiu pentru tabela de cuprins s-a folosit o gestionare a spatiului prin adresare directa sau prin simpla , dubla sau tripla indirectare BLOCURI DIRECTE SI INDIRECTE

DIMENSIUNEA BLOCURILOR Presupunand c un bloc logic din sistemul de fiiere ocup 1ko i c un numr de bloc este adresabil pe 32 de bii, un bloc poate conine pn la 256 numere de bloc. Dimensiunea maxim a unui fiier poate depi 16 Go prin utilizarea tuturor celor 13 intrri . Intruct cmpul din inod n care se pstrez dimensiunea fiierului are 32 bii, dimensiunea unui fiier este limitat practic la 4 Go (232).
OBTINEREA NUMARULUI BLOCULUI DIN SISTEMUL DE FISIERE PE BAZA DEPLASAMENTULUI Procesele acceseaz datele unui fiier specificnd deplasamentul. Dac utilizatorul vede fiierul ca pe un ir de octei, nucleul l vede ca un ir de blocuri, realiznd o conversie. Fiierul ncepe de la blocul logic 0 i continu pn la un numr de bloc logic corespunztor dimensiunii fiierului. Nucleul acceseaz inodul i convertete numrul de bloc logic n numrul de bloc disc. In continuare vom prezenta algoritmul bmap care determin blocul fizic de disc corespunztor deplasamentului n fiier.

13

ALGORITMUL BMAP alg. bmap input : inode byte offset output : (1) block number in file system (2) byte offset into block (3) bytes of I/O in block (4) read ahead block number { calculate logical block number in file from byte offset ; calculate start byte in block for I/O ; /*output 2*/ calculate number of bytes to copy to user ; /*output 3*/ check if read-ahead applicable , mark inode ; /*output 4*/ determine level of indirection ; while (not at necessary level of indirection) { calculate index into inode or indirect block from logical block number in file ; get disk block number from inode (or indirect block) ; release buffer from previous disk read , if any (alg. brelse) ; if (no more levels of indirection) return (block number) ; /*output 1*/ read indirect disk block (alg. bread) ; adjust logical block number in file according to level of indirection ; } } CONCLUZII ASUPRA ACCESULUI LA FIIERE Accesul la sistemul de fiiere este cu att mai rapid cu ct nucleul acceseaz mai multe date de pe disc n decursul unei operaii, altfel spus, cu ct dimensiunea blocurilor disc este mai mare. Folosirea blocurilor de dimensiuni mari (4 ko, 8 ko) aduce pe lng avantajul creterii vitezei, i un dezavantaj: creterea fragmentrii blocurilor (mari poriuni de spaiu de pe disc nu pot fi utilizate). Implemetarea Berkeley BSD 4.2 remediaz aceasta situaie prin introducerea blocurilor fragment ce conin ultimele date (care nu completeaz un bloc) din diferite fiiere. Aceste blocuri au tot dimensiunea de 4 ko sau 8 ko, dar sunt organizate ca o succesiune antet-date, unde antetul pstreaz informaii referitoare la fiierul cruia i aparine fragmentul de date care-l urmeaz. Pentru a identifica blocul fragment care-i pstreaz partea final, fiierul pstreaz n ultima intrare adresa acestui bloc. Aceast soluie va introduce o ncetineal la accesul ultimului a fragment.

14

SUB 8DIRECTOARELE
Directoarele sunt fiiere care dau sistemului de fiiere o structur ierarhic . Ele joac un rol important n conversia numelui unui fiier ntr-un numr de inod. Un director este un fiier ale crui date sunt o secven de intrri, fiecare fiind alctuit dint-un un numr de inod i numele fiierului coninut n director. Un nume de cale este un ir de caractere terminat cu caracterul null , ale crui componente sunt separate prin caracterul / . Fiecare component, excepie fcnd ultima, trebuie s fie nume de director. System V restricioneaz dimensiunea maxim a unei componente la 14 caractere. dimensiunea unei intrri n director este astfel de 16 octei- 2 pentru numrul inodului, iar restul de 14 pentru numele fiierului coninut n director. STRUCTURA DIRECTORULUI "ETC" Orice director conine fiierele numite "." i "..", ale cror numerede inod sunt cel al directorului curent, respectiv al directoruluiprinte. Numrul de inod al fiierului "." din "/etc" este plasat la deplasamentul 0 n fiier, i are valoarea 83. Numrul inodului pentru ".. este plasat la deplasamentul 16, i are valoarea 2. O intrare n director este neocupat dac numrul de inod este 0. De exemplu, intrarea de la deplasamentul 224 este neocupat, i a coninut o intrare pentru fiierul numit "crash". La iniializarea sistemului de fiiere (folosind programul mkfs) numerele inodurilor fiierelor "." i ".." ale directorului rdcin primesc valoarea inodului rdcin al sistemului de fiiere. Nucleul stocheaz datele pentru un director la fel cum le stocheaz pentru un fiier obinuit, utiliznd structura de inod i nivelele de blocuri directe i blocuri indirecte. DREPTURI DE ACCES IN DIRECTOARE Procesele pot citi directoarele n acelai mod n care citesc fiierele obinuite, dar nucleul i rezerv dreptul exclusiv de a scrie un director, asigurndu-i astfel o structur corect. Permisiunile de acces la un director au urmtoarele semnificaii: - Cea de citire permite unui proces s citeasc un director. - Cea de scriere permite unui proces s modifice coninutul unui director.Se pot crea intrri noi n director sau se pot tearge din celevechi (folosind apelurile sistem creat, mknod, link i nlink). - Cea de execuie permite unui proces s caute un nume de fiier ndirector.

SUB 9SUPERBLOCUL
Superblocul conine urmtoarele cmpuri: dimensiunea sistemului de fiiere; numrul blocurilor libere n sistemul de fiiere; o list a blocurilor libere disponibile n sistemul de fiiere; indexul urmtorului bloc liber din lista blocurilor libere; dimensiunea listei de inoduri; numrul de inoduri libere n sistemul de fiiere; o list cu inoduri libere n sistemul de fiiere; indexul urmtorului inod liber din lista inodurilor libere; cmpuri de blocare pentru lista inodurilor libere i lista blocurilor libere; un bit de semnalizare care indic dac superblocul a fost modificat Periodic, nucleul scrie pe disc superblocul n cazul n care au survenit modificri
15

PROBLEMA

16

SUB 10. ALOCAREA/ELIBERAREA BLOCURILOR DISC; ALG. ALLOC/FREE


Cnd un proces scrie date ntr-un fiier nucleul trebuie s aloce blocuri disc din sistemul de fiiere (folosite ca blocuri directe de date sau ca blocuri de indirectare). Superblocul sistemului de fiiere conine o list n care sunt pstrate numerele de blocuri disc libere din sistemul de fiiere. Programul utilitar mkfs (make file system) organizeaz blocurile de date ale sistemului de fiiere ntr-o list nlnuit, fiecare element fiind un bloc disc care conine o list de numere de blocuri disc libere, i o intrare din aceast list reprezint numrul urmtorului bloc din lista nlanuit. Cnd nucleul intenioneaz s aloce un bloc dintr-un sistem de fiiere aloc urmtorul bloc disponibil din lista aflat n superbloc. Odat alocat, blocul nu poate fi realocat pn cnd el nu devine liber. Dac blocul alocat este ultimul bloc disponibil din superbloc, nucleul l trateaz ca un pointer la un bloc care conine o alt list de blocuri libere. ALOCAREA BLOCURILOR DISC ALGORITMUL ALLOC algoritm alloc /* alocarea unui bloc din sistemul de fiiere */ intrare: numrul sistemului de fiiere ieire: buffer pentru noul blocul { while (superblocul este blocat) sleep (pn superblocul devine liber); terge un bloc din lista liber din superbloc; if (s-a ters ultimul bloc) { blocheaz superblocul; citete blocul care tocmai a fost luat din lista liber (algoritm bread ); copiaz n superbloc numerele de bloc din blocul citit; elibereaz bufferul alocat blocului (algoritm brelse); deblocheaz superblocul; trezete procesele(care ateapt deblocarea superblocului); } obine buffer pentru blocul ters din superbloc(algoritm getblk ); coninutul bufferului este pus cu 0; decrementeaz contorul total al blocurilor libere; marcheaz faptul c superblocul a fost modificat; return buffer; }
17

Algoritmul free pentru eliberarea unui bloc este invers celui de alocare a unui bloc. Dac lista din superbloc nu este plin, numrul blocului eliberat este plasat n list. Dac lista este plin, blocul eliberat devine bloc de legtur, adic nucleul scrie lista din superbloc n bloc, iar blocul pe disc.

18

SUB 11 ALOCAREA UNUI INODE LA UN FIIER NOU


Algoritmul ialloc asigneaz (aloc) un inod disc unui fiier nou creat.Pentru a evita condiiile de concuren, nucleul verific mai nti dacalte procese nu au blocat accesul la lista de inoduri libere dinsuperbloc. Dac lista cu numere de inoduri din superbloc nu este goal, nucleulasigneaz urmtorul numr de inod, aloc un inod liber n memoriaintern pentru inodul disc asignat folosind algoritmul iget (citind inodulde pe disc dac este necesar), copiaz inodul disc n inodul din memoria intern, iniializeaz cmpurile inodului i returneaz inodulblocat. Actualizeaz inodul disc pentru a arta c acum este folosit: ovaloare diferit de zero a cmpului din inod ce conine tipul fiieruluiindic faptul c inodul disc este asignat. Dac lista inodurilor libere din superbloc este goal, nucleul citetebloc cu bloc lista de inoduri de pe disc i umple lista din superbloc cunumere de inoduri libere, memornd totodat cel mai mare numr deinod gsit. Acesta, numit i inod memorat, este ultimul salvat n superbloc. La fiecare asignare a unui inod disc, nucleul decrementeaz contorul cu numrul inodurilor libere aflat n superbloc. ALGORITMUL IALLOC algoritm ialloc /* asigneaz un inod */ intrare: sistemul de fiiere ieire: inod blocat { while (operaia nu s-a ncheiat) { if (superblocul este blocat) { sleep (pn superblocul devine liber); continue; /* salt la while */ } if (lista de inoduri din superbloc este goal) { blocheaz superblocul; determin inodul memorat folosit n cutarea inodurilor libere; caut pe disc inoduri libere pn se umple lista din superbloc sau nu mai sunt inoduri libere (algoritmi bread i brelse ); deblocheaz superblocul; trezete procesele ce ateptau ca superblocul s devin liber; if (nu s-au gsit inoduri libere pe disc) return (nu exist inod); stabilete valoarea inodului memorat pentru urmtoarea cutare de inoduri libere; } /* lista inodurilor din superbloc nu e goal */ obine un numr de inod din lista de inoduri din superbloc; obine inod (algoritm iget); if (inodul nu e liber nici acum) /* a fost alocat altui fiier !!! */ {
19

scrie inodul pe disc; elibereaz inodul (algoritmul iput); continue; /* salt la while */ } /* inodul este liber */ iniializeaz inod; scrie inodul pe disc; decrementeaz contorul inodurilor libere din sistemul de fiiere; return (inod); } } ALGORITMUL IFREE algoritm ifree /* eliberare inod */ intrare: numr inod din sistemul de fiiere iesire: niciuna { incrementeaz contorul inodurilor libere; if (superblocul este blocat) return; if (lista de inoduri este plin) { if (numrul inodului este mai mic dect al inodului memorat) inodul memorat pentru cutare = numr inod de intrare; } else pune numrul inodului n lista inodurilor libere; return; } Apoi, plaseaz numrul blocului nou eliberat n lista din superbloc, el fiind singurul element al listei.

n exemplul din figura 4.20 se prezint o secven de operaii alloc i free asupra listei libere din superbloc care iniial conine un singur numr (109) (vezi figura 4.20 (a)). Nucleul elibereaz blocul numrul 949 i plaseaz numrul acestuia n lista liber (vezi figura 4.20 (b)). Dup aceea, se solicit dou blocuri. Nucleul asigneaz
20

nti blocul numrul 949 (vezi figura 4.20 (c)), dup care aloc i terge blocul numrul 109 din list liber. Deoarece lista liber din superbloc este acum goal, nucleul copiaz n lista din superbloc coninutului blocului 109 (de fapt urmtorul element din lista nlnuit) (vezi figura 4.20 (d)), iar urmtorul bloc de legtur devine blocul 211.

APELURI SISTEM

Acest capitol trateaz apelurilesistem utilizate de sistemul de fiiere folosindu-se algoritmii studiai n capitolulanterior. Sunt prezentate apeluri pentru: accesarea fiierelor existente: open, read, write, lseek, close; crearea de noi fiiere: creat i mknod; modificarea datelor referitoare la inod: chdir, chroot, chown, chmod, stat, fstat; implementarea pipe-urilor: pipe i dup; extinderea sistemului de fiiere vizibil utilizatorului: mount i umount; modificarea ierarhiei sistemului de fiiere: link i unlink.

21

SUB 12APELUL SISTEM OPEN


Apelul sistem open este primul pas ce trebuie efectuat de ctre un proces pentru a putea accesa datele unui fiier. Sintaxa apelului sistem open este: fd = open (nume_cale, flaguri, moduri); unde nume_cale este un nume de fiier, flaguri indic tipul de deschidere (pentruscriere sau citire), iar moduri specific permisiunile de acces n cazul crerii fiierului.Apelul sistem returneaz un ntreg numit descriptor de fiier (fd). Toatecelelalte operaii cu fiierul, cum ar fi citirea, scrierea, poziionarea offsetului fiierului,duplicarea descriptorului de fiier, modificarea parametrilor de I/O ai fiierului,determinarea strii fiierului i nchiderea fiierului, folosesc descriptorul de fiier pecare l returneaz apelul sistem open. Structurile de date dup execuia aplelurilor open. algoritm open intrri: numele fiierului tipul de deschidere permisiuni de acces /* precizate doar la creare */ ieire: descriptorul de fiier { determinarea inodului folosind numele fiierului (algoritm namei); if (fiierul nu exist sau accesul nu este permis) return (eroare); /* uzual -1 */ aloc o intrare n GFT pentru inod, iniializeaz contorul i offsetul; aloc o intrare n UFDT, seteaz pointerul ctre intrarea corespunztoare din GFT; if (tipul de deschidere presupune rescrierea fiierului) elibereaz toate blocurile fiierului (algoritm free); deblocheaz (inodul); /* blocat n namei */ return (descriptorul de fiier); } Nucleul caut fiierul n cadrul sistemului de fiiere folosind algoritmul namei(vezi figura 5.2). Dup ce gsete inodul din memoria intern, se verific permisiunilede acces la fiier, iar dac acestea sunt corespunztoare, se aloc o intrare n GFTpentru fiierul ce este deschis. O intrare n GFT conine: un pointer ctre inodulfiierului deschis, tipul deschiderii fiierului (citire i/sau scriere), deplasamentul(offsetul) de la care nucleul urmeaz s execute urmtoarea citire sau scriere. Nucleuliniializeaz aceast valoare cu 0 pe durata aplelului open, ceea ce nseamn c primacitire sau scriere se va face, implicit, de la nceputul fiierului. De asemenea, un procespoate deschide un fiier pentru adugare, caz n care nucleul va iniializa offsetul cuvaloarea lungimii fiierului. Nucleul aloc o intrare n UFDT, iar valoarea indexului din tabel corespunztor acestei intrri este descriptorul de fiier returnat utilizatorului. Intrarea din UFDTconine un pointer ctre intrarea corespunztoare din GFT.

22

Apelul sistem close


Sintaxa aplelui sistemclose este: close(fd); fd - descriptorul fiierului returnat deopen; modific intrrile din tabela de fiiere i tabela de inoduri corespunztoare descriptoruluifd; intrrile nu sunt terse, ci doar eliberate (cndcontoarele ajung la 0 se invalideaz legturile ntretabele); intrrile pot fi utilizate de acelai fiier (dac seredeschide imediat) sau realocate altui fiier ce va fideschis.

23

SUB 13APELUL SISTEM READ


Sintaxa apelului sistem read este: numr = read(fd, buffer, contor); unde fd este descriptorul de fiier returnat de ctre open, buffer este adresa de memorie din spatiul procesului utilizator care va conine datele n caz de reuit a apelului, contor este numrul de octei pe care utilizatorul dorete s-i citeasc, iar numr este numrul de octei citii n urma apelului. Exemplu: fd1 = open("/etc/passwd", O_RDONLY); fd2 = open("local", O_WRONLY); fd3 = open("/etc/passwd", O_RDWR);

algoritm read
intrri: descriptorul de fiier adresa bufferului din spaiul de memorie al procesului utilizator numrul de octei ce se dorete a fi citit ieire: numrul de octei copiai n spaiul utilizator { gseste intrarea din GFT corespunztoare descriptorului de fiier; verific drepturile de acces la fiier; stabilete parametrii din u area implicai n operaia de I/O; /* adresadin spaiul utilizator, contorul cu numrul de octeti ce trebuie R/W,modul de I/O */ gsete inodul corespunztor din intrii din GFT; blocheaz inodul; stabilete offsetul din u area la valoarea existent n intrarea din GFT while (nu s-a ajuns la numrul dorit de octei citii) { convertete offsetul n fiier n numr de bloc disc ( algoritm bmap); calculeaz offsetul n bloc, numrul de octei ce vor fi citii; if (numrul de octei ce vor fi citii este 0) /* ncercare de a citi sfritul fiierului */ break; /* se iese din ciclu */ citete blocul; /* algoritmul breada sau bread */ copiaz datele din bufferul sistem la adresa din spaiul utilizator; reactualizeaz cmpurile din u area; /* offsetul n fiier, contorul, adresa utilizator */ deblocheaz bufferul; /* blocat n bread */ } deblocheaz inodul; actualizeaz offsetul din GFT pentru urmtoarea operaie de citire; return (numrul total de octei citii); }
24

Apelul sistem write


Sintaxa apelului sistem write este: numr= write(fd, buffer, contor); unde semnificaia variabilelor numr, fd, buffer, contor este cea prezentat n descrierea apelului read. Algoritmul pentru scrierea unui fiier regulat este similar celui de citire. Dac fiierul nu conine un bloc corespunztor offsetului la care trebuie efectuat scrierea, atuncinucleul aloc un nou bloc folosind algoritmul alloc i nscrie numrul blocului n poziiacorespunztoare a tabelei de coninut din inod. Dac offsetul corespunde unui bloc deindirectare, nucleul va trebui s aloce un numr corespunztor de blocuri ce vor fiutilizate ca blocuri de indirectare i blocuri de date. Pe durata operaiei de scriereinodul este blocat, deoarece nucleul poate schimba inodul cnd aloc blocuri noi.Permindu-se altor procese accesul la fiier s-ar putea corupe inodul dac mai multeprocese ar aloca simultan blocuri pentru acelai offset. Dac cmpul din inod ce conine dimensiunea fiierului a fost modificat, la ncheierea operaiei de scrierenucleul l actualizeaz. S presupunem c un proces scrie ntr-un fiier octetul cu numrul 10.240, care este totodat octetul cu cel mai mare numr de ordine. Cnd acceseaz octetul (folosindalgoritmul bmap), nucleul determin c lipsete blocul de date i cel de indirectare corespunztoare acelui octet. Astfel, el aloc un bloc disc ce va fi utilizat ca bloc deindirectare i scrie numrul blocului n inodul din memorie. Apoi, aloc un bloc disc ceva fi utilizat ca bloc de date i scrie numrul blocului n prima poziie a blocului deindirectare anterior alocat. Scrierea se face ntru-un ciclu intern, asemntor algoritmului read. Pe durata unei iteraii nucleul va scrie un singur bloc disc. n acest sens, va determina dac va scrienteg blocul sau numai o parte din el. Dac scie doar o parte, va trebui mai nti sciteasc blocul de pe disc, pentru a conserva datele ce nu se vor modifica. Citirea numai este necesar n cazul scrierii ntregului bloc, deoarece se va modifica totconinutul su. Nucleul utilizeaz scrierea ntrziat a blocurilor pe disc (delayed write, vezi 3.4), pstrndu-le n cache ct mai mult timp posibil, pentru a oferi i altorprocese posibilitatea de a le scrie sau citi fr a mai executa operaii de I/O cu discul. Folosirea scrierii ntrziate este util n cazul pipes-urilor deoarece un alt proces va citi datele i le va terge (vezi 5.12), i chiar n cazul fiierelor regulate ce suntcreate temporar. De exemplu, multe programe cum ar fi cele de pot electronic,editoarele de texte, creaz fiiere temporare n directorul /temp, pe care le tergdup puin timp. Utilizarea scrierii ntrziate, poate reduce numrul de scrieri pe discpentru fiierele temporare.

25

SUB 14SINTAXA APELULUI SISTEM LSEEK


poziie= lseek(fd, offset, referin); fd - descriptorul de fiier (returnat de open); referin - indic originea fa de care se stabilete deplasamentul; offset - un numr care indic poziia final a deplasamentului fa de referin; poziie- deplasamentul de la care va ncepe urmtoarea operaie de citire/scriere. Pentru a implementa apelul lseek nucleul modific practic valoareadeplasamentului din tabela de fiiere; Apelul lseeknu are nimic de a face cu operaiaseekcare efectueazpoziionarea braului discului pe un anumit sector.
Apelurile read i write descrise anterior asigur un acces secvenial la un fiier. Prinutilizarea apelului sistem lseek procesele pot modifica valoarea offsetului din GFT,asigurndu-se astfel un acces aleator la fiier, utilizatorul avnd posibilitatea s scriesau s citeasc de la orice offset.

SUB 15APELUL SISTEM CREAT


Sintaxa apelului sistem creat : fd = creat (nume_cale, moduri); nume_cale - un nume de fiier; moduri - permisiunile de acces; fd un intreg numit descriptor de fisier. Dac nu exist nici un fiier cu numele specificat, atunci nucleul creaz unnou fiier cu numele i permisiunile de acces (modurile) precizate; Dac fiierul exist deja, i permisiunile de acces sunt corespunztoare,nucleul trunchiaz fiierul (elibereaz toate blocurile sale i seteazdimensiunea fiierului la 0). algoritm creat intrri: numele fiierului permisiunile de acces ieire: descriptorul de fiier { determin inodul pentru fiier (algoritm namei); if (fiierul deja exist) { if (accesul nu este permis) { inodul (algoritmul iput); return (eroare); } } else /* fiierul nu exist nc */ { asigneaz un inod liber din sistemul de fiiere (algoritm ialloc); creaz o nou intrare n directorul tat n care se nscriu numelenoului fiier i numrul inodului aneterior asignat; } aloc o intrare n GFT pentru inod, iniializeaz contorul;
26

if (fiierul exista n momentul creerii) elibereaz toate blocurile fiierului (de date i de indirectare) (algoritmul free); deblocheaz inodul; return (descriptorul de fiier); } Dac fiierul deja exista naintea apelului creat, nucleul gsete inodul su ntimp ce caut fiierul. Vechiul fiier trebuie s ofere permisiunea de scriere procesuluice dorete s creeze un nou fiier cu acelai nume, deoarece coninutul fiierului vafi modificat (se elibereaz toate blocurile fiierului, acesta artnd ca un fiier noucreat). ntruct coninutul directorului tat nu va fi modificat, nucleul nu va maiverifica dac este permis scrierea directorului.

SUB 16APELUL SISTEM MKNOD


Sintaxa apelului sistem mknod mknod (nume_cale, tip i permisiuni, dev)unde nume_cale - numele nodului care va fi creat; tip i permisiuni - tipul nodului (de exemplu director) i permisiunilede acces pentru noul fiier ce va fi creat; dev - numerele major i minor ale dispozitivului pentru fiierelespeciale bloc i caracter dac fiierul nu exist, nucleul asigneaz un nou inod pe disc i scrienumele noului fiier i numrul inodului alocat n directorul printe; Iniializeaz cmpul din inod care specific tipul fiierului; Dac fiierul este de tip dispozitiv special caracter sau bloc, atunci sescriu n inod numerele major i minor de dispozitiv. algoritm make new node intrri: numele fiierului tipul fiierului permisiunile de acces numr major i minor al dispozitivului (pentru fiierele speciale bloc icaracter) ieire: niciuna { if (noul nod nu este pipe numit i utilizatorul nu este super user ) return(eroare); determin inodul tatlui noului nod (algoritmul namei); if (noul nod deja exist) { elibereaz inodul tatlui (algoritmul iput); return (eroare); } aloc un nod liber din sistemul de fiiere pentru noul nod (algoritmul ialloc); creaz o nou intrare n directorul tat i o completeaz cu numele nodului i numrul de inod anterior asignat; elibereaz inodul directorului tat (algoritmul iput);
27

if (noul nod este fiier special bloc sau caracter) scrie numrul major i minor al dispozitivului n structura inodului; elibereaz inodul noului nod (algoritmul iput); } Nucleul caut n sistemul de fiierefiierul cu numele ce urmeaz s fie creat. Dac fiierul nu exist nc, nucleul alocun nou inod pe disc i scrie nume noului fiier i numrul inodului alocat n directorultat. Iniializeaz cmpul din inod care specific tipul fiierului (pipe, director sau fiierspecial). Dac fiierul este de tip dispozitiv special caracter sau bloc, atunci se scriu ninod numerele major i minor de dispozitiv. Algoritmul prezentat mai trebuiecompletat n cazul crerii directoarelor, deoarece nu sunt create i iniializate intrriledirector pentru . i ...

SUB 17APELURI SIST PT PIPE-URI ANONIME;ALG PIPE


- sunt

fiiere de tip FIFO; - permit transferul de date ntre procese, ct i incronizarea execuiei proceselor; - exist dou tipuri de pipe-uri: pipe-uri numite si pipe-uri nenumite (anonime). - cele nenumite sunt create cu apelul sistem pipe i nu pot fi folosite ncomun dect de procesele descendente din procesul ce a creat pipe-ul. - cele numite ocup un loc n ierarhia sistemului de fiiere, se deschidca orice fiier (folosind aplelul sistem open) i pot fi folosite ncomun deprocese n funcie de permisiunile lor de acces la fiier Sintaxa apelului pipe pipe (fdptr) ; unde fdptr este un pointer ctre un ir de doi ntregi ce va coninedescriptorii de fiier pentru citirea i scrierea pipe-ului . Deoarece nucleul implementeaz pipe-urile nsistemul de fiiere, acestea neexistnd naintea utilizrii lor, nucleul va asigna un inodi va aloca doi descriptori n UFDT (un descriptor pentru citirea din pipe i altul pentruscrierea n pipe) i intrrile corespunztoare n GFT. Utilizarea GFT face ca interfaaapelurilor sistem de scriere, citire a pipe-urilor s fie aceeai cu cea pentru fiiereleregulate. Astfel, procesele nu trebuie s tie dac citesc/scriu un pipe sau un fiierregulat.

Algoritmul de creare a unui pipe nenumit:


intrare: nici una ieiri: descriptorul pentru citire descriptorul pentru scriere{ Asigneaza un nou inod din dispozitivul pentru pipe (algoritmul ialloc); aloca 2 intrari n tabela de fiiere (una pentru citire, una pentru scriere,care vor pointa catre inodul anterior asignat); aloca 2 descriptori de fiier (unul pentru scriere, unul pentru citire) i initializeaz pointerii catre intrarile corespunzatoare din tabela de fiiere; valoarea contorului de referint corespunzator inodului este stabilit 2 ;}
28

SUB 18APELUL SISTEM DUP


Apelul sistem dup copiaz un descriptor de fiier n primul slot (intrare) liber din UFDT, returnnd utilizatorului noul descriptor. Apelul poate fi folosit pentru toate tipurile defiiere. Este utilizat n construcia programelor complexe pornind de la programe maisimple Sintaxa apelului este: fd_nou = dup(fd); fd este descriptorul de fiier care va fi duplicat; fd_nou este noul descriptor care va referi fiierul; Mod de execuie: Contorul intrrii din tabela de fiiere corespunztoare lui fd va fiincrementat, deoarece i intrarea din tabela descriptorilor de fiierutilizator a lui fd_nou va pointa ctre aceeai intrare n tabela de fiiere.

29

SUB 19STRI I TRANZIII


Timpul de via al unui proces poate fi conceptual divizat ntr-un set de stri care descriu procesul : 1. Procesul este n execuie n modul utilizator. 2. Procesul este n execuie n modul nucleu. 3. Procesul nu este n execuie dar este gata pentru execuie ndat ce nucleul l planific. 4. Procesul este n ateptare i se gsete n memoria principal. 5. Procesul este gata de execuie, dar ncrctorul ( procesul 0) trebuie s ncarce procesul n memoria principal nainte ca nucleul s-l poat planifica pentru execuie. 6. Procesul este n ateptare i ncrctorul a transferat procesul la un dispozitiv de memorare secundar fcnd loc pentru alte procese n memoria principal. 7. Procesul se ntoarce din modul nucleu n modul utilizator, dar nucleul l ntrerupe i face o comutare de context pentru a planifica alt proces. Diferena ntre aceast stare i starea 3 (ready to run) va fi descris ulterior. 8. Procesul este de curnd creat i se afl ntr-o stare de tranziie; procesul exist dar nu este gata de execuie i nici n ateptare. Aceasta este o stare de nceput pentru toate procesele, cu excepia procesului 0. 9. Procesul a executat apelul sistem exit i este n starea zombie. Procesul nu va mai exista mult, dar el las o nregistrare ce conine codul de ieire i cteva statistici de timp pentru a fi folosite de procesul printe. Starea zombie reprezint o stare final a procesului. Diagrama completa a starilor unui process

30

SUB 20STRUCTURI DE DATE ALE PROCESELOR


Dou structuri de date ale nucleului descriu starea unui proces: process table entryi u area. Tabela de procese conine cmpuri care trebuie s fie ntotdeauna accesibile nucleului, dar u area conine cmpuri care trebuie s fie accesibile numai la execuia procesului. Cmpurile din tabela de procese(PT)sunt urmtoarele: Cmpul de stare care identific starea procesului. Intrarea n tabela de procese conine cmpuri care permit nucleului s localizeze procesul i zona sa uarea n memoria principal sau pe un dispozitiv extern. Intrarea n tabela de procese conine deasemenea un cmp care d mrimea procesului, astfel nct nucleul tie ct spaiu trebuie s aloce procesului. Mai muli identificatori ai utilizatorului(utilizatorIDsauUID) determin diferite drepturi pentru proces. Identificatorii procesului (proces ID sau PID) specific relaia dintre procese. Aceste cmpuri ID sunt setate cnd procesul intr n starea creare proces n urma apelului sistem fork. Intrarea n tabela de procese conine un descriptor de evenimente cnd procesul este nstarea ateptare. Parametri de planificare permit nucleului s determine ordinea n care procesele trec n strile execuie n modul nucleu i n starea execuie n modul utilizator. Cmpul semnal reine semnalele trimise procesului dar care nu sunt nc tratate Diferite contoare de timp dau timpul de execuie al procesului i utilizarea resurselor nucleului, timpi folosii pentru contabilizarea procesului i pentru calcularea prioritii de planificare a procesului. Cmpul contor de timp setat de utilizator este folosit pentru a transmite un semnal de alarm unui proces. U area conine urmtoarele cmpuri ce caracterizeaz strile procesului: Un pointer spre tabela de procese-intrarea ce corespunde zonei uarea Identificatorii de utilizator real i efectiv determin diferite privilegii premise procesului cum ar fi drepturile de acces la fiier Cmpurile contor de timp nregistreaz timpul pe care procesul (i descendenii lui) l consum n execuie n modul utilizator i n modul nucleu. O zon de reacie la semnale indic cum dorete procesul s reacioneze la semnale. Un camp de eroare nregistreaz erorile ntlnite n timpul apelului sistem. Un camp valoare de revenire conine rezultatul apelurilor sistem. Parametrii I/O descriu cantitatea de date transferate, adresa zonei de date surs (int) din spaiul utilizatorului, deplasamentul n fiier i altele. Directorul curent i rdcina curent descriu sistemul de fiiere n care se afl procesul. Tabela descriptorilor de fiiere utilizator (UFDT) nregistreaz fiierele pe care procesul le-a deschis. Cmpurile de limitare restricioneaz mrimea procesuluii dimensiunea unui fiier pe are l poate scrie. Cmpul permisiunilor de acces-permisiunile de acces stabilite pentru fiierele create de proces.

31

SUB 21PLASAREA N MEMORIE A PROCESELOR


Memoria fizic a mainii este adresabil ncepnd de la octetul cu deplasamentul 0 i mergnd pn la un deplasament egal cu cantitatea de memorie a mainii. Procesele n sistemul UNIX sunt formate din trei seciuni logice: text, date i stiv. Seciunea de text conine un set de instruciuni executate de main; adresele din seciunea de text includ adresele codului n cazul instruciunilor de ramificare (sau apel de subrutine), adresele de date (pentru accesul la variabilele de date globale) sau adresele de stiv (pentru accesul la structurile de date locale ale subrutinelor) Compilatorul genereaz adrese pentru un spaiu virtual de adrese cu un domeniu de adrese, iar unitatea de gestiune a memoriei mainii translateaz adresele virtuale generate de compilator n adrese de locaii n memoria fizic. Toate procesele se vor executa folosind aceleai adrese virtuale, dar vor referi diferite adrese fizice. Subsistemele nucleului i hardware-ul ce coopereaz la translatarea adresei virtuale n adres fizic formeaz sistemul de gestiune a memoriei. Nucleul mparte spaiul virtual de adrese al procesului n regiuni logice. O regiune este o zon contigu a spaiului virtual de adrese al procesului care poate fi tratat ca un obiect distinct i poate fi partajat sau protejat. Astfel textul, datele i stiva, de obicei formeaz regiuni separate ale procesului. Mai multe procese pot folosi n comun aceeai regiune. Nucleul conine o tabel a regiunilor i aloc cte o intrare din tabel pentru fiecare regiune activ n sistem. In mod analog fiecare proces conine o tabel privat de regiuni per process (per process region table), numit pe scurt pregion. Intrrile acesteia pot exista n tabela de procese, u area sau ntr-o zon de memorie alocat separat depinznd de implementare. Fiecare intrare a tabelei private de regiuni pointeaz ctre o intrare a tabelei globale de regiuni i conine adresa virtual de start a regiunii n proces. Intrarea tabelei private de regiuni mai conine cmpul permisiunilor ce indic tipul de acces permis procesului: numai citire, citire-scriere sau citire-execuie. Fiecare proces acceseaz regiunea printr-o intrare proprie n tabela privat de regiuni la fel cum acceseaz inodul printr-o intrare proprie n tabela descriptorilor de fiiere a utilizatorului i n tabela de fiiere din nucleu. Conceptul de regiune este independent de politicile de gestiune a memoriei implementate de sistemul de operare. Politica de gestiune a memoriei se refer la aciunile nucleului ce asigur mprirea corect a memoriei principale de ctre procese. De exemplu, dou politici de gestiune a memoriei sunt: swapping-ul i paginarea la cerere. Conceptul de regiune este deasemenea independent de implementarea gestiunii memoriei:dac memoria este mprit n pagini sau segmente.

32

SUB 22PLASAREA N MEMORIE A NUCLEULUI


Nucleul se execut n contextul unui proces, nsa translatarea memoriei virtual asociat nucleului este independent de toate procesele. Codul i datele pentru nucleu rezid permanent n sistem, i toate procesele l partajeaz. Cnd sistemul este pus la lucru (la ncrcare), el ncarc codul nucleului n memorie i seteaz tabelele necesare i regitrii pentru maparea adreselor lui virtuale n adrese fizice de memorie. Tabelele de pagini ale nucleului sunt analoage cu tabelele de pagini asociate fiecrui proces, iar mecanismele folosite la maparea adreselor virtuale ale nucleului sunt similare cu cele folosite pentru adresele utilizator. Cnd execuia este n modul nucleu, sistemul permite accesul la adresele nucleului, dar nterzice un astfel de acces cnd execuia este n modul utilizator.

33

SUB 23CONTEXTUL PROCESELOR


Contextul procesului reprezint coninutul spaiului su de adrese (al utilizatorului), coninutul regitrilor hardware i structurile de date ale nucleului care au legtur cu procesul. Formal, contextul procesului este format din contextul de nivel utilizator (userlevel context), contextul registru (register context), i contextul de nivel sistem (systemlevel context). Contextul de nivel utilizator cuprinde zonele de text, date, stiv utilizator i memorie partajat care ocup spaiul virtual de adrese al procesului. Contextul registru cuprinde urmtoarele componente. Numrtorul de program specific adresa instruciunii urmtoare pe care o va executa UCP; aceasta este o adres virtual n nucleu sau n spaiul de memorie al utilizatorului. Registrul de stare al procesorului (PS) specific starea hardware a mainii pe care ruleaz procesul. Pointerul stivei conine adresa curent a urmtoarei intrri n stiva nucleu sau n stiva utilizator, determinat de modul de execuie. Regitrii generali conin date generate de proces n timpul execuiei. Pentru a simplifica discuia, s difereniem doi regitri generali, registrul 0 i 1, folosii pentru transmiterea informaiilor ntre proces i nucleu. Contextul de nivel sistem al procesului are o parte static i o parte dinamic. Procesul are o parte static a contextului de nivel sistem pe toat durata existenei sale, dar poate avea un numr variabil de pri dinamice. Partea dinamic a contextului de nivel sistem trebuie s fie vzut ca o stiv de cadre context pe care nucleul le introduce i le extrage la apariia diferitelor evenimente. Partea static conine urmtoarele componente. Intrarea procesului n tabela de procese definete starea procesului i conine informaii de control care sunt permanent accesibile nucleului. Zona u area a procesorului conine informaii de control care trebuie s fie accesate numai n contextul procesului. Intrrile tabelei private de regiuni, tabelele de regiuni i tabelele de pagini, definesc maparea adreselor virtuale n adrese fizice i deci definesc regiunile de text, date i stiv precum i alte regiuni ale procesului. Dac unele procese partajeaz regiuni comune, regiunile sunt considerate pri ale contextului fiecrui proces, pentru c fiecare proces manipuleaz regiunile independent. Partea dinamic conine urmtoarele componente: Stiva nucleului conine cadrele de stiv ale procedurilor nucleului cnd un proces se execut n modul kernel. Dei procesele execut un cod nucleu identic, ele au copii proprii ale stivei nucleului ce specific apelurile proprii ale funciilor nucleului. De exemplu, un proces poate invoc apelul sistem creat i apoi trece n ateptare pn cnd nucleul i asigneaz un nou inod, iar alt proces poate invoca apelul sistem read i trece n ateptare pn cnd se va face transferul de date de pe disc n memorie. Ambele procese execut funcii nucleu, dar ele au stive separate ce conin propriile secvene de apeluri de funcii. Un set de cadre, vizualizate ca o stiv LIFO (last-in-first-out). Fiecare cadru al contextului de nivel sistem conine informaiile necesare pentru refacerea cadrului precedent, ncluznd contextul registru al nivelului precedent. Descrierea contextului unui proces:

34

n partea stng a figurii din urmatoare este prezentat partea static a procesului. Aceasta conine contextul de nivel utilizator, care conine zona de text a procesului (instruciunile), zona de date, zona de stiv i zona de memorie partajat (dac exist), i partea static a contextului de nivel sistem, care conine intrarea n tabela proceselor, zona u area, i intrrile tabelei private de regiuni(informaii de mapare a adreselor virtuale ale contextului de nivel utilizator). Partea dreapt a figurii prezint partea dinamic a contextului. Aceasta conine cteva cadre de stiv, iar n fiecare cadru este salvat contextul registru al cadrului anterior i stiva nucleu a aceluiai cadru. Cadrul 0 al contextului de nivel sistem este o copie a contextului de nivel utilizator; creterea stivei se face aici n spaiul de adres al utilizatorului, i stiva nucleu este nul. Sgeata pointeaz de la partea static a contextului de nivel sistem ctr cadrul din vrful prii dinamice a contextului reprezentnd informaii logice stocate n intrarea din tabela de procese pentru a da posibilitatea nucleului s refac cadrul context curent al procesului.

Observaii: Un proces ruleaz n cadrul contextului su curent. Numrul de cadre context este limitat de numrul de nivele de ntrerupere suportat de main. De exemplu, dac o main suport diferite nivele de ntrerupere pentru ntreruperile software, terminale, discuri, toate celelalte periferice, i ceas, ea suport 5 nivele de ntrerupere, i deci, procesul poate conine maxim 7 cadre context: cte unul pentru fiecare nivel de ntrerupere, unul pentru apelurile sistem, i unul pentru nivelul utilizator. Dei nucleul se execut permanent n contextul unui proces, funcia logic pe care o execut nu este n mod necesar legat de proces. De exemplu, dac un driver de disc ntrerupe maina pentru c returneaz date, el ntrerupe rularea procesului iar nucleul execut rutina de tratare a ntreruperii ntr-un nou cadru context de nivel sistem al procesului aflat n execuie, chiar dac datele aparin unui alt proces. Rutinele de tratare ntreruperilor n general nu acceseaz sau modific prile statice ale contextului procesului, att timp ct aceste pri nu au legtur cu ntreruperea.
35

SUB 24SALVAREA CONTEXTULUI-SCHIMBARE DE CONTEXT


Nucleul salveaz contextul unui proces ori de cte ori el introduce n stiv un nou cadru context de nivel sistem. n particular, aceasta se ntmpl cnd sistemul recepioneaz o intrerupere, cnd execut un apel sistem, sau cnd nucleul face o schimbare de context. Sistemul rspunde de tratarea ntreruperilor, indiferent dac ele sunt ntreruperi hardware (cum ar fi de la ceas sau de la dispozitivele periferice), ntreruperi programabile (execuia instruciunilor proiectate pentru a genera ntreruperi software), sau excepii (cum ar fi erori de pagin). Dac UCP lucreaz la un nivel de execuie procesor mai sczut dect nivelul ntreruperii, el accept ntreruperea naintea decodificrii instruciunii urmtoare i ridic nivelul de execuie al procesorului, astfel nct nici o alt ntrerupere a acelui nivel (sau mai sczut) nu se poate produce ct timp trateaz ntreruperea curent pstrnd integritatea structurilor de date ale nucleului. Tratarea ntreruperilor Nucleul trateaz ntreruperea cu urmtoarea secven de operaii: 1. Salveaz contextul registru curent al procesului n execuie i creeaz (introduce n stiv) un nou cadru context. 2. Determin sursa sau cauza ntreruperii, identific tipul ntreruperii (de ceas sau de disc) i numrul unitii care a produs ntreruperea, dac este cazul(cum ar fi driverul de disc). Cnd sistemul recepioneaz o ntrerupere, aceasta primete un numr de la main pe care l folosete ca deplasament ntr-o tabel, numit de obicei vector de ntrerupere. De obicei conine adresa rutinei de tratare a ntreruperii corespunztoare sursei de ntrerupere i calea de gsire a parametrilor pentru rutin. 3. Nucleul invoc rutina de tratare a ntreruperii. Stiva nucleu pentru noul cadru context este din punct de vedere logic distinct de stiva nucleu pentru cadrul context anterior. 4. Dup terminarea execuiei rutinei de tratare a ntreruperii se reia execuia proceslui curent. Nucleul execut o secven de instruciuni specifice mainii i reface context registrul i stiva nucleu a cadrului context anterior aa cum erau n momentul apariiei ntreruperii i apoi reia execuia cadrului restaurat. Schimbarea contextului Nucleul permite o schimbare a contextului doar n patru situaii: 1. cnd un proces se pune singur n ateptare, 2. cnd acesta se termin, 3. cnd revine dintr-un apel sistem n modul utilizator dar nu este procesul cel mai potrivit pentru execuie, 4. cnd acesta revine n modul utilizator dup ce nucleul termin tratarea unei ntreruperi dar nu este cel mai potrivit proces pentru execuie. Nucleul asigur integritatea i consistena structurilor de date interne prin interzicerea schimbrilor de context arbitrare. Acesta se asigur c starea structurilor sale de date este consistent nainte de a realiza schimbarea contextului: dac toate actualizrile au fost fcute, dac toate listele sunt nlnuite corect, dac anumite structuri de date sunt blocate pentru a mpiedica accesarea lor de ctre alte procese, dac nu exist structuri de date rmase blocate cnd nu este necesar, i altele.
36

Situaii de schimbare a contextului Nucleul trebuie s execute o schimbare a contextului la terminarea apelului sistem exit, deoarece nu mai are nimic de fcut. n mod similar nucleul permite o schimbare de context cnd un proces se pune n ateptare deoarece poate trece o perioad considerabil de timp pn cnd procesul va fi trezit, i alte procese pot fi executate ntre timp. Nucleul permite o schimbare de context cnd un proces nu este cel mai potrivit pentru a fi rulat, pentru a permite planificarea proceselor adecvate: dac un proces termin un apel sistem sau revine dintr-o ntrerupere i exist un alt proces cu prioritate mai mare care ateapt s ruleze, ar fi incorect s meninem n ateptare procesul cu prioritate mai mare. Pasi in schimabarea contextului 1. Decide dac se face schimbarea de context i dac schimbarea de context este permis acum. 2. Salveaz contextul vechiului proces. 3. Gsete cel mai bun peoces pentru planificarea la execuie. 4. Reface contextul acestuia. Pseudocodul schimbarii contextului if(salveaza_contex()) /*salvarea contextului procesului executie*/ { /*allege un alt process pentru executie*/ reface_context(noul_proces); /*nu este gasit nimic aici*/ }/*reia executia procesului de aici* / Observaii Nucleul n multe implementri, salveaz contextul ntr-un punct al proceslui curent, dar continu s execute schimbarea de context i algoritmii de planificare n contextul vechiului proces. Cnd el mai trziu reface contextul procesului, reiaexecuia n conformitate cu contextul salvat anterior. Pentru a diferenia cazul n care nucleul reface contextul noului proces de cazul n care el continu execuia n vechiul context dup ce l-a salvat, valorile de revenire a funciilor critice variaz, sau numrtorul de program poate fi setat artificial. Salvarea contextului la ntoarcerile forate Situaiile apar cnd nucleul trebuie s ias forat din secvena curent de execuie i s prseasc imediat un context salvat anterior. Algoritmul de salvare a contextului se numete setjmp i algoritmul de refacere a contextului este longjmp. Metoda este identic cu cea descris pentru funcia salvare-context, cu excepia faptului c salvare-context adaug un nou cadru context, pe cnd setjmp memoreaz contextul salvat n u area i continu s execute vechiul strat context. Cnd nucleul dorete s reia vechiul context salvat cu setjmp, el apeleaz longjmp, restaurnd contextul din zona u area i returnnd 1 pentru setjmp.

37

SUB25CREAREA PROCESELOR FORK


Singurul mod prin care un utilizator poate crea un nou proces n UNIX estefolosirea apelului sistem fork. Procesul care apeleaz fork este numit proces printe(parent), iar noul proces creat este numit proces fiu (child). Sintaxa pentru apelulsistem fork este: pid=fork(); La revenirea din apelul sistem fork, dou procese au copii identice ale contextului lanivel utilizator, excepie fcnd valoarea de retur a pid-ului. n procesul printe, pid-ulare valoarea identificatorului procesului fiu; n procesul fiu, pid-ul are valoarea zero.Procesul 0, creat intern de ctre kernel cnd sistemul este iniializat este singurulproces care nu este creat prin intermediul apelului sistem fork. Nucleul execut urmtoarea secven de operaii la apelul sistem fork: 1. Aloc o intrare n tabela de procese penrtru noul proces. 2. Atribuie un identificator unic procesului fiu. 3. Face o copie logic a contextului procesului printe. 4. Incrementez contorii tabelei de inoduri i tabelei de fiiereasociate procesului. 5. ntoarce n procesul printe numrul identificatoruluiatribuit procesului fiu i valoarea zero n procesul fiu. algoritm fork intrri: niciuna ieiri: la procesul printe, identificatorul procesul fiu (PID) la procesul fiu, 0 { verific resursele disponibile ale nucleului; obine o intrare liber n tabela de procese i un numr unic pentruPID; verific ca utilizatorul s nu ruleze prea multe procese; marcheaz starea procesului ca "n curs de creare"; copiaz datele din intrarea n tabela de procese corespunztoareprocesului printe n noua intrare a pocesul fiu; incrementeaz contorul inodului directorului curent i al rdciniischimbate(dac este necesar); incrementeaz contoarele fiierelor deschise n tabela de fiiere; face o copie a contextului procesului printe (u area, text, date,stiv)n memorie; depune o copie fidel a contextului de nivel sistem n contextulde nivel sistem al fiului; contextul conine date care permit procesului fiu s se recunoascsingur i s nceap s ruleze de aici atunci cnd este planificat; if (procesul n execuie este procesul printe) { schimb starea procesului n "gata de execuie"; /* dinspre sistem ctre utilizator */ return(idetificatorul procesului fiu); } else /* procesul care se execut este procesul fiu */ { iniializeaz cmpurile de timp ale zonei u area; return (0); /*ctre utilizator*/ } }
38

39

SUB 26COMUNICAREA INTRE PROCESE PRIN PIPE, DUP,FORK


Execuia fiecrui apel sistem pipealoc n plus 2 descriptori de fiiere n irurile to_par i to_child. Procesul execut forki face o copie a contextului su: fiecare proces poate accesa datele proprii, ca nexemplul anterior. Procesul printe nchide fiierul su standard de ieire (descriptorulde fiier 1) i duplic (dup) descriptorul de scriere ntors de pipe pentru to_child. Deoarece primul slot liber din UFDT-ul printelui este chiar acela eliberat prin apelulsistem close, nucleul copiaz descriptorul de scriere rezultat n urma executriiapelului sistem pipe n slotul 1 al UFDT-lui i astfel descriptorul fiierului standard deieire devine descriptorul de scriere al pipe-lui pentru to_child. Procesul printe faceoperaii similare astfel nct descriptorul intrrii standard s devin descriptorul decitire al pipe-lui pentru to_par. Analog, procesul fiu i nchide fiierul standard deieire (descriptor 0) i duplic descriptorul de citire al pipe-lui pentru to_child. ntructprimul slot liber n UFDT este slotul fostuului fiier standard de intare, intrarea standard a fiului devine descriptorul de citire al pipe-lui pentru to_child. Fiul faceoperaii similare astfel nct descriptorul ieirii standard s devin descriptorul de Scriere al pipe-lui pentru to_par. Ambele procese nchid descriptorii de fiiere ntori deapelarea lui pipe ( o bun metod de programare ). Ca rezultat, cnd printele scriela ieirea standard, acesta scrie n pipeul to_child i trimite date procesului fiu, carecitete pipe-ul ca pe propria intrare standard. Cnd procesul fiu scrie la ieireastandard, acesta scrie n pipe-ul to_par i trimite datele procesului printe care citetepipe-ul ca pe propria intrare standard. Procesele astfel schimb mesaje prin intermediul pipe-urilor. Similar, nu este nici o diferen fa deordinea relativ n care procesele i esxecut apelurile sistem pn cnd acestea intrn ciclu: structurile nucleului sunt identice. Dac procesul fiu execut apelul sistemread nainte ca procesul printe s fac write, procesul fiu va intra n ateptare pncnd procesul printe scrie pipe-ul i este trezit. Dac procesul printe scrie pipeulnainte ca procesul fiu s citeasc pipe-ul, printele nu va citi de la intrarea sa standard pn cnd fiul nu de la citete intrarea sa standard i nu scrie la ieirea sastandard. Din acest motiv, ordinea de execuie este fixat: fiecare proces termin unapel sistem read i write i nu poate termina urmtorul apel sistem read pn cndcellalt proces nu termin un apel sistem read i write.

40

SUB 27GESTIUNEA SEMNALELOR


Semnalele informeaz procesele despre apariia evenimentelor asincrone. Procesele i pot trimite semnale prin intermediul apelului sistem kill, sau nucleul poate trimiteintern semnale. Exist 19 semnale n versiunea de UNIX System V (Release 2) carepot fi clasificate dup cum urmeaz : 1. Semnale pentru terminarea proceselor, transmise atunci cnd un proces execut apelul sistem exit sau cnd un proces execut apelul sistem signal cu parametrul "terminare fiu"; 2. Semnale de atenionare n cazul excepiilor produse de procese, de exemplu cnd un proces acceseaz o adres n afara spaiului lor virtual de adrese, cnd un proces ncearc s scrie n zonele de memorie protejate la scriere (cum ar fi codul programului), cnd execut o instruciune privilegiat, sau pentru diferite erori hardware; 3. Semnale pentru situaii fr ieire aprute n timpul apelurilor sistem, cum ar fi lipsa resurselor n timpul execuiei apelului sistem exec dup ce spaiul iniial de adrese fusese eliberat 4. Semnale determinate de condiii de eroare neateptate aprute n timpul unui apel sistem; 5. Semnale provenite de la procesele n modul utilizator, de exemplu cnd un proces dorete s recepioneze un semnal alarm dup un anumit timp, sau cnd procesele trimit unul altuia semnale n mod arbitrar, prin intermediul apelului sistem kill; 6. Semnale provenite de la interaciunea cu un terminal, atunci cnd un utilizator ntrerupe un terminal, sau cnd un utilizator apas tastele "break" sau "delete"; 7. Semanale de urmrire a execuiei unui proces.

41

Tratarea semnalelor este diferit dup cum nucleul trimite un semnal unui proces, cum trateaz procesul un semnal i cum un proces i controleaz reacia la apariia unuisemnal. Pentru a trimte un semnal unui proces, nucleul seteaz un bit n cmpul signaldin intrarea tabelei proceselor, corespunztor tipului semnalului recepionat. Tratarea semnalelor. Nucleul trateaz semnalele n contextul procesului care le recepioneaz, deci un proces trebuie s ruleze pentru a putea trata semnalele. Exist trei cazuri n tratarea semnalelor: procesul apeleaz exit la recepionarea semnalului, acesta ignor semnalul, sau execut o funcie particular (definit de utilizator). Aciunea implicit este de a apela exit n modul nucleu, dar un proces poate specifica o aciune special, pe care s-o execute la recepionarea unui anumit semnal cu ajutorul apelul sistemsignal. Sintaxa pentru apelul sistem signal este: oldfunction=signal (signum, function); signum - numrul semnalului pentru care procesul specificaciunea; function - adresa funciei (utilizator) pe care procesul dorete s oapeleze la recepia semnalului; oldfunction - valoarea parametrului function la ultimul apel al lui signal cu parametrul signum.

42

SUB 28TRIMITEREA DE SEMNALE LA PROCESE


Procesele trimit semnale folosind apelului sistem kill. Sintaxa pentru acest apel este: kill (pid, signum) pid identific setul de procese care primesc semnalul; signum este numrul semnalului trimis. n lista care urmeaz se arat corespondena dintre valorile parametrului pid i seturile de procese. Dac pid este un ntreg pozitiv, nucleul trimite un semnal procesului care are identificatorul de proces pid. Dac pid este 0, nucleul trimite semnal tuturor proceselor din grupul procesului care a trimis semnalul. Dac pid este -1, nucleul trimite semnalul tuturor proceselor al cror identificator al utilizatorului real este egal cu identificatorul utilizatorului efectiv al procesului care a trimis semnalul; Dac pid este un ntreg negativ diferit de -1, nucleul trimite semnalul tuturor proceselor din grupul de procese care au valoarea absolut egal cu valoarea parametrului pid. n toate cazurile, dac procesul care trimite semnalul nu are UID efectiv al superutilizatorului, sau UID-ul su efeciv sau real este diferit de UID-ul procesului destinatar, kill eueaz.

43

SUB 29SHELLUL

subiect scos

Shell-ul citete o linie de la intrarea sa standard i o interpreteaz dup un set fixat de reguli. Descriptorii fiierelor standard de intrare i de ieire pentru shell-ul de logare n sistem sunt de obicei ai terminalului pe care utilizatorul i folosete. Dac shell-ul recunoate irul de intrare ca fiind o comand intern (de exemplu, comenzile cd, for, while i altele), el execut comanda intern fr a mai crea procese; altfel, presupune c aceasta este numele unui fiier executabil. COMENZI SHELL Cea mai simpl linie de comand conine un nume de program i civa parametri cum ar fi: who grep -n include *.c ls -1 Shell-ul execut un apel fork i creaz un proces fiu care execut programul pe care utilizatorul l-a specificat n linia de comand. Procesul printe, shell-ul care este folosit de utilizator, ateapt pn cnd procesul fiu termin comanda i apoi revine n ciclu pentru a citi comanda urmtoare. Pentru a rula un proces asincron (n fundal), ca de exemplu: nroff -mm big document & shell-ul seteaz o variabil intern amper cnd analizeaz caracterul &. Dac gsete variabila setat la sfritul buclei, nu se execut wait dar imediat rencepe ciclul i citete urmtoarea linie de comand. Exemplul de mai jos arat cum trateaz shell-ul o linie de comand ls-l|wc cu un singur pipe. Dup ce procesul printe apeleaz fork i creaz un proces fiu, fiul creaz un pipe. Procesul fiu execut la rndul su un apel fork; el i fiul su trateaz fiecare cte o component a liniei de comand. Procesul fiu ( nepotul ) creat prin al doilea apel fork execut prima component a comenzii (ls): el scrie n pipe, aa c nchide descriptorul fiierului su standard de ieire, duplic descriptorul de scriere n pipe i nchide descriptorul iniial de scriere n pipe pentru c acesta nu mai este necesar.

44

SUB 30 Subiect scos

SUB 31 POLITICILE DE PLANIFICARE


Planificarea proceselor nucleul aloca CPU unui proces pentru o cuanta de timp( perioada numita time-slice sau time-quantum) Fiecare proces activ are o scheduling priority K comuta contextul de la un proces la altul cu prioritate superioara K o re-calculeaza prioritatea procesului in curs de executie atunci cand el revine din K mode in U mode o periodic reajusteaza prioritatea fiecarui process ready to run in U mode clock-tick-intreruperede ceas(de 50-100 de oriper secunda) Algoritmul: Round-Robin with Multilevel Feedback algoritm planificare_proces intrare: niciuna ieire: niciuna { while (nu este ales proces la execuie) { for (fiecare proces din coada de rulare) alege procesul cu prioritatea cea mai mare care este ncrcat n memorie; if (nici un proces eligibil de executat) pune maina n starea idle (no operating); /* ntreruperile o pot scoate din starea idle */ } scoate procesul ales din coada de rulare; schimb contextul n cel al procesului care a fost ales, preia execuia acestuia; } La ncheierea comutrii contextului, nucleul execut algoritmul de planificare a unui proces selectnd procesul cu cea mai mare prioritate din cele care se afl n strile gata de execuie i ncrcat n memorie i ntrerupt. Nu are nici un sens selectarea unui proces dac nu este ncrcat n memorie, deoarece nu poate fi executat pn cnd nu este ncrcat n memoria de lucru. Dac mai multe procese au fixat cea mai mare prioritate, nucleul alege acel proces care a fost pentru cea mai lung perioad de timp n starea gata de execuie, conform politicii de planificare a listei circulare. Dac nu exist nici un proces gata de execuie, procesorul trece n starea idle (inactiv) pn la urmtoarea ntrerupere de ceas; dup tratarea ntreruperii, nucleul ncearc din nou s planifice un proces. Prioritile proceselor Fiecare intrare n tabela(Process table entry) proceselor (PT) conine un cmp de prioritate(Priority fileld) pentru planificare. Domeniul prioritilor procesului poate fi partiionat n dou clase : user priorities (calculate)-procese care au fost intrerupte la trecerea din K mode in Umode kernel priorities (fixe)-procese aduse in aceasta stare prin alg. Sleep cauza lui sleep creaza nivelul de prioritate. o interuptibile o ne-interuptibile

45

Observatie: Procesele cu prioritate nucleu sczut se pot trezi la recepionarea unui semnal, dar procesele cu prioritate nucleu ridicat continu s rmn n starea de ateptare (sleep). Prioritatile proceselor

Mutarea procesului dintr-o coad n alta de prioriti Efectul recalculrii prioritilor o dat pe secund este acela c procesele cu prioriti de nivel utilizator sunt mutate ntre listele de prioriti, aa cum se arat n figura

46

Calculul prioritatilor in User mode (ready-to-run) Clock-Handler-ajusteaza toate prioritatile proceselor in User mode (ready-to-run) la interval de 1 secunda(60 IT de ceas) o la fiecare clock-interrupt se incrementeaza un camp in PT entry astfel ca in PT se retine pentru proces:recent CPU usage o la fiecare1 secunda Clock-Handler ajusteaza recent CPU usage folosind functia decay: Decay(recent CPU usage)=recent CPU usage/2 cand se recalculeaza recent CPU usage,Clock-Handler calculeaza prioritatea fiecarui proces ready-to-run cu formula: Priority = (recent CPU usage/2)+(base level user priority) Valoare mica=prioritate mare !!! Base level user priority = threshold value (ex.60) Exemplu de planificare a proceselor Liste circulare de planifiacare si prioritatile proceselor Exemplul de planificator cu partajare corecta Principiul planificatorului cu partajare corect este s se mpart comunitatea utilizatorilor ntr-un set de grupuri partajate corect, astfel nct membri fiecrui grup sunt subiectul constrngerilor unui planificator de procese obinuit relativ la alte procese din grup. Totui, sistemul aloc timpul UCP proporional fiecrui grup, fr a ine seama ct de multe procese sunt n fiecare grup.

47

SUB 32 APELURI SISTEM PENTRU CLOCK


Apelurile sistem legate de clock sunt: stime, time, times i alarm. Primele dou se ocup cu timpul global al sistemului, iar ultimele dou cu timpul proceselor individuale. STIME-permite superuser-ului s seteze o variabil nucleu global la o valoare ce d timpul curent: stime(pvalue); unde pvalue pointeaz la un long integer ce d timpul msurat n secunde. TIME-furnizeaz timpul setat de ctre apelul sistem stime: time(tloc); unde tloc indic o locaie n procesul utilizator pentru valoarea returnat. TIMES-furnizeaz timpii cumulai pe care procesul apelant i-a consumat n modurile utilizator i nucleu i timpii cumulai consumai de toate procesele fiu n starea zombie n modurile utilizator i nucleu. Sintaxa apelului este times(tbuffer) struct tms*tbuffer; unde structura tms conine timpii obinui i este definit prin struct tms { /* time_t este structura pentru timp */ time_ttms_utime;/*timpul cumulat n modul utilizator de ctre proces*/ time_ttms_stime;/*timpul cumulat n modul nucleu de ctre proces*/ time_ttms_ctime;/*timpul cumulat n modul utilizator de ctre fii*/ time_ttms_cstime;/*timpul cumulat n modul nucleu de ctre fii*/ }; Factorul comun n toate apelurile sistem de timp prezentate este ceasul sistemului: nucleul manipuleaz variate numrtoare de timp cnd trateaz ntreruperile de ceas i iniiaz aciuni corespunztoare. Exemple de programe: pentru apelurile sistem times si alarm

48

SUB 33GESTIUNE CLOCK


Ceasul Funciile rutinei de tratare a ntreruperilor de ceas Clock-Handler-sunt: repornete ceasul; planific apelurile funciilor interne ale nucleului pe baza timerelor interne; furnizeaz posibilitatea schirii execuiei proceselor n modul nucleu i utilizator; calculeaz statistici pentru procese i sistem; urmrete timpul; trimite semnale de alarm proceselor care solicit acest lucru; trezete periodic procesul ncrctor; controleaz planificarea proceselor. Algoritmul pentru tratarea intreruperilor de ceas Nucleul nmagazineaz informaia necesar ntr-o tabel callout (tabel de timeout) ce conine funcia care trebuie apelat atunci cnd timpul expir, un parametru pentru funcie i timpul n impulsuri de ceas pn cnd funcia ar trebui s fie apelat. Algoritmul clock intrri: niciuna ieiri: niciuna { repornete ceasul (astfel nct ntreruperea de ceas s apar n continuare) if (tabela de timeout nu este goal) { ajusteaz timpii de timeout; planific funcia de timeout dac timpul a expirat; } if (nucleul prezint faciliti de profiling) reine numrtorul de program la momentul ntreruperii; if (utilizatorul prezint faciliti de profiling) reine numrtorul de program la momentul ntreruperii; calculeaz statisticile per sistem; calculeaz statisticile per proces; ajusteaz mrimea valorii de utilizare a UCP if ( a trecut o secund sau mai mult de cnd s-a aflat aici iar ntreruperea nu se afl ntr-o regiune critic) { for (toate procesele din sistem) { ajusteaz timpul n cazul alarmei active; ajusteaz mrimea valorii de utilizare a UCP; if (procesul se execut n modul utilizator) ajusteaz prioritatea procesului; } trezete procsul swapper dac e necesar; }}
49

SUB 34ALOCAREA SPATIULUI DE SWAP


Dispozitivul de swap este un dispozitiv de tip bloc ntr-o seciune configurabil a discului. Pe ct vreme nucleul aloc spaiu pentru fiiere bloc cu bloc, n zona de swap spaiul este alocat n grupuri de blocuri contigue. Alocarea spaiului pe dispozitivul de swap este tranzitorie, depinznd de modul de planificare a proceselor. Un proces care rezid pe dispozitivul de swap va migra, n cele din urm, napoi n memoria principal, elibernd spaiul pe care l-a ocupat n zona de swap. Nucleul pstreaz evidena spaiului liber pentru dispozitivul de swap ntr-o tabel n memoria intern denumit map. Map-urile permit o alocare tip first-fit (prima potrivire) a blocurilor contigue de resurs. Map este o tabel n care fiecare intrare const ntr-o adres a unei resurse alocabile i numrul corespunztor de uniti de resurs disponibile; nucleul interpreteaz adresa i unitile n concordan cu tipul tabelei map. Iniial, map conine o intrare care indic adresa i numrul total de resurse. De exemplu, nucleul trateaz fiecare unitate a map ca un grup de blocuri disc, iar adresa este tratat ca un offset (deplasament) fa de nceputul zonei de swap. Algoritm pentru alocarea spaiului din Map Algorithm malloc /* algoritm pentru alocarea spaiului din map */ input: (1) map address/* indiccare map trebuiefolosit*/ (2) requested number of units output: address, if successful 0, otherwise { for(every map entry) { if(current map entry can fit requested units) { if(requested units == number of units in entry) delete entry from map; else adjust start address of entry; return(original address of entry); } } return(0); } Nucleul caut n tabela map prima intrare care conine spaiu suficient pentru cererea fcut. Dac cererea consum toate resursele intrrii din map, nucleul terge intrarea din tabel i comprim tabela n mod corespunztor. Dac cererea este mai mic dect numrul de uniti al intrrii din tabel, nucleul ajusteaz cmpurile de adres i numr de uniti ale intrrii n concordan cu cantitatea de resurse alocate.

50

Alocarea spatiului de Swap

Cnd elibereaz resurse, kernel-ul gsete poziia lor corespunztoare din mapdup adres. Trei cazurisunt posibile: 1.Resurseleeliberateacopercompletunspaiudinmap:elesuntcontiguecuintrrilealecroradreselepr ecedimediatileurmeaznmap.nacestcaz,kernel-ul combin intrrile nou eliberate lor resurse cu cele(dou) deja existente ntr-o singur intrare n map. 2.Resursele eliberate umplu parial un gol din map. Dac adresele resurselor eliberate sunt contigue cu intrarea din map cele-ar precede imediat sau le-ar urma imediat (dar nu amndou ) kernel-ul ajusteaz cmpurile adresssiunits ale intrrii respective pentru a include i resursele tocmai eliberate. 3.Resursele eliberate acoper parial un gol dar nu sunt contigue cu nici o resursdin map. Kernel-ul creazo nou intrare pentru map i o insereaz n poziia corespunztoare. Eliberarea spatiului de swap

Alocarea Spatiului de Swap din a Doua Intrare din Map

51

SUB 35EVACUAREA PROCESELOR


Scoaterea unui proces din memorie Kernel-ul duce un proces n spaiul de swap cnd are nevoie de spaiu n memorie, n urmtoarele cazuri: 1. Apelul sistem fork trebuie s aloce spaiu pentru un proces fiu, 2. Apelul sistem brk mrete dimesiunea unui fiier, 3. Un proces se mrete prin creterea natural a stivei sale, 4. Kernel-ul dorete s elibereze spaiu n memorie pentru procese pe care le-a scos anterior din memorie n spaiul de swap i pe care acum trebuie s le readuc n memorie. Daca K decide ca un proces poate fi evacuat, mai intai se decrementeaza ref.count la fiecare regiune a procesului; numai daca apoi valoarea este 0 se aloca spatiu pe swap-device si se scoate pe disc; apoi se pune adresa din swap-device in RT (Region Table)entry. Nu este necesar ca nucleul s scrie ntreg spaiul virtual de adrese al unui proces n zona de evacuare. n schimb, el copiaz memoria fizic asigurat unui proces n spaiul alocat pe dispozitivul de swap, ignornd adresele virtuale neasigurate. Cnd nucleul ncarc napoi n memorie procesul, el cunoate tabela adreselor virtuale a procesului, astfel nct reasigur procesul la adresele virtuale corespunztoare. Maparea spatiului unui proces in Swap Device (Swap out)

52

Aducerea unui proces in memorie (Swap in)

Ajustarea Map-ului Memoriei pentru Extinderea Swap-ului in urma unui brk sau cresterea stack

53

SUB 36REINCARCAREA PROCESELOR


Swaper Process0-swapper-ul este singurul proces care aduce procese in MI de pe swap-deviceSINGURUL PROCES KERNEL!! Swapper sleeps-este wake-up de catre K si se executa cu o prioritate ridicata, dar in mod kernel Swapper nu face apeluri sistem ci foloseste functii K interne Este tipic pentru un proces kernel Cand Swapper este wake-up analizeaza procesele din coada ready-to-run-swapped; il selecteaza pe cel care sta de cel mai mult timp in aceasta stare

Dac este destul memorie liber disponibil, swapper-ul ncarc procesul n memorie,
executnd operaiile inverse evacurii: aloc memorie fizic, citete procesul din zona de swap i elibereaz spaiul de swap. Algoritmul pentru Swapper algoritm swapper /*ncarc procesele executate, evacueaz alte procese pentru a face loc*/ intrare: nici una; ieire: nici una; { bucl: for (toate procesele evacuate care sunt "ready to run") alege procesul care a stat cel mai mult evacuat; if (nu exist asemenea proces) { sleep(eveniment: trebuie s ncarce); salt la bucl; } if (este loc suficient pentru proces n memoria principal) { ncarc procesul; salt la bucl; } /*bucla2:se afl aici n algoritmul revizuit*/ for (toate procesele ncrcate n memoria principal, care nu sunt zombie i nu sunt blocate n memorie) { if (exist un proces n ateptare ) alege procesul pentru care valoarea prioritate+timp de reziden este cea mai mare; else (nu sunt procese care ateapt ) alege procesul pentru care valoarea timp de reziden+nice este cea mai mare:} if (procesul ales nu este n ateptare sau cerinele de reziden nu sunt satisfcute ) sleep(eveniment : trebuie s incarce un proces); else evacueaz procesul; salt la bucl; /*goto bucl 2 n algpritmul revizuit */} Secventa Operatiilor de Swapping ;
54

Thrashing cauzat de Swapping Un asemenea caz este acela n care nucleul ncarc procesul D la secunda 2, planific procesul C i apoi, la secunda 3, evacueaz procesul D n favoarea procesului E (ca urmare a aciunii valorii nice ) dac procesul D nu s-a executat.

SUB 37STRUCTURI DE DATE PENTRU DEMAND PAGING


Intrrile n Tabela de Pagini i Descriptori de Blocuri pe Disc

Legtura dintre Structurile de Date pentru Demand Paging

55

SUB 38,39 s-au scos

SUB 40PAGE STEALER


Diagrama de Stare pentru mbtrnirea Paginii

56

SUB 41IPC-URI : MESAJE, ZONE COMUNE DE MEMORIE


Pachetul System V IPC din UNIX se compune din trei mecanisme: 1. Mesajele - permit proceselor s trimit fluxuri de date formatate ctre alte procese; 2. Memoria partajat - permite proceselor s foloseasc n comun pri din spaiul lor virtual de adrese; 3. Semafoarele - permit proceselor s-i sincronizeze execuia. MESAJELE Exist patru apeluri sistem pentru comunicarea prin mesaje: msgget - ntoarce (sau creeaz) un descriptor de mesaje, care desemneaz o coad de mesaje, utilizat ca parametru n celelalte apeluri sistem msgctl - dispune de opiuni de setare sau examinare a valorilor parametrilor asociai unui descriptor de mesaje, precum i de o opiune de eliberare a descriptorilor msgsnd - trimite un mesaj; msgrcv - recepioneaz un mesaj. Apelul sistem msgget Sintaxa apelului sistem msgget este urmtoarea : msgqid=msgget(key,flag) msgqid = descriptorul returnat de apelul sistem; key = cheie numeric, care reprezint numele su desemnat de utilizator; flag = set de permisiuni de citire-scriere-execuie separat pentru utilizator, grup i ceilali, similare permisiunilor de acces la fiiere. Apelul sistem msgsnd Procesele folosesc apelul sistem msgsnd pentru a trimite un mesaj, apelul avnd urmtoarea sintax : msgsnd(msgqid,msg,count,flag) msgqid = descriptorul cozii de mesaje, returnat n mod obinuit de apelul sistem msgget; msg = un pointer ctre o structur de date controlat de ctre utilizator compus din tipul mesajului (care poate lua valori ntregi) i un ir de caractere; count - specific dimensiunea n octei a irului de caractere din structura msg; flag - precizeaz aciunea pe care urmeaz s o ntreprind nucleul, nsituaia n care numai are la dispoziie suficient spaiu n buffer ele interne de memorie. Algoritmul msgsnd/*trimitere mesaj*/ Intrri: (1)descriptorul cozii de mesaje (2)adresa structurii de date pentru mesaje (3)lungimea mesajului (4)indicatori Ieiri: numrul de octei efectiv trimii

57

{ verific valabilitatea descriptorului i a drepturilor de acces; while (nu exist spaiu de memorie suficient pentru stocare a mesajului) { if (indicatorii specific faptul c procesul nu ateapt) return; sleep (eveniment: exist spaiu sufficient pentru stocarea mesajului) } obine un antet de mesaj; copiaz mesajul propriu-zis din spaiul utilizator n spaiul nucleu; actualizeaz structura de date: -insereaz n list noul antet de mesaj; -iniializeaz pointerul din antetul de mesaj s pointeze ctre zona de date; -nscrie valoarea:-contorului de octei; -momentelor de timp; -identificatorului procesului transmitor; trezete toate procesele care ateapt s citeasc mesaje din coad; } Structurile de date pentru comunicarea prin mesaje

Apelul sistem msgrcv Procesele recepioneaz mesaje cu ajutorul apelului sistem msgrcv, care are urmtoarea sintax : count=msgrcv(id, msg, maxcount, type, flag) . id = descriptorul de mesaj; msg = adresa unei structuri de date a utilizatorului n care se va scrie mesajul primit; maxcount = dimensiunea irului de caractere din structura de date msg; type - specific tipul de mesaj pe care utilizatorul dorete s-l citeasc; flag precizeaz ce trebuie s fac nucleul dac nu exist mesaje n coada de mesaje; count reprezint numrul de octei de date recepionai efectiv de ctre utilizator.
58

Algoritmul msgrcv /*recepionare mesaj*/ Intrri :(1) descriptorul de mesaj (2) adresa vectorului de date pentru mesajele care sosesc (3) dimensiunea vectorului de date (4) tipul de mesaj cerut (5) indicatori Ieiri: numrul de octei din mesajul returnat { verific permisiunile; ciclu: verific validitatea descriptorului de mesaj; /*gsete mesajul care va fi returnat ctre utilizator*/ if (tipul de mesaj cerut==0) se consider primul mesaj din coada de mesaje; else if (tipul de mesaj cerut > 0) se consider primul mesaj care are tipul cerut, din coada de mesaje; else /* valoarea tipului mesajului este negativ */ se consider primul mesaj dintre cele care au valoarea tipului cea mai mic din coada de mesaje, astfel nctaceast valoare s fie mai mic sau egal, n modul, cu valoarea tipului cerut; if (exist un mesaj) { corecteaz dimensiunea mesajului sau returneaz eroare dac dimensiunea dat de utilizator este prea mic; copiaz tipul i textul mesajului din spaiul nucleu n spaiul user; sterge mesajul din coada de mesaje; return; } /* nu exist nici un mesaj */ if (indicatorul precizeaz ca procesul s nu treac n ateptare) return (eroare); sleep(eveniment:sosirea unui mesaj n coada de mesaje); goto ciclu; } Apelul sistem msgctl. Un proces poate inspecta starea unui descriptor de mesaj, i poate seta valoarea i poate terge un descriptor de mesaj cu ajutorul apelului sistem msgctl. Sintaxa apelului este: msgctl (id, cmd, mstatbuf) id identific descriptorul de mesaj; cmd precizeaz tipul comenzii; mstatbuf reprezint adresa structurii de date utilizator care va conine parametrii de control sau rezultatele unei interogri

59

MEMORIE PARTAJATA Apelurile sistem pentru manipularea zonelor de memorie partajat sunt similare apelurilor sistem dedicate comunicaiei prin mesaje: shmget - creaz o nou zon regiune de memorie partajat sau ntoarce una existent; shmat - ataeaz logic o regiune de memorie la spaiul virtual de adrese al unui proces; shmdt - detaeaz o regiune de spaiul virtual de adrese al unui proces; shmctl - manipuleaz diveri parametri asociai zonelor de memorie partajat. Apelul sistem shmget. Sintaxa apelului sistem shmget: shmid=shmget(key,size,flag) size = numrul de octei din regiunea de memorie; key si flag la fel ca la celelalte. Structurile de date implicate n gestiunea zonelor de memorie partajat

Apelul sistem shmat Un proces ataeaz o regiune de memorie comun spaiului su virtua de adrese cu ajutorul apelului sistem shmat, care areu rmtoarea sintax: virtaddr=shmat(id,addr,flags) id - returnat de apelul sistem shmget anterior, identific regiunea de memorie partajat; addr = adresa virtual unde utilizatorul dorete s ataeze regiunea de memorie partajat flags specific dac regiunea este accesibil numai pentru citire (read-only) i dac nucleu ltrebuie s rotunjeasc adresa specificat de utilizator. virtaddr = adresa virtual la care nucleul a ataat regiunea, care nu trebuie s fie neaprat egal cu valoarea cerut de ctre proces. Algoritmul shmat/*ataeaz o zon de memorie*/ Intrri: (1)descriptorul zonei de memorie partajat (2)adresa virtual la care s se fac ataarea (3)indicatori Ieiri: adresa virtual la care s-a ataat zona de memorie partajat { verific validitatea descriptorului i a drepturilor de acces; if (adresa virtual specificat de utilizator!=0)
60

{ rotunjet eadresa virtual conform specificaiilor indicatorilor; verific validitatea adresei virtuale i a dimensiunii regiunii; } else/*utilizatorul dorete ca nucleul s gseasc o adres corespunztoare*/ nucleul alege o adresa virtual (daca nu este nici una disponibil ntoarce eroare); ataeaz regiunea la spaiul de adrese al procesului (alg.attachreg) if (regiunea este ataat pentru prima dat) aloc tabele de pagini, memorie pentru regiune (alg.growreg); return (adresa virtual la care s-a fcut ataarea); } Apelul sistem shmdt Un proces detaeaz o regiune de memorie comun din spaiul su virtual de adrese cu ajutorul apelului sistem: shmdt(addr) addr = adresa virtual ntoars de un apel shmat anterior Apelul sistem shmctl Pentru examinarea strii i stabilirea valorilor parametrilor unei regiuni de memorie partajat, un proces utilizeaz apelul sistem shmctl,care are urmtoarea sintax: shmctl(id, cmd, shmstatbuf) id identific intrarea corespunztoare din tabela regiunilor de memorie partajat; cmd precizeaz tipul operaiunii; shmstatbuf = adresa unei structuri de date utilizator care conine informaiile de stare din intrrea n tabel a regiunilor de memorie partajat, atunci cnd se face interogarea sau setarea parametrilor de stare

61

SUB 42 s-a scos

SUB 43 SOCKET-URI
Modelul comunicrii prin socket-uri

Apeluri sistem pentru mecanismul de comunicare prin socket-uri: socket; close; bind; connect; listen; accept; send; recv; shutdown; getsockname; getsockopt; setsockopt Apelul sistem socket Apelul sistem socket stabilete punctual final al unei legturi de comunicaie. sd=socket(format, type, protocol); format - precizeaz domeniul de comunicaie (domeniul UNIX, sau domeniul Internet); type - indic tipul de comunicaie prin socket (circuit virtual, sau datagram); protocol - precizeaz un anumit protocol pentru controlul comunicaiei sd - descriptorul de socket. Apelul sistem close - nchide socket-urile. - elibereaz i descriptorul de socket Apelul sistem bind Apelul sistem bind asociaz un nume descriptorului de socket.
62

bind (sd, address, length) sd-descriptorul de socket; address-adresa unei structuri care precizeaz un indicator al domeniului i protocolului de comunicaie, precizate n cadrul apelului sistem socket; length = lungimea structurii de date address -> fr acest parametru nucleul nu ar ti ct de lung este adresa, deoarece lungimea acesteia poate diferi de la un domeniu (sau protocol) la altul. Apelul sistem connect Apelul sistem connect cere nucleului s fac o conexiune cu un socket existent. connect(sd, address, length) sd - descriptorul de socket; address adresa socket-ului destinaie care va constitui cellalt capt al liniei de comunicaie. length = lungimea structurii de date address -> fr acest parametru nucleul nu ar ti ct de lung este adresa, deoarece lungimea acesteia poate diferi de la un domeniu (sau protocol) la altul.

Apelul sistem listen Apelul sistem listen precizeaz lungimea maxim a cozii de ateptare. listen (sd, qlength) sd = descriptorul de socket; qlength = numrul maxim de cereri care vor fi luate n consideraie Apelul sistem accept Apelul sistem accept primete cererile de conectare la un process erver nsd=accept(sd, address, addrlen) sd = descriptorul de socket; address - indic o zon de date utilizator pe care nucleul o completeaz cu adresa de retur a procesului client care se conecteaz; addrlen - precizeaz dimensiunea acestei zone. Apelul sistem send Apelul sistem send permite trimiterea datelor printr-un socket. Sintaxa apelului sistem send este: count=send(sd, msg, length, flags) sd - descriptorul de socket; msg - un pointer ctre datele care urmeaz s fie transmise; length - lungimea datelor de transmis; count - numrul de octei efectiv transmii; parametrului flags i se poate atribui valoarea SOF_OOB pentru a realiza o transmitere out-ofband a unor date, nelegnd prin aceasta c datele trimise nu fac parte din schimbul obinuit de date ntre procesele care comunic.

63

Apelul sistem recv Apelul sistem recv permite recepionarea datelor printr-un socket. Sintaxa apelului sistem recv este count=recv(sd, buf, length, flags) buf-locul unde se memoreaz datele care sosesc; length-lungimea ateptat a datelor; count-numrul de octei efectiv copiai n programul utilizatorului; Parametrul flags poate primi valoarea peek, pentru un mesaj care sosete , n scopul examinrii coninutului su fr a-l scoate din coada de ateptare, sau valoarea out-of-band pentru cazul explicat mai sus; Versiunile pentru datagrame ale acestor apeluri sistem, sendto i recvfrom, au n plus parametric pentru adrese. Apelul sistem shutdown Apelul sistem shutdown nchide o conexiune cu un socket shutdown(sd, mode) sd descriptorul de socket; mode-indic dac partea care trimite datele, partea care le recepioneaz, sau ambele pri ncheie transmisia datelor.

64