Documente Academic
Documente Profesional
Documente Cultură
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 ).
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
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).
10
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
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
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
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
22
23
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
25
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.
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 ...
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.
29
30
31
32
33
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
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
39
40
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
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
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
48
50
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
51
52
Ajustarea Map-ului Memoriei pentru Extinderea Swap-ului in urma unui brk sau cresterea stack
53
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.
55
56
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 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