Emilia Pecheanu
Sisteme de Calcul şi Sisteme de Operare
Editura Fundaţiei « Dunărea de Jos » Galaţi
1
Cuprins 1. INTRODUCERE 1.1. Sisteme de calcul .................................................................. .................................................................. 3 1.2. Elemente de arhitectur ă hardware ........................................ ........................................ 8 1.3. Istoricul Sistemelor Sistemelor de Operare Operare .......................................... 28 2. CONCEPTE SPECIFICE SISTEMELOR DE OPERARE 2.1. Resurse Resurse în cadrul unui Sistem de Operare ......................... 2.2. Procese ................................................................ ............................................................................... ............... 2.3. Fire de execuţie .................................................................. .................................................................. 2.4. Întreruperi ............................................... ........................................................................... ............................ 2.5. Apeluri sistem ............................................................... .................................................................... ..... 2.6. Sistemul de fişiere .............................................................. ..............................................................
37 39 41 44 47 49
3. CLASE DE SISTEME DE OPERARE 3.1. Clasificarea după implementarea serviciilor ...................... 3.2. Clasificarea după modelul structural structural .................................. .................................. 3.3. Clasificarea după modul de acces la servicii servicii ...................... 3.4. Clasificarea după tipul de servicii servicii oferite de sistem ...........
51 61 66 67
4. GESTIUNEA PROCESELOR 4.1. Conceptul Conceptul de proces ........................................................... ........................................................... 4.2. Modele de execuţie a proceselor ........................................ 4.3. Structuri de date pentru gestiunea gestiunea proceselor .................... 4.4. Procese sub UNIX .............................................................. ..............................................................
71 72 78 82
ANEXA - SISTEMUL DE FIŞIERE UNIX ...................................... ...................................... 87 BIBLIOGRAFIE ........................................................... .................................................................................. ....................... 90
2
1. INTRODUCERE 1.1. SISTEME DE CALCUL 1.1.1. Sistem de Calcul şi Sistem de Operare Un sistem de calcul este un ansamblu organizat de echipamente şi de programe care interacţionează în vederea realizării unui scop comun, prelucrarea automată a datelor. Echipamentele electronice, electrice şi mecanice alcătuiesc “partea hardware” a unui sistem de calcul, iar programele şi datele formează “partea software ” a acestuia. Prin tehnologiile implementate, partea hardware determină în mod direct performanţele unui sistem de calcul: viteza de calcul, puterea de calcul şi capacitatea de stocare a datelor. Partea software transformă calculatorul întrun obiect care poate fi utilizat cu uşurinţă de către operatorul uman. Partea software a oricărui sistem de calcul cuprinde două componente : − software-ul de baz ă (programe şi date de sistem ), care coordonează funcţionarea de ansamblu a sistemului − software-ul de aplica ţie (programe şi date de aplica ţie), care rezolvă probleme din diverse domenii de activitate socio-umană. Sistemul de Operare face parte din software-ul de bază, coordonând ăşurate de calculator. El asigur ă activităţile de prelucrare de date desf ăş exploatarea eficace a resurselor hardware/software ale maşinii, furnizând suportul necesar pentru dezvoltarea şi execuţia programelor de aplicaţie. Sistemele de calcul moderne sunt obiecte extrem de complexe din punct de vedere tehnic. Utilizarea calculatoarelor ar fi imposibilă dacă ar necesita cunoaşterea modului lor de funcţionare. Dezvoltarea de programe ar deveni o activitate dificilă, dacă programatorii ar trebui să cunoască în detaliu structura şi funcţionarea componentelor hardware ale unui sistem de calcul. În acest context, rolul Sistemului de Operare este de a realiza separaţia necesar ă între complexitatea internă şi modul de utilizare al unui calculator. 3
Un sistem de calcul este alcătuit din resurse fizice (procesor, memorie, dispozitive de intrare/ieşire), resurse logice (programe de sistem şi aplicaţie) şi resurse informaţionale (date organizate în structuri coerente) care interacţionează pentru satisfacerea cerinţelor utilizatorilor privind stocarea, prelucrarea şi transmisia informaţiilor. În acest sens, Sistemul de Operare este componenta software care asigur ă administrarea eficientă a resurselor sistemului de calcul, oferind o interfaţă de lucru accesibilă pentru utilizatori.
1.2.2. Instrucţiuni şi date la un sistem de calcul Partea hardware a unui sistem de calcul este alc ătuită din trei componente: Unitatea Centrală de Procesare, Memoria şi Dispozitivele Periferice. Unitatea Centrală de Procesare realizează prelucrarea automată a datelor prin execuţia unor “programe”. Programele sunt secvenţe de comenzi stocate intern în format numeric. Aceste comenzi sunt numite instrucţiuni. Instrucţiunile acţionează asupra unor date care capătă astfel semnificaţie, devenind informaţie. Informaţia este o reprezentare simbolică, în format numeric, pentru entităţi dintr-un anumit univers de interes : numere, caractere, texte, imagini, secvenţe video sau audio, ş.a.. plus algoritmii de prelucrare transpuşi intern sub formă de instrucţiuni. Observa ţ ie : Unitatea Centrală de Procesare va fi desemnată în continuare şi
prin prescurtarea UCP. Denumirea de Unitate Centrală (de Procesare) va fi considerat sinonimă cu termenul de Procesor, în sensul de entitate hardware care execută instrucţiunile din programe, în cadrul unui sistem de calcul. Instrucţiunile pe care le poate executa în mod direct UCP formeaz ă un a şanumitul “limbaj maşină”. Fiecare tip hardware de Procesor implementează un limbaj maşină propriu, limbaj care cuprinde un set de instrucţiuni. Fiecare instrucţiune din acest set este alcătuită din două componente : − Codul operaţiei (opcode), o valoare numerică care indică ce tip de prelucrare (operaţie) trebuie efectuată la execuţia instrucţiunii − Operanzii, care specifică datele (sau adresa datelor) asupra cărora se va efectua prelucrarea indicată de codul operaţiei. Instrucţiunile din setul de instrucţiuni al UCP posedă şi specificaţii bazate pe mnemonice (cuvinte cheie), pe lângă de reprezentarea numerică din limbajul maşină. Aceste specificaţii formează limbajul de asamblare al acelui tip de Unitate Centrală de Procesare. 4
Stocarea instrucţiunilor în vederea execuţiei lor şi a datelor pe parcursul prelucr ării lor se face în memoria internă a sistemului de calcul, utilizânduse reprezentarea binară. Această reprezentare a fost aleasă deoarece ea se implementează în hardware cu ajutorul unor circuite electronice la care se pot distinge două stări electrice : o stare corespunzătoare valorii 0 şi o altă stare corespunzătoare valorii 1. Cele două stări au fost asimilate cu cifrele binare 0 şi 1 şi fiecare constituie un bit. Bitul constituie cea mai mică piesă de informaţie din cadrul memoriei interne. Circuitele de stocare ce formează memoria internă sunt grupate în unităţi denumite celule de memorare, dimensiunea uzuală a unei celule fiind de 8 biţi (octet sau byte). Fiecare celulă din memorie este identificată printr-o adresă unică, iar aceste adrese sunt numerice şi încep de la 0. O instrucţiune în limbaj maşină este codificată binar în unul sau mai multe “cuvinte-procesor”. Lungimea cuvântului-procesor (“cuvântul-maşină”) constituie o caracteristică importantă pentru un anumit tip de UCP şi dimensiunea lui este dată de numărul de biţi ce se transfer ă simultan pe magistrala de date a UCP, la un acces la memorie. Astfel, există Procesoare cu cuvânt maşină de 1 bit (automatele programabile), de 8 biţi (la sistemele cu microprocesor Intel 8080, Z80, Motorola M6800), de 16 bi ţi (la sistemele cu microprocesoare Intel 80286, 80386, 80486, Pentium I, Pentium II, Zilog Z8000, Motorola M68000 ) sau de 32 bi ţi (la sisteme cu microprocesor Pentium III, Pentium IV, Athlon ). În ce priveşte lungimea unei instrucţiuni maşină, aceasta poate fi fixă sau variabilă de la instrucţiune la alta din setul de instrucţiuni al unui Procesor.
1.1.3. Modelul abstract al unui sistem de calcul Structura unui sistem de calcul modern, văzut ca ansamblu hardwaresoftware, se poate reprezenta cu ajutorul unei scheme formate dintr-o succesiune de niveluri logice suprapuse (Figura 1.1).
1. Nivelul maşinii fizice este constituit din dispozitivele electronice, electrice şi mecanice (plachete cu circuite integrate şi alte componente electronice, circuite fizice, conectori, sistemul de alimentare, ansamble mecanice de poziţionare, ş.a.) care alcătuiesc calculatorul ca obiect fizic. 5
2. Nivelul microprogramelor se întâlneşte la majoritatea sistemelor de calcul moderne. Este alcătuit dintr-o colecţie de microprograme stocate într-o memorie nevolatilă din cadrul Procesorului, memorie care nu este accesibilă utilizatorului. Microprogramele (microrutinele) sunt alcătuite pe baza unui set de microinstrucţiuni, specific fiecărui tip de Procesor. Microinstrucţiunile sunt comenzi elementare care comandă în mod direct circuitele electronice digitale care alcătuiesc Procesorul. Microprogramele constituie o componentă de tip firmware (entitate software nevolatilă şi constructiv inclusă în hardware) în cadrul unui sistem de calcul. La unele calculatoare nivelul maşinii fizice şi cel al microprogramelor sunt privite ca un tot unitar şi nu sunt prezentate ca niveluri separate. Programe de aplicaţie
Software de aplica ţie
Compilatoare Translatoare Biblioteci Medii de lucru Maşina extins ă
Software Software de bază
Sistemul de Operare Limbajul maşină Microprograme
Hardware şi firmware
Maşina fizică
Figura 1.1. Modelul abstract al unui sistem de calcul.
3. Nivelul limbajului maşină urmează după nivelul microprogramelor. Instrucţiunile limbajului maşină se exprimă în format hexazecimal sau binar. Forma “explicită” a instrucţiunilor acestui limbaj (forma care utilizează mnemonice - cuvinte cheie) constituie limbajul de asamblare al Procesorului. Pentru fiecare instrucţiune din limbajul maşină există la nivelul microprogramelor o microrutină conţinând secvenţa de comenzi elementare (de microinstrucţiuni) care se lansează la execuţia acelei instrucţiuni. Limbajul maşină este specific fiecărui tip hardware de Procesor şi poate avea între 50 şi 300 de instrucţiuni din următoarele categorii: − instrucţiuni de citire/scriere în memorie − instrucţiuni de calcul aritmetic şi logic − instrucţiuni de comparare valori 6
− − −
−
instrucţiuni de salt (ruptur ă de secvenţă) instrucţiuni de deplasare de date instrucţiuni de intrare/ieşire efectuate prin intermediul regiştrilor sau prin transfer de la/la porturile de intrare/ieşire instrucţiuni de comandă şi control.
4. Nivelul Sistemului de Operare se află deasupra nivelului limbajului maşină. În general, Sistemul de Operare care rulează în cadrul unui calculator trebuie să realizeze trei mari funcţiuni : − să mascheze complexitatea nivelurilor precedente şi să furnizeze utilizatorului o interfaţă de lucru simplificată şi accesibilă − să furnizeze suportul de lucru necesar pentru crearea şi execuţia aplicaţiilor utilizator − să administreze în mod eficient resursele hardware şi software ale sistemului de calcul, astfel încât să fie satisf ăcute în timp util toate cererile de alocare de resurse, iar conflictele legate de partajarea acestora între programe să fie rezolvate în mod corect Sintetizând aceste idei, o definiţie pentru Sistemul de Operare ar putea fi: “Sistemul de Operare este un ansamblu organizat de programe şi de structuri de date care furnizează interfaţa cu utilizatorul şi ofer ă suportul necesar pentru dezvoltarea şi execuţia programelor de aplicaţie, în condiţiile unei gestionări eficiente a resurselor sistemului de calcul.” Modulele de program care alcătuiesc Sistemul de Operare se execută într-un mod specific, denumit mod privilegiat (sau mod nucleu sau supervizor). Programele de aplicaţie din cadrul unui sistem de calcul se execut ă, de regulă, în mod utilizator. Execuţia unui modul de program în mod supervizor se caracterizează prin : − accesul f ăr ă restricţii la toate resursele hardware şi software − posibilitatea de a executa orice instrucţiune apar ţinând limbajului de asamblare al maşinii. Execuţia unui program în mod utilizator se caracterizează prin: − restrângerea posibilităţilor de lucru cu anumite resurse software şi interzicerea accesului direct la resursele hardware − restricţionarea accesului la anumite resurse, inclusiv componente ale Sistemului de Operare, acesta din urmă fiind astfel protejat împotriva modificării accidentale sau voite.
7
Primele patru niveluri prezentate sunt văzute de utilizatorii ca un tot unitar. Se consider ă că aceste patru niveluri formează aşa-numita maşină virtuală (sau maşină extinsă) în cadrul unui sistem de calcul (Figura 1.1.)
5. Nivelul programelor utilitare de sistem : este următorul nivel din schema abstractă, deasupra Sistemului de Operare. Componentele acestui nivel se numesc programe utilitare de sistem şi pot să varieze de la un Sistem de Operare la altul. Programele utilitare de sistem fac parte din software-ul de bază, ca şi Sistemul de Operare. Repertoriul de utilitare depinde de tipul Sistemului de Operare, de opţiunile utilizatorului sau de scopul în care este folosit sistemul de calcul. Programele utilitare de sistem sunt, de regulă, furnizate chiar de creatorii Sistemului de Operare, dar pot să fie realizate de programatori sau companii de software care utilizează sau promovează un anumit Sistem de Operare. 6. Nivelul programelor de aplica ţie este ultimul strat reprezentat în schema abstractă din Figura 1.1. Acest nivel este format din programe realizate de programatori profesionişti sau amatori, pentru a rezolva diverse probleme din domeniul ştiinţific, economic, militar, al vieţii sociale sau al divertismentului.
1.2. ELEMENTE DE ARHITECTURĂ HARDWARE 1.2.1. Principii şi modele de arhitectur ă a sistemelor de calcul Noţiunea de arhitectură desemnează în ştiinţa calculatoarelor modelul structural-constructiv al unui anumit tip de sistem de calcul. Un model structural-constructiv defineşte modul de alcătuire, principiile de funcţionare şi de interacţiune dintre componentele unui sistem de calcul: Unitatea Centrală de Procesare, memoria, dispozitivele periferice. Cele mai cunoscute modele de arhitectur ă pentru sistemele de calcul sunt: − arhitectura von Neumann − arhitectura Harvard.
Arhitectura von Neumann este un model structural-constructiv care implementează următorul principiu: atât datele cât şi programele sunt stocate în format numeric binar în memoria internă a calculatorului. 8
Singura deosebire dintre date şi programe constă în modul de interpretare a acestora în cadrul prelucr ărilor efectuate de sistemul de calcul. Programele pot fi accesate şi modificate la fel ca şi datele, f ăr ă a fi necesare schimbări în structura hardware a maşinii, şi ca urmare un acelaşi calculator poate executa prelucr ări variabile (sub formă de programe) asupra datelor. Calculatoarele contruite în arhitectur ă von Neumann se mai numesc şi “maşini cu program memorat ”. La aceste sisteme de calcul transferul datelor şi al instrucţiunilor între memorie şi Procesor se realizează prin intermediul aceleiaşi magistrale, transferurile fiind secvenţiale. Diferenţa dintre viteza de transfer a datelor în memorie şi viteza de procesare a UCP conduce la o reducere a capacităţii generale de prelucrare a sistemului de calcul. Fenomenul se numeşte “gâtuirea von Neumann” (von Neumann bottleneck ).
Arhitectura Harvard este un model structural-constructiv la care datele şi instrucţiunile sunt stocate pe dispozitive de memorare internă (fizic) separate. Transferul datelor şi a instrucţiunilor între memorie şi Procesor se realizează prin intermediul unor magistrale diferite şi dedicate. Această separaţie constructivă permite ca instrucţiunile să poată fi transferate din memoria internă simultan cu scrierea sau citirea datelor. Un calculator în arhitectur ă Harvard este în principiu mai rapid decât un calculator similar în arhitectur ă von Neumann. Câştigul obţinut în viteza de procesare este însă plătit printro mai mare complexitate constructivă (hardware). Unele sisteme de calcul moderne implementează o arhitectură hibridă, prin combinarea modelelor von Neumann şi Harvard. Această soluţie a fost adoptată pentru a se diminua diferenţa dintre viteza de lucru a Procesorului şi viteza de transfer a datelor din/către memoria internă. Sistemele de calcul moderne posedă o memorie intermediar ă de mare viteză, memoria cache, care se interpune între memoria internă şi Procesor. La unele modele actuale de sisteme de calcul, memoria cache este construită şi exploatată la conform principiilor arhitecturii Harvard, ea fiind alcătuită din zone de stocare şi magistralele de transfer fizic separate pentru date şi instrucţiuni. Pe altă parte, la aceste sisteme memoria internă funcţionează conform principiilor arhitecturii von Neumann: datele şi intrucţiunile sunt stocate şi accesate prin intermediul aceloraşi dispozitive de memorare şi respectiv de transfer.
9
1.2.2. Arhitectura von Neumann Aşa cum reiese din cele prezentate anterior, principiul care stă la baza arhitecturii von Neumann este strâns legat de rolul memoriei în cadrul sistemului de calcul : memoria internă stochează în codificare binar ă (sub forma unor şiruri de biţi) date şi programe. Atât datele cât şi programele care efectuează prelucrarea acestor date pot fi modificate prin intermediul aceloraşi operaţii. Codificarea uniformă a programelor şi a datelor a constituit o una din cele mai importante inovaţii din ştiinţa calculatoarelor. Aceasta a permis modificarea programelor (a modelului de prelucrarea a datelor), deci “schimbarea” dinamică a modului de funcţionare al unui sistem de calcul f ăr ă a se opera transformări asupra hardware-ului acelui sistem. : Primele calculatoare electronice nu implementau în totalitate principiul fundamental al arhitecturii von Neumann: stocarea uniformă a programelor şi a datelor. Existau programe care erau direct "cablate" pe plachete cu circuite electronice, plachete ce se inserau (fizic) în Procesor. Pentru a rezolva o nouă problemă sau a modifica un program era necesar ă recablarea unei păr ţi din circuitele Procesorului. Spre deosebire de programele moderne, la aceste prime calculatoare unele programe aveau “consistenţă fizică”, fiind deci entităţi hardware şi nu software. Observa ţ ie
Unitate de Intrare – Ie ire
Unitate de Memorare
Unitate de Comand ă şi Control
Unitatea Aritmetico-Logică
Figura 1.2. Modelul de arhitectur ă von Neumann. 10
Modelul clasic de calculator în arhitectur ă von Neumann posedă următoarele componente: Unitate de Comandă şi Control, Unitate Aritmetico - Logică, Unitate de Memorie şi Unitate de Intrare / Ieşire (Figura 1.2.). Între cele patru componente există atât schimb de fluxuri de informaţii cât şi conexiuni de comandă, iar funcţiunile îndeplinite de aceste componente sunt : − Unitatea de Comandă şi Control (UCC) supervizează transferul informaţiei între toate celelalte părti componente ale calculatorului − Unitatea Aritmetico-Logic ă (UAL) efectuează operaţii aritmetice sau operaţii logice (negaţie, SAU logic SI logic), conform tipului de instrucţiune în execuţie − Unitatea de Memorare (M) stochează uniform informaţia (date şi instrucţiuni) − Unitatea de Intrare/Ieşire realizează comunicaţia cu exteriorul şi este alcătuită din: Unitatea de Intrare (UI), compusă din dispozitive şi o interfeţele aferente ce transmit informaţii către UAL, eventual direct în memoria calculatorului printr-un mecanism specific numit DMA (Acces Direct la Memorie ). Unitatea de Ieşire (UE), compusă din dispozitive şi o interfeţele aferente ce primesc informaţii transmise de UAL sau direct din memorie prin mecanismul menţionat deja. Unitatea Centrală de Procesare
În cadrul arhitecturii von Neumann, Unitatea Centrală de Procesare (Procesorul) se defineşte ca fiind ansamblul format de UAL şi UCC, acestea două fiind puternic interactive şi constructiv combinate. UAL conţine, pe lângă circuitele necesare realizării operaţiilor, mai multe zone de memorare temporar ă numite registre (regiştri). Regiştrii sunt utilizaţi pe parcursul execuţiei instrucţiunilor, deoarece UAL nu realizează prelucrarea datelor direct în memoria internă. Prelucrarea datelor în cadrul unei instrucţiuni este întotdeauna precedată de un transfer în regiştrii UAL. După prelucrarea lor în regiştri, datele sunt eventual retransferate în memorie, deci se poate spune ca UAL nu procesează în mod direct conţinutul memoriei, ci realizează aceasta acţiune prin intermediul regiştrilor. Numărul de regiştri variază de la un tip de UCP la altul, dar în principiu, orice UAL deţine următorii regiştri : 11
Regiştrii generali, care sunt accesibili/modificabili prin instrucţiuni, atât din programele utilizator cât şi din programele de sistem − Regiştrii de adrese, care conţin adrese legate de execuţia programului curent − Regiştrii de control şi stare, care sunt folosiţi de UCP pentru controlul operaţiilor efectuate, sau de Sistemul de Operare în controlul execuţiei programelor. Regiştrii generali sunt, în principiu, următorii : − registrul Acumulator (AC), care poate fi unicul registru de date şi operandul implicit în cazul unor instrucţiuni − alţi regiştri, în funcţie de arhitectura Procesorului, uneori şi regiştrii utilizaţi pentru adresare. Regiştrii de adrese pot fi, în funcţie de arhitectura hardware : − registrul adresei (RA), care conţine adresa operandului din instrucţiunea curentă − registrul index, care participă la construcţia adresei de memorie prin asigurarea unui deplasament al valorii din registrul adresei RA − registrul pointer de segment , care conţine adresa unui segment de memorie internă, în cazul exploatării pe segmente a memoriei interne − registrul Contor Program ( PC–Program Counter ), ce conţine adresa instrucţiunii următoare celei aflate în execuţie − registrul Pointer de Stiv ă (SP–Stack Pointer) ce conţine adresa locaţiei curente din stivă. Regiştrii de Control şi Stare sunt utilizaţi determinarea stării UCP după execuţia unei instrucţiuni sau pentru controlul execuţiei programului: − registrul instrucţiunii ( IR–Instruction Register ), care stochează codul operaţiei (opcode) din instrucţiunea în curs de execuţie − registrul de Stare a Programului ( PSW – Program Status Word ), care memorează : o indicatorii de condiţie o starea sistemului de întreruperi (activat sau dezactivat ) o modul de lucru (mod privilegiat/mod utilizator), ş.a. −
Indicatorii de condiţie sunt biţi poziţionaţi de Procesor în funcţie de rezultatul obţinut în urma execuţiei unei intrucţiuni. Aceştia se refer ă la: rezultat zero, rezultat negativ, depăşire, transport, paritate, etc. Indicatorii de condiţie pot fi accesaţi prin program, dar nu pot fi modificaţi în mod direct. 12
Observa ţ ie : Registrul IR precum şi regiştrii Procesorului care conţin adresa
fizică efectivă a operanzilor (adresa de unde/unde se face citirea/scrierea) nu sunt accesibili sau modificabili prin program. UAL mai deţine şi un set intern de regiştri complet “invizibili” pentru programe, utilizaţi la efectuarea diverselor operaţii interne care sunt efectuate la execuţia unei instrucţiuni. Memoria
În cadrul unui sistem de calcul termenul de memorie desemnează o entitate care stochează datele pentru un anumit interval de timp, chiar şi după scoaterea de sub tensiune a sistemului. Memoria este alcătuită din mai multe componente de memorare, fiecare având un mod de funcţionare specific, conform cu rolul şi cu tehnologia sa de realizare. Principalele componente de memorare ale unui sistem de calcul sunt: − regiştrii Procesorului − memoria internă − memoria cache a Procesorului − dispozitivele periferice numite dispozitive externe de memorare: discul dur (HDD), discheta, CD-ROM şi DVD-ROM, bandă magnetică, caseta magnetică, memoria "flash", ş.a.
Regiştrii Procesorului sunt utilizaţi pentru stocarea datelor pe parcursul execuţiei instrucţiunilor. Din acest punct de vedere ei pot fi consideraţi componente de memorare temporar ă. Memoria internă stochează programele pe parcursul execuţiei şi datele pe parcursul prelucr ării lor. Memoria internă este organizată ca un ansamblu liniar de celule numite octeţi (a se vedea Secţiunea 1.2.2.), fiecărei celule fiindu-i asigurat un identificator sub formă de adresă. Regăsirea unei celule în vederea efectuării uneia din cele două operaţii, citire sau scriere, se face pe baza adresei acesteia. Memoria cache a Procesorului este o componentă de memorare de capacitate mică şi cu timp de acces de câteva ori mai mic decât al memoriei interne. Ea serveşte la stocarea temporar ă a unei copii pentru anumite date din memoria internă. Aceste date sunt fie frecvent utilizate de Procesor, fie au fost recent utilizate, sau există o probabilitate foarte mare ca ele să fie utilizate în intervalul de timp imediat următor. 13
Rolul memoriei cache este de a mări viteza de prelucrare a Procesorului prin reducerea timpilor de acces la date şi la instrucţiuni, pe parcursul execuţiei programelor. În general orice memorie cache serveşte la accelerarea vitezei de comunicaţie între o entitate consumatoare şi o entitate furnizoare. Rezultatul urmărit este diminuarea timpului de procesare, deci creşterea performanţelor generale a sistemului de calcul. La calculatoarele moderne există mai multe componente de memorare de tip cache: memoria cache a Procesorului (CPU cache), care a fost menţionată anterior, sau memoria cache a discului dur (disk cache sau cache buffer ) care face parte din unitatea de disc (disk drive). Indiferent de locul unde este amplasată, memoria cache funcţionează conform unui principiu numit în ştiinţa calculatoarelor “principiul referinţei localizate” (locality of reference). Acest principiu se refer ă la modul de desf ăşurare al unei activităţi în care are loc accesarea repetată a unei resurse. Există mai multe aspecte exprimate de principiului referinţei localizate, dintre care menţionam: − localizarea temporală, care spune că există o probabilitate mare ca o resursă accesată la un moment dat să fie accesată din nou după un scurt interval de timp − localizarea spaţială, care spune că există o probabilitate mare ca după accesarea unei anumite resurse, să fie accesată o alta cu amplasament apropiat de prima. Funcţionarea memoriei cache se bazează pe localizare temporală şi/sau localizare spaţială. Componentele de memorare din cadrul unui sistem de calcul pot fi descrise prin prisma mai multor aspecte. Unul dintre acestea este tehnologia hardware de realizare, în funcţie de care se pot emumera următoarele tipuri de memorie: memorie cu ferite, memorie pe bază de circuite semiconductoare (statică sau dinamică), memorie magnetică, memorie optică, memorie magneto-optică, ş.a. Alte aspecte care se pot considera pentru caracterizarea sau descrierea componentelor de memorare ale unui sistem de calcul sunt cele funcţionale. Astfel, componentele de memorare pot fi clasificate după următoarele criterii funcţionale:
14
−
−
−
−
modul de acces al UCP la componenta de memorare, criteriu după care se pot evidenţia : − memoria principală, la care Procesorul are acces direct şi care include memoria internă şi memoria cache a Procesorului − memoria secundară, la care accesul Procesorului este indirect (se efectuează prin intermediul unor interfeţe) şi care cuprinde dispozitivele externe de memorare modul de acces la unităţile de stocare (celule sau blocuri fizice), care poate fi : − aleatoriu ( RAM-Random Access Memory) : fiecare unitate de stocare din cadrul memoriei (celulă sau bloc fizic) este accesată în mod direct, pe baza adresei sale; memoria internă, memoria cache sunt de tip RAM, ca şi majoritatea dispozitivelor externe de memorare : discul dur, discheta, CD-ROM, DVD-ROM − secvenţial, care se caracterizează prin necesitatea de a citi toate unităţile de stocare precedente pentru a ajunge la unitatea de interes; acest mod se întâlneşte la dispozitive externe de memorare cum ar fi banda sau caseta magnetică tipurile de operaţii care se pot efectua în cadrul componentei de memorare: citire sau citire/scriere date; conform acestui criteriu se pot distinge două tipuri de memorie : − memorie ROM ( Read Only Memory), care permite doar citirea repetată − memorie read-write, care permite atât citirea cât şi scrierea repetată persistenţa datelor la scoaterea de sistemului de sub tensiune, criteriu conform căruia se pot evidenţia două tipuri de memorie : − memorie volatil ă, la care datele se pierd la scoaterea sistemului de sub tensiune − memorie nevolatilă, la care datele se menţin la scoaterea de sub tensiune.
Memoria internă şi memoria cache a Procesorului permit scrierea şi citirea repetată. Prin prisma persistenţei datelor, memoria internă şi memoria cache sunt memorii volatile, deoarece la scoaterea de sub tensiune a sistemului datele stocate se pierd. 15
Există totusi o excepţie: la sistemele moderne memoria internă include un spaţiu de memorare de tip ROM, care conţine informaţii importante de configurare şi care se păstrează şi după scoatrea de sub tensiune a sistemului. În ceea ce priveşte modul de acces la unităţile (celulele) de stocare, memoria internă şi memoria cache sunt de tip RAM, fiecare celulă putând fi accesată în mod direct pe baza adresei sale. Componentele care memorare din cadrul unui sistem de calcul pot fi descrise şi în funcţie de performanţele lor. În acest sens, există două aspecte care se iau în considerare : − timpul de acces, care reprezintă intervalul de timp necesar pentru a efectua un transfer de date de-la/la componenta de memorare; timpul de acces trebuie să fie cât mai redus iar dupăacest criteriu ierahia de performanţă este următoarea : − regiştrii Procesorului, caracterizaţi prin timpul de acces cel mai mic − memoria cache − memoria internă − dispozitivele externe de memorare, la care există timpii de acces cei mai mari − capacitatea de stocare , care trebuie să fie cât mai mare; pornind de acest criteriu de performanţă se poate constata următoarea ierarhie: − dispozitivele externe memorare, care posedă cea mai mare capacitatea de stocare − memoria internă − memoria cache − regiştrii Procesorului, care au capacitatea de stocare cea mai redusă din sistem. Execuţia instrucţiunilor
La un sistem de calcul, principala sarcină a Procesorului este să execute instrucţiuni. Instrucţiunile sunt, într-o succintă definire, şiruiri de biţi care specifică Procesorului ce operaţii trebuie să efectueze asupra unui set de date sau în scopul controlui funţionării sale. La modul cel mai general, formatul unei instrucţiuni cuprinde 5 câmpuri (Figura 1.3.). În practică nu sunt însă implementate instrucţiuni care să conţină efectiv toate cele 5 câmpuri. De regulă, câmpul 4 este în mod implicit registrul general numit “Acumulator”, deci nu se mai specifică.
16
1 Codul instrucţiunii
2 Adresa primului operand
3 Adresa celui de al doilea operand
4 Adresa de stocare a rezultatului
5 Adresa următoarei instrucţiuni
Figura 1.3. Formatul general al unei instrucţiuni în limbaj maşină. La instrucţiunile aritmetice şi logice câmpurile 2 şi 4 sunt în mod implicit registrul acumulator. Câmpul 5 lipseşte întotdeauna, adresa implicită fiind cea a următoarei instrucţiuni din programul în execuţie, desigur cu excepţia instrucţiunilor de ruptur ă de secvenţă (salt). Instrucţiunile executate de Procesor se desf ăşoar ă în mai mulţi paşi, denumiţi faze. Pe durata acestor faze instrucţiunea (stocată memoria internă sau în memoria cache a Procesorului) este transferată în regiştrii Procesorului şi operaţia (operaţiile) indicate de aceasta sunt efectuate. Desf ăşurarea fazelor unei instruţiuni este controlată (cadenţată) prin intermediul unui orologiu intern al Procesorului. Fiecare fază poate avea unul sau mai multe cicluri maşină, iar fiecărui ciclu îi corespund mai multe microoperaţii numite stări (o stare se declanşează pe frontul unui impuls al orologiului intern al Procesorului). Fazele de execuţie ale unei instrucţiuni în limbaj maşină sunt destul de diferite de la un Procesor la altul şi de la o generaţie la alta de Procesoare. Totuşi, se pot identifica trei faze în execuţia unei instrucţiuni : 1. Faza de aducere a instrucţiunii din memoria internă 2. Faza de decodificare a instrucţiunii 3. Faza de execuţie a instrucţiunii.
Faza de aducere a instruc ţiunii constă din citirea codului instrucţiunii (opcode) din memoria internă, de la adresa indicată de registrul adresei RA, şi plasarea acestui cod în registrul de instrucţiuni IR. Schematic, aceste activităţi se reprezintă astfel :
unde:
RA [ AS | ] CP + [ IX ] RI Mem ( RA ) CP CP + numărul de octeţi ai cuvântului ma şină RA = registrul adresei, care memorează adresa efectivă a cuvântului
din memoria internă de unde se va citi codul instrucţiunii 17
= contorul de program, care specifică adresa instrucţiunii (adresa este absolută dacă memoria nu este segmentată) sau deplasamentul faţă de adresa începutului de segment curent AS = registru cu adresa segmentului curent (unde se află instrucţiunea), în cazul unei memorii exploatate prin tehnica de segmentare [ AS | ] CP = compunerea adresei de segment cu adresa instrucţiunii IX = un posibil identificator (de registru) de indexare a adresei (valoarea din IX este adiţionată la valoarea de adresă aflată în registrului CP sau în registrul AS) RI = registrul instrucţiunii care va memora codul instrucţiunii ce urmează să se execute. CP
Faza de decodificare a instruc ţiunii constă din decodificarea codului instrucţiunii, care arată ce operaţie se efectuează prin execuţia acelei instrucţiuni. În această fază se trimit semnale către UCC şi UAL în scopul execuţiei instrucţiunii (Figura 1.4.). Faza de execuţie a instrucţiunii constă din următoarele (Figura 1.4.) : − în cazul în care instrucţiunea este cu adresare indirectă, se determină adresa adresei indirecte şi se citeşte din memorie prin intermediul registrului MAR (Memory Address Register ) − în cazul în care un operand este stocat în memorie, se determin ă valoarea acestuia şi se transfer ă această valoare într-un registru temporar, registrul de date al memoriei − se efectuează operaţia specificată de codul instrucţiunii şi se memorează la adresa rezultat, care este de regulă registrul Acumulator sau un registru specificat explicit. Durata execuţiei unei instrucţiuni depinde de natura sa şi de contextul în care se găseşte Procesorul atunci când se execută instrucţiunea. De exemplu există stări de aşteptare de durată nedefinită generate de cauze diverse, ca cea de ocupare a magistralelor de alt dispozitiv în timpul accesului la memorie. Principiul conform căruia execuţia unei instrucţiuni se efectuează prin încărcarea sa în regiştrii Procesorului are următoarea implicaţie directă: un calculator dotat cu un singur Procesor poate s ă execute doar o singură instrucţiune la un moment dat. Ca urmare un sistem monoprocesor în arhitectura von Neumann va executa o singur ă instrucţiune la un moment dat, spre deosebire de sistemele de calcul mulltiprocesor sunt capabile să execute mai multe instrucţiuni în acelaşi timp. 18
Scriere date în memorie Flux de control
Flux de date
AC
Citire date din memorie
Adresă memorie
UCC
Memoria internă
UAL MAR
Opcod
IR
Figura 1.4. Diagrama de fluxuri de date şi de control pentru un Procesor cu un Acumulator.
1.2.3. Tipuri de sisteme de calcul Clasificarea sistemelor de calcul se poate efectua după mai multe criterii, dintre care cele mai des utilizate sunt următoarele : A. tehnologia hardware de realizare B. modelul de prelucrare a datelor C. capacitatea de prelucrare (performanţele sistemului de calcul) D. scopul în care sistemele de calcul sunt utilizate.
19
A. Clasificarea dup ă tehnologia hardware de realizare
În lumea calculatoarelor se consider ă că spre deosebire de alte criterii, clasificarea după tehnologia de realizare evidenţiază clase bine delimitate de sisteme de calcul (Figura 1.5.) : − Sisteme calcul electro-mecanice − Sisteme de calcul electronice − Sisteme de calcul optice − Sisteme de calcul cuantice.
Sistemele de calcul electro-mecanice au fost construite folosindu-se relee electromagnetice. Cele mai cunoscute calculatoarele electro-mecanice au fost cele create de Konrad Zuse în Germania, în timpul anilor ’30. Aceste calculatoare implementau unele concepte avansate de arhitectur ă şi de funcţionare, care se vor regasi mai târziu în arhitectura von Neumann. Sisteme de calcul electronice au fost construite începând cu anii ’40. Se pot distinge patru generaţii de calculatoare electronice : − Generatia I-a, care cuprinde sistemele de calcul construite pe bază de tuburi electronice − Generatia a II-a, a sistemelor de calcul realizate cu tranzistori − Generatia a III-a, care curprinde sisteme de calcul realizate cu circuite integrate pe scar ă mică (SSI) şi medie (MSI) − Generatia a IV-a, care a cunoscut (deocamdată) două etape : o Perioada anilor ’70: sisteme de calcul construite cu circuite integrate pe scar ă largă (LSI) o Perioada anilor ’80, ’90, 2000: sisteme de calcul construite cu circuite integrate pe scar ă foarte largă (VLSI) şi microprocesoare. Sistemele de calcul optice există actualmente sub formă de prototip sau în cadrul unor proiecte secrete din domeniul militar. Sunt sisteme construite cu circuite care funcţionează pe principii optice sau opto-electronice şi folosite (experimental - cu succes!) pentru procesarea paralelă a datelor. Sistemele de calcul cuantice sunt calculatoare care utilizează fenomene ale mecanicii cuantice pentru prelucrarea datelor. Proprietătile cuantice ale particulelor sunt folosite pentru stocarea datelor. 20
Mecanisme apar ţinând mecanicii cuantice sunt aplicate pentru a realiza procesarea acestor date. Dacă la calculatoarele clasice unitatea de masur ă cea mai mică pentru informaţie este bitul, în cazul calculatoarelor cuantice această unitate este numită qubit. Sisteme de calcul electro-mecanice Relee electromagnetice Sisteme de calcul electronice Generaţia I –a (1945) Logică cablată, tuburi electronice Generaţia a II –a (1956) Logică cablată, tranzistori Generaţia a III –a (1960) Circuite integrate ( ~20 tranzistori per circuit) Circuite SSI ( 2 – 10 por ţi logice per circuit) Circuite MSI ( 20 – 100 por ţi logice per circuit) Generaţia a IV –a (1970) Circuite LSI ( 200 – 1000 por ţi logice per circuit) Memorie EPROM Circuite în tehnologie CMOS Generaţia a IV –a (1980 - 2000 ....) Circuite VLSI (~100.000 por ţi logice per circuit) Microprocesoare (mai mult de un milion de por ţi logice şi câteva milioane de tranzistori individuali)
Sisteme de calcul optice Sisteme de calcul cuantice
Figura 1.5. Clasificarea şi evoluţia sistemelor de calcul în funcţie de tehnologia de realizare.
21
B. Clasificarea dup ă modelul de prelucrare a datelor
O clasificare consacrată după modelul de prelucrare a datelor este aşanumita “taxonomie Flynn”. Aceasta ia în considerare gradul de paralelism în execuţia instrucţiunilor sau în prelucrarea fluxurilor de date şi pune în evidenţă următoarele categorii de sisteme de calcul: − Sisteme de calcul SISD − Sisteme de calcul MISD − Sisteme de calcul SIMD − Sisteme de calcul MIMD − Sisteme de calcul SPMD Prima categorie cuprinde sisteme de calcul monoprocesor. O caracteristică comună pentru sistemele MISD, SIMD, MIMD şi SPMD este procesarea paralelă a datelor, paralelismul având însă aspecte diferite la cele patru categorii.
Sistemele de calcul de tip SISD (Single Instruction, Single Data stream) execută la un moment dat o singur ă instrucţiune asupra unui singur set de date. Sistemele de calcul de tip MISD (Multiple Instruction, Single Data stream) sunt mai rar întălnite, fiind special proiectate pentru instalaţii sau medii de activitate unde este necesar ă redundanţa în prelucrarea datelor (vehicule de zbor, centrale nucleare, etc.). Sistemele de calcul de tip SIMD (Single Instruction, Multiple Data streams) execută simultan aceeaşi instrucţiune asupra unor fluxuri de date diferite. Un caz particular de procesare SIMD este procesarea vectorială, în care aceeaşi instrucţiune este aplicată asupra unui masiv (array) de date. Sistemele de calcul de tip MIMD (Multiple Instruction, Multiple Data streams), instrucţiuni diferite asupra unor fluxuri de date diferite. Sistemele de calcul de tip SPMD (Single Program, Multiple Data streams) sunt o combinaţie a celor două categorii anterioare. Un astfel de sistem deţine mai multe procesoare care execută simultan acelaşi program (dar din puncte diferite) asupra unor fluxuri de date diferite.
22
C. Clasificarea dup ă modelul de prelucrare a datelor şi arhitectura
Clasificarea după modelul de prelucrare a datelor poate fi efectuată şi prin corelare cu arhitectura entităţii sau entităţilor care realizează procesarea datelor. În acest sens, se pot pune în evidenţă clase specifice în cadrul a două clase generale de sisteme de calcul: − Sistemele multiprocesor − Sistemele multi-computer C1. Sisteme multiprocesor
Sistemele multiprocesor pot fi clasificate după criteriul următor : prelucrarea fluxurilor de date în corelare cu modul de acces la memoria internă. Ca urmare, se pot decela categoriile : − Sisteme de calcul cu prelucrare simetrică a datelor (symmetric multiprocessing - SMP) − Sisteme de calcul cu prelucrare asimetrică a datelor (asymmetric multiprocessing) − Sisteme de calcul cu prelucrare hibridă a datelor.
Prelucrarea simetrică a datelor se caracterizeză prin faptul că toate procesoarele prezente în cadrul sistemului de calcul sunt conectate şi partajează acelaşi spaţiu de memorare internă. Ca urmare, sub controlul Sistemului de Operare orice procesor poate executa orice program . Sistemele SMP au avantajul că pot realiza (prin intermediul Sistemului de Operare) o distribuire uniformă a sarcinii de lucru între procesoare, ceea ce conduce la sporirea generală a eficienţei activităţii de prelucrare a datelor. ă Numeroase tipuri actuale de sisteme multiprocesor implementeaz prelucrare simetrică a datelor: serverele şi staţiile de lucru de capacitate mică şi medie (în arhitecturi hardware Intel XEON şi AMD, Sparc, IBM PowerPC, Apple PowerPC, DEC Alpha, ş.a.) sau anumite modele din seria CRAY de calculatoare de mare performanţă (supercomputere). Sistemele cu prelucrare asimetrică se bazează pe modelul arhitectural NUMA (Non-Uniform Memory Access) la care fiecare procesor posedă un spaţiu separat (fizic) de memorie internă precum şi magistrale proprii pentru acces la această memorie.
23
Prelucrarea asimetrică induce o sporire implicită a performanţelor de viteză de lucru a sistemului, dar poate genera probleme complexe de echilibrare a încărcării de lucru per procesor. Arhitecturile NUMA şi prelucrarea asimetrică sunt favorabile atunci când sistemul de calcul efectuează frecvent aceleaşi operaţii sau activităţi de prelucrare (taskuri).
Prelucrarea hibridă (simetrică şi asimetrică) este implementată fie prin specializarea pe activităţi a procesoarelor din sistem, fie prin “clusterizarea” (gruparea) procesoarelor. În ambele cazuri, grupuri de procesoare utilizează în comun o zonă de memorie internă f ăr ă a avea acces la spaţiile de memorie afectate celorlalte grupuri. : Modul de prelucrare a datelor în cadrul arhitecturilor multiprocesor este o consecinţă a doi factori : arhitectura hardware şi capacitatea Sistemului de Operare de a exploata această arhitectur ă. Nu se poate discuta de prelucrare simetrică sau asimetrică la un sistem multiprocesor f ăr ă un Sistem de Operare care să fie capabil să gestioneze activităţile şi resursele în sensul dorit. Observa ţ ie
C2. Sisteme multi-computer
Un sistem multi-computer este o colecţie de calculatoare de sine stătătoare interconectate în reţea şi care cooperează pentru execuţia unor prelucrari de date. Din punctul de vedere al arhitecturii calculatoarelor care alcătuiesc un sistem multi-computer, se pot distinge două categorii: − Sisteme multi-computer omogene, la care sistemele din alcătuire sunt de acelaşi tip hardware şi fac parte din aceeaşi re ţea; de regulă, aceste sisteme multi-computer sunt utilizate pentru procesare paralelă, fiecare calculator executâd un anumit task care ţine de o problemă ce trebuie rezolvată de întregul sistem multi-computer − Sisteme multi-computer heterogene, la care calculatoarele din alcătuire sunt diferite ca tip hardware şi ca performanţe. Daca se iau concomitent în consideraţie modul de cooperare şi modul de conectare a calculatoarelor care fac parte dintr-un sistem multi-computer, se pot evidenţia trei clase principale de sisteme multi-computer : − Sistemele distribuite − Clusterele de calculatoare − Sistemele de tip grilă. 24
Sistemele distribuite sunt sisteme multi-computer omogene sau heterogene la care calculatoarele din compunere pot să coopereze pentru efectuarea unor prelucrari de date, dar pot să lucreze şi complet independent. Calculatoarele care fac parte dintr-un sistem distribuit pot de asemenea să folosească (să pună) în comun anumite resurse. După arhitectura lor, sistemele distribuite pot fi : − Sisteme distribuite de tip client-server − Sisteme distribuite client server de tip tri sau multi+nivel − Sisteme distribuite de tip punct la punct. Sisteme distribuite de tip client-server se caracterizează prin faptul că aplicaţie care rulează pe un “calculator client” poate emite cereri de servicii către o aplicaţie care rulează pe un alt calculator având statut de “furnizor de servicii” (server) în cadrul sistemului distribuit. Sisteme distribuite client-server de tip tri sau multinivel sunt o generalizare a celor dinainte : un serviciu solicitat de un calculator client este divizat într-o ierahie de prelucr ări care sunt efectuate (secvenţial sau paralel) de mai multe calculatoare server care cooperează. Sisteme distribuite de tip punct-la-punct se caracterizează prin aceea că nu posedă calculatoare cu un rol prestabilit (de client sau de server). Efectuarea unui serviciu se face prin conectare directă a calculatorului care a emis o solicitarea la un calculator din cadrul sistemului multi-computer care este capabil să efectueze serviciul cerut. Clusterele sunt sisteme multi-computer omogene. Ele sunt formate din calculatoare conectate într-o reţea (locală) de mare viteză şi care cooperează intens la efectuarea prelucrarilor de date, astfel încât sunt văzute în exterior ca o singur ă maşină. Se pot distinge următoarele categorii de sisteme cluster : − Clustere cu noduri redundante − Clustere cu echilibrare a încărcării de lucru − Clustere de mare performanţă. Clusterele cu noduri redundante sunt astfel alcătuite încât fiecare calculator este “dublat” de un altul identic care efectuează aceleaşi servicii. Această arhitectur ă permite o creştere a fiabilitătii generale a sistemului multi-computer precum şi o minimizare a timpilor de raspuns la cererile de servicii prin eliminarea “punctelor de gâtuire”.
25
Clusterele cu echilibrare a încărcării de lucru sunt alcătuite din calculatoare cu rol diferit : mai multe “calculatoare frontale” ( front-end systems) preiau şi apoi distribuie cererile de servicii către “calculatoarele de procesare” (back-end systems) care efectuează aceste servicii. Clusterele de mare performanţă realizează divizarea prelucr ărilor în vederea execuţiei în paralel. Aceste clustere sunt implementate hardware prin calculatoare de mare capacitate şi viteză de lucru, sau printr-un număr mare de calculatoare personale (PC-uri) legate în reţea. Un exemplu cunoscut de cluster de mare performanţă este sistemul multicomputer numit Beowulf. Acest sistem este format din PC-uri care rulează Linux şi sunt interconectate într-o reţea de mare viteză, comunicând prin protocolul MPI (Message Passing Interface). Acest protocol este special adaptat pentru calculele ştiinţifice, deoarece permite aplicaţiilor să distribuie execuţia task-urilor pe mai multe calculatoare din cluster, iar apoi să colecteze şi să compună rezultatele acestor execuţii. Sistemele grilă ( grid ) sunt colecţii de calculatoare care cooperează pentru realizarea unor procesări de date, folosind reţeua Internet ca suport. Sistemele grilă se bazează pe utilizarea timpului de repaus (idle time) al calculatoarelor din alcătuire pentru a efectua procesări de date care altfel ar necesita capacitatea de calcul a unui supercomputer. Sistemele grilă sunt formate din resurse heterogene: calculatoare diferite ca tip şi configuraţie hardware care apar ţin unor domenii Internet diferite. Aceste sisteme implementează conceptul de virtualizare a unor domenii diferite într-o reţea, pe baza unor standarde deschise. Sistemele grilă sunt adesea confundate cu clusterele, deşi există două deosebiri importante între aceste două clase de sisteme multi-computer: − clusterele sunt colecţii de sisteme omogene, pe când sistemele grilă sunt heterogene şi conţin de regulă calculatoare de tip PC, în diverse configuraţii − sistemele grilă cuprind calculatoare aflate în locaţii distante, pe când clusterele sunt de formate din calculatoare aflate într-un singur loc (de regulă, un centru de calcul). Din punctul de vedere al tipului de aplicaţii pe care le execută, sistemele grilă pot fi: − Sisteme grilă de tip computaţional − Sisteme grilă pentru prelucrare de date.
26
Sistemele grilă de tip computaţional sunt orientate pe execuţia aplicaţiilor de calcul intensiv. Dintre aceste sisteme se remarcă cele “necrofage” ( scavenging systems), care utilizeaza timpul de repaos nocturn sau din week-end PC-urilor din reţea. PC-urile sunt folosite în regim de prelucrare pe loturi, adică pentru execuţia înlănţuită a unor colecţii de programme intens computationale. Sistemele grilă orientate pe prelucrare de date realizează prelucrarea şi gestiunea unor sisteme de (baze de) date distribuite. D. Clasificarea sistemelor de calcul dup ă capacitatea de prelucrare
O clasificare a sistemelor de calcul după capacitatea de prelucrare (sau după performanţe - viteză şi putere de prelucrare, capacitate de stocare a datelor) poate cuprinde următoarele categorii : − Supercomputere − Mini-Supercomputere − Mainframe-uri − Minicalculatoare − Staţii de lucru − Calculatoare personale, cu următoarele subcategorii : o Desktop (Calculator personal de birou) Laptop (Calculator portabil) o Tabletă digitizoare sub formă de notebook o o PDA (Personal Digital Assistant) Calculator de buzunar sau calculator sub formă de accesoriu o portabil Această clasificare nu stabileşte în mod precis limitele fiecărei categorii, dar este frecvent utilizată pentru plasarea unui sistem de calcul într-o anumită clasă, pe baza caracteristicilor sale hardware.
27
1.3. ISTORICUL SISTEMELOR DE OPERARE Dezvoltarea Sistemelor de Operare este strâns legată de evoluţia tehnologiilor de realizare a hardware-ului echipamentelor de calcul. În cele ce urmează se va prezenta istoricul Sistemelor de Operare în corelaţie cu succesiunea generaţiilor de calculatoare electronice, de la apariţia acestora până în epoca actuală.
1.3.1. Generaţia I-a de calculatoare Primele calculatoare electronice au fost realizate în cel de-al patrulea deceniu al secolului al XX-lea. Între anii 1940 şi 1950 Howard Aiken de la Universitatea din Harvard, John von Neumann de la Institutul de studii avansate din Princeton, John Presper Eckert şi William Mauchley de la Universitatea Pennsylvania au proiectat şi construit calculatoare (numite atunci maşini de calculat) cu tuburi electronice. Generaţia I-a de calculatoare se consider ă a fi fost între anii 1950 - 1955, iar primul calculator comercializat a fost Univac-1 în anul 1951. Calculatoarele generaţiei I-a erau realizate cu ajutorul tuburilor electronice şi aveau o arhitectur ă serială. Ele erau realizate în marea lor majoritate după o arhitectura von Neumann şi erau denumite maşini de calcul cu program memorat, (calculatoare de tip maşină von Neumann). Un calculator din generaţia I-a era alcătuit dintr-o memorie unică pentru stocarea programelor şi instrucţiunilor, o Unitate Centrală de Procesare (formată la rândul ei dintr-o Unitate de Control şi o Unitate Aritmetico Logică ), dispozitive de intrare-ieşire. Caracteristica cea mai importantă a acestor calculatoare era execuţia secvenţială a tuturor operaţiilor: citire din memorie (memory fetch), scriere în memorie (memory store), operaţii aritmetico-logice, operaţii de intrare/ieşire. La generaţia I-a de calculatore, persoanele care proiectau şi realizau echipamentul de calcul erau în acelaşi timp utilizatorii şi programatorii acestuia. Programele erau scrise direct în limbajul maşină (dar în cod binar!) fiind introduse în memorie şi lansate în execuţie de la claviatura panoului frontal al calculatorului. Ulterior au început să fie folosite ca suport de stocare a programelor benzile de hârtie perforată sau cartelele perforate. 28
Caracteristici Hardware
IBM 701 1951 4 Kcuvinte 32 bi ţi 36 μsec 24 încărcător octal aritmetică în Virgulă Mobilă
Capacitate de memorie Lungime cuvânt Durată ciclu de memorie Set de instrucţiuni
Software
IBM 704 1954 8 Kcuvinte 32 biţi 12 μsec 80 + asamblor + linkeditor
Tabela 1. 3. Caracteristici a două sisteme de calcul din generaţia I-a Introducerea în memorie a programului aflat pe bandă sau cartele (tot în cod binar!) se realiza cu ajutorul unui program numit încărcător de cod absolut, care plasa programul la adresa de memorie specificată la începutul benzii. Programul încărcător era la rândul său încărcat manual în memoria calculatorului, sau adus de pe bandă perforată cu ajutorul unui preîncărcător cablat (implementat direct prin hardware-ul maşinii). Un mare progres l-a constituit apariţia asambloarelor. Asamblorul era încărcat în memorie cu ajutorul încărcătorului, iar apoi el citea programul sursă de pe bandă perforată şi genera cod obiect (cod binar absolut) tot pe bandă perforată. Încărcarea în memorie a codului binar astfel obţinut, în vederea execuţiei, se f ăcea tot cu ajutorul încărcătorului.Toate aceste operaţii implicau un număr mare de proceduri manuale, ceea ce ducea la o productivitate foarte mică la lucrul cu calculatorul. Echipamentele de calcul din generaţia I-a erau folosite în special la realizarea de calcule matematice. Fiabilitatea lor extrem de scăzută precum şi modul de operare greoi a împiedicat r ăspândirea acestora pe scar ă largă.
1.3.2. Generaţia a II-a de calculatoare Odată cu realizarea primelor echipamente de calcul cu tranzistori se marchează începutul unei noi generaţii, generaţia a II-a de calculatoare. Calculatoarele devin suficient de fiabile pentru a fi construite şi vândute unor clienţi în speranţa că aceştia vor reuşi să facă ceva cu ele. Pentru prima dată apare o distincţie clar ă între cei care construiesc un echipament de calcul şi cei care îl utilizează (programatori şi operatori).
29
Caracteristici
Hardware
Capacitate de memorie Lungime cuvânt Durată ciclu de memorie Set de instrucţiuni Alte elemente noi
Software
IBM 709 - 1958 32 Kcuvinte 32 biţi
IBM 7090 - 1960 32 Kcuvinte 32 biţi
12 μsec
2.18 μsec
140 Adresare indirectă Canale de I/E independente
189
Compilator FORTRAN II
+sistem de întreruperi + ceas programabil FORTRAN IV Rutine pentru lucrul în Dublă Precizie
Tabela 1.4. Caracteristici a două sisteme tipice din generaţia a II-a : Din tabelă se observă apariţia unui element hardware nou, canalele de intrare/ieşire. Acestea sunt procesoare separate care fac posibilă desf ăşurarea operaţiilor de intrare/ieşire paralel şi independent faţă de Unitatea Centrală de Procesare .O consecinţă imediată este implementarea sistemului de întreruperi, care va fi folosit pentru semnalarea terminării operaţiilor de intrare/ieşire sau pentru tratarea unor evenimente interne: erori, depăşiri, expirarea unor intervale de timp, ş.a. Calculatoarele din generaţia a II-a, deşi mai fiabile decât cele cu tuburi electronice, aveau următoarele deficienţe: erau echipamente extrem de scumpe, de dimensiuni mari şi care necesitau încă peri climatizate pentru a putea funcţiona. Din cauza aestor inconveniente ele puteau fi achiziţionate doar de către mari companii, de universităţi sau de instituţii de stat. Calculatoarele din generaţia a II-a efectuau o singur ă lucrare ( job) la un moment dat. O lucrare reprezinta totalitatea serviciilor solicitate de utilizator de la echipamentul de calcul. În mod tipic, o lucrare cuprindea un program sursă care trebuia compilat, link-editat şi executat. Lucrarea se prezenta la calculator transpusă pe bandă sau cartele perforate şi era “citită” de un dispozitiv special numit cititor de cartele. Rezultatele execuţiei lucr ării erau tipărite pe hârtie cu ajutorul unei imprimante. O lucrare (job) cuprindea nu numai programele sursă FORTRAN sau COBOL, ci şi cartele de control care indicau calculatorului genul de activitate care trebuia efectuată la un moment dat. 30
Activităţile de prelucrare erau: compilarea unui program sursă şi eventual stocarea codului obiect rezultat într-un fişier, încărcarea în memorie a codului obiect generat la compilare, editarea de legături (care implică şi adăugarea de module obiect din diverse biblioteci), execuţia programului. Cartelele de control (marcate printr-un caracter special în prima coloană) erau interpretate de un modul Sistemului de Operare numit monitor de înlănţuiri. Monitorul de Înlănţuiri poate fi considerat precursorul interpretoarelor de comenzi moderne. Aşa cum s-a menţionatm citirea cartelelor perforate şi imprimarea rezultatelor se realizau prin intermediul unor dispozitive periferice. Aceste dispozitive erau mult mai lente decât Unitatea Centrală de Procesare, ceea ce ducea la apariţia unor timpi de aşteptare la nivelul Unităţii Centrale. Efectuarea diverselor servicii solicitate în cadrul unei lucr ări implică încărcarea succesivă a unor programe auxiliare compilator, link-editor, încărcător, ceea ce producea un consum suplimentar de timp pentru fiecare lucrare. În cele din urmă, intervalul de timp dintre prezentarea lucr ării la calculator şi preluarea rezultatelor putea să ajungă să fie destul de mare, nu numai datorită duratei prelucr ărilor din programe, ci şi din cauza consumurilor suplimentare de timp enumerate anterior. Deoarece calculatorul era un echipament extrem de scump, s-a încercat găsirea unei soluţii pentru eficientizarea activităţii întregului sistem, prin reducerea consumurile de timp. Gruparea lucr ărilor în “loturi” care erau prelucrate automat, f ăr ă intervenţia operatorului, a constituit una din aceste soluţii. Acest mod lucru, denumit tratamentul pe loturi de lucrări sau batch processing, era format din succesiunea următoarelor activităţi : − lucr ările erau grupate şi apoi transferate (cu ajutorul unui calculator “mai mic”) de pe cartele pe bandă magnetică; lucr ările astfel grupate constituiau un lot de lucrări − banda era transportată apoi fizic la calculatorul care trebuia să efectueze prelucr ările propriu-zise; în memoria acestuia există încărcat un program special numit monitor rezident (str ămoşul Sistemelor de Operare moderne !) care : o starta execuţia lotului efectua trecerea de la o lucrare la alta realizând astfel o înlănţuirea automată a lucr ărilor; (monitorul cuprindea şi un modul interpretor de cartele de comand ă, care recunoştea şi interpreta cartelele de comanda) 31
−
−
pe măsur ă ce lucr ările se executau rezultatele erau scrise succesiv pe o alta bandă, numită banda de ieşire a lotului conţinutul benzii de ieşire era tipărit pe hârtie la un alt calculator, specializat în transferul bandă-imprimantă.
Automatizarea unor activităţilor de înlănţuire a lucr ărilor şi de încărcare a modulelor de bibliotecă în programe a condus la eficientizarea întregii activităţi din cadrul echipamentului de calcul. Alte elemente software specifice generaţiei a II-a au fost: − rutinele de bibliotecă, care au condus la necesitatea de a dezvolta programe relocatabile (care puteau fi încărcate oriunde în memorie) : la codul obiect relocabil se alipeau rutinele de bibliotecă, iar apoi prin editarea de legături se crea codul binar absolut (imaginea memorie a programului) − utilitarele pentru diverse sortări şi conversii.
1.3.3. Generaţia a III-a de calculatoare Realizarea primelor circuite integrate la începutul anilor ’60 a însemnat un nou avânt în industria calculatoarelor. Apare astfel generaţia a III-a de calculatoare, cu echipamente având performanţe superioare din punct de vedere hardware şi software şi cu un raport mult mai bun performanţe/preţ. Se marchează astfel o perioadă de r ăspândire pe scar ă tot mai mare a echipamentelor de calcul, atât în domeniul ştiinţific cât şi cel comercial. Cele mai cunoscute calculatoare din generaţia a III-a au fost modelele produse de IBM în seriile 360 şi 370. Aceste echipamente erau denumite main-frame-uri (intr-o traducere aproximativa : calculatoare mari) iar Sistemele de Operare care au rulat pe aceste echipamente de calcul au fost produse tot de IBM şi se numeau OS/360 respectiv OS/370. La calculatoarele din generaţia a III-a se remarcă elementele de noutate : − hardware : o citirea suprapusă a instrucţiunilor din memorie: anumite faze ale instrucţiunii curente se suprapuneau cu cele ale instrucţiunii următoare o protecţia prin mecanisme hardware a zonele de lucru din memoria internă, împotriva acceselor neautorizate 32
−
software: o sistem de fişiere on-line pe disc magnetic o multiprogramarea unităţii centrale o lucrul în timp partajat (time sharing).
Cea mai importantă noutate din punct de vedere software era multiprogramarea unităţii centrale. Memoria internă era împăr ţită în mai multe zone, numite partiţii, fiecare partiţie cuprinzînd cîte o lucrare (sau o parte dintr-o lucrare). Pe durata cât una din lucr ări aştepta terminarea unei operaţii de intrare/ieşire, Unitatea Centrală de Procesare era afectată altei lucr ări, astfel ajungâdu-se la o utilizare cvasi-permanentă a Procesorului. Aceasta tehnică de lucru, prin creşterea gradului de utilizare al Unităţii Centrale de Procesare, va aduce o optimizare importantă a activităţii întregului echipament de calcul. Multiprogramarea Unităţii Centrale este un concept implementat de majoritatea Sistemelor de Operare moderne. Modul de lucru tipic la un echipament de generaţia a II-a poate fi descris astfel : − memoria internă era divizată în mai multe partiţii − în fiecare partiţie se realiza prelucrarea unui lot de lucr ări − fiecare lot de lucr ări ce trebuia executat se găsea stocat pe discul magnetic sub formă unui fişier numit fir (tren) de intrare − rezultatele prelucr ării lotului de lucr ări se depuneau tot pe discul magnetic într-un fişier ce constituia firul (trenul) de ieşire al lotului − ori de cîte ori o lucrare se termina într-o partiţie se încărca următoarea din lot direct de pe discul magnetic ş.a.m.d. Această tehnică de lucru care constă în tratamentul succesiv al lucr ărilor aflate într-un fir de intrare în memoria auxiliar ă (disc), cu depunerea rezultatelor într-un fir de ieşire, a fost denumită spooling (Simultaneous Peripheral Operation On Line). Folosirea tehnicii de spooling punea în permanenţă la dispoziţia unităţii centrale un tampon de lucru cu un număr mare de lucr ări. Crearea unui pool de lucrări (o rezervă de lucr ări) a implicat implementarea în cadrul Sistemului de Operare a unor module speciale de planificare a lucrărilor. De regulă, acest gen de planificare era semiautomat, deci se realiza cu intervenţia directă a operatorului uman. Conceptul de spooling este implementat în mod curent la Sistemele de Operare moderne. 33
Tot la generaţia a III-a de calculatoare a fost implementată tehnică de partajare a timpului unităţii centrale între utilizatori conectaţi on-line (time sharing) : − mai mulţi utilizatori puteau să lucreze simultan şi direct la calculator, împăr ţind între ei timpul Unităţii Centrale de Procesare. − Unitatea Centrală avea o viteză de lucru suficient de mare pentru a executa comenzile tuturor utilizatorilor, astfel încât aceştia să fie deranjaţi unul de prezenţa celorlalţi. ă prin mecanismele Sistemului de − partajarea era implementat Operare, − lucrul cu utilizatorii se efectua în prim plan (foreground) − simultan se efectuau în fundal (background) prelucr ări pe loturi de lucr ări. Unul din cele mai notabile Sisteme de Operare concepute pentru calculatoarele din generaţia a III-a a fost MULTICS (MULTIplexed Information and Computing Service), realizat la mijlocul anilor ’60. Sistemul MULTICS îşi propunea să fie o platformă generală pentru implementarea tuturor tipurilor de aplicaţii, de aceea a ajuns în cele din urmă să fie extrem de mare şi complex. Având o fiabilitate scăzută, el nu s-a impus pe piaţă ca o soluţie de Sistem de Operare pentru calculatoarele mari. Cu toate acestea, MULTICS a introdus numeroase idei noi care au fost implementate ulterior la alte Sisteme de Operare foarte populare. Sfâr şitul anilor ’60 a marcat apariţia unui nou tip de echipament de calcul: minicalculatorul. Acest nou tip, reprezentat cu succes prin seria de modele PDP a firmei DEC, a cunoscut rapid o largă r ăspândire. Minicalculatoarele erau mult mai ieftine decât calculatoarele mari şi erau potrivite pentru a rula aplicaţii din domeniul industrial sau pentru aplicaţii mai restrânse. Dezvoltarea minicalculatoarelor a condus la crearea unor Sisteme de Operare specifice. Firma DEC, creatoarea seriei PDP, a realizat astfel Sistemul de Operare RSX-11, care a constituit o adevărată reuşită prin calităţile sale: o paletă diversificată de servicii oferite utilizatorului, dimensiune mică, implementarea unei concepţii unitare de lucru perifericele, management de memorie eficace, fiabilitate şi robusteţe. Conceptele implementate la RSX-11 şi-au dovedit viabilitatea în timp şi ele se vor regăsi şi la sistemul VMS, următorul Sistem de Operare creat de firma DEC pentru echipamente de tip minicalculator.
34
Alt Sistem de Operare scris iniţial pentru o platformă de tip minicalculator a fost UNIX. Prima variantă de UNIX a fost realizată în anul 1969 pentru un minicalculator PDP-7. Ken Thompson, creatorul primului sistem UNIX, participase deja la proiectul MULTICS şi a implementat în UNIX concepte şi idei dezvoltate pentru MULTICS.
1.3.4. Generaţia a IV-a de calculatoare La începutul anilor ’70, prin apariţia tehnologiei MOS, au fost realizate circuitele integrate pe scară largă (LSI). Ele au fost folosite în industria calculatoarelor şi astfel s-a marcat începutul generaţiei a IV-a de calculatoare. Microprocesoarele, ce înglobează într-un circuit de câţiva mm pătraţi o putere de calcul egală cu cea a calculatoarelor din primele generaţii au dus la crearea în anii ’80 a microcalculatoarelor. Acestea din urmă, sub formă de calculatoare personale (PC), au devenit în anii ’90 obiecte de lucru accesibile, prin performanţele şi preţurile lor. Sistemele de calcul moderne, deşi apar ţin încă generaţiei a IV-a, se remarcă prin arhitecturi hardware cu un grad mare de paralelism, prin viteze de calcul extrem de mari şi capacităţi de stocare uriaşe, performanţe ce nici nu puteau fi imaginate la calculatoarele din generaţiile anterioare. Sistemele de Operare pentru calculatoarele generaţiei a IV-a se pot clasifica în trei categorii, după tipul de maşină pe care rulează: − Sisteme de Operare pentru microcalculatoare; iniţial, în anii ’80, cele mai r ăspândite au fost sistemele SFDX şi CP/M, iar la nivelul anilor ’90 cel mai popular este MS-DOS − Sisteme de Operare pentru minicalculatoare şi staţii de lucru; dintre acestea cele mai cunoscute sunt sistemele UNIX, VMS, OS/2 − Sisteme de Operare pentru calculatoare de mari, de tip main-frame. Dintre Sistemele de Operare pentru microcalculatoare o menţionare specială trebuie f ăcută pentru sistemul MS-DOS. El a fost creat de firma Microsoft pentru echipamente de calcul având Unitatea Centrală construită în jurul unui microprocesor Intel (8086 şi succesorii săi 80286, 80386, 80486, Pentium) sau AMD. Destul de simplu în varianta sa iniţială, MS-DOS a fost perfecţionat treptat în versiunile următoare, firma Microsoft încercând implementarea unor mecanisme specifice Sistemelor de Operare pentru minicalculatoare. 35
Rivalul sistemului MS-DOS, respectiv al microcalculatoarelor compatibile IBM este Sistemul de Operare MACOS al firmei Apple, implementat la familia de calculatoare personale MacIntosh. Acesta prezintă o interfaţă grafică cu utilizatorul deosebit de puternică şi un mediu de lucru unificat, ceea ce face ca aceste echipamente de calcul să fie preferate deseori de către utilizatorii neprofesionişti. Succesorul sistemului MS-DOS a fost Windows, care rulează actualmente pe zeci de milioane de calculatoare personale şi care fost îmbogăţit cu un număr uriaş de programe de aplicaţie pentru cele mai diverse scopuri. Dotate cu performanţe deosebite (grafică de înaltă calitate, interfeţe conviviale, etc.) aceste programe aplicative au contribuit în mod substanţial la popularitatea Sistemului de Operare Windows. Pentru platformele de tip minicalculator, piaţa este dominată în momentul de faţă de UNIX. Trebuie f ăcută observaţia că UNIX este singurul Sistem de Operare care are versiuni pentru aproape toate tipurile de calculatoare existente în momentul de faţă şi constituie deja, prin diversele distribuţii necomerciale un concurent serios pentru Sistemele de Operare Microsoft ce domină deocamdată piaţa microcalculatoarelor, adică sistemelor de calcul cu procesoare Intel sau AMD. Anii ’90 au marcat şi o altă tendinţă importantă în domeniul Sistemelor de Operare: ca urmare a progresului tehnologic şi a integr ării echipamentelor de calcul cu mijloacele de telecomunicaţie au apărut reţelele de calculatoare. Consecinţa a fost realizarea şi implementarea unor Sisteme de Operare în Reţea şi a Sistemele de Operare Distribuite, ambele categorii funcţionând pe echipamente de calcul interconectate.
36
2. CONCEPTE SPECIFICE SISTEMELOR DE OPERARE 2.1. RESURSE ÎN CADRUL UNUI SISTEM DE OPERARE O resursă este o componentă din cadrul unui echipament de calcul, care poate fi utilizată ca o entitate distinctă în cadrul unei activităţi. Dacă se adoptă o clasificare bazată pe consistenţă atunci se pot evidenţia următoarele tipuri de resurse: − resurse fizice, care apar ţin hardware-ului maşinii : o procesorul central memoria internă o o memoria externă o canalele de intrare/ieşire dispozitivele periferice o − resurse logice (abstracte), care sunt componente ale software-ului maşinii, create ca urmare a activităţii Sistemului de Operare : o fişiere o biblioteci de programe o baze de date o translatoare de programe (compilatoare, asambloare) medii de lucru sau de programare o o programe utilitare. Într-o abordare funcţională, resursele pot fi considerate ca fiind acele entităţi pe care Sistemul de Operare le utilizează în vederea efectuării serviciilor solicitate de programe. Sistemul de Operare deţine mecanisme prin care devine posibilă utilizarea în comun de către programe a resurselor fizice şi logice. Prin intermediul acestor mecanisme se asigur ă : − administrarea şi gestionarea resurselor − protecţia resurselor − rezolvarea conflictele legate de partajarea resurselor.
37
Administrarea resurselor este efectuată prin prisma unor obiective bine precizate: − în cazul calculatoarelor medii şi mari obiectivul principal este, de regulă, utilizarea în comun resurselor fizice şi logice − în cazul calculatoarelor personale se urmăreşte în principal asigurarea accesului utilizatorului la informaţie, în condiţiile unei gestionari coerente a acestei informaţii. În general, obiectivele urmărite în activitatea Sistemului de Operare sunt următoarele : − minimizarea timpului de răspuns la cererile utilizatorilor − maximizarea factorului de utilizare a resurselor fizice − maximizarea factorului de utilizare a resurselor fizice, cu restricţia că timpii de r ăspuns nu trebuie să depăşească o limită superioar ă. Clasificarea unui Sistem de Operare într-o anumită categorie tipologica este strâns legată de obiectivul principal urmărit în cadrul activităţii desf ăşurate de acel sistem. Gestionarea resurselor de către Sistemul de Operare se realizează pe baza unei anumite strategii, care stabileşte obiectivele urmărite în activitatea acelui sistem. În acest context, un principiu important este separaţia între politici şi mecanisme : − mecanismele determină modul în care se va efectua o anumită activitate − politicile decid ce anume se va efectua, în func ţie de obiectivul urmărit. Exemplu −
−
întreruperile date de ceasul intern constituie mecanismul concret ă de Procesare poate fi alocată prin care Unitatea Central programelor în scopul de a se executa la fiecare întrerupere de ceas, componenta sistem numită planificator decide cărui program îi va fi alocată Unitatea Centrală de Procesare, ceea ce este o politică de lucru.
38
2.2. PROCESE Un procesl este forma sub care se g ăseşte un program în sistem în timpul execuţiei sale. Programul este un obiect static, procesul este un obiect dinamic, a cărui stare se schimba în permanenţă. La execuţii diferite acelaşi program poate să aibă o evoluţie diferită, în funcţie de evenimentele externe care intervin sau în funcţie de interacţiunile cu utilizatorul. Orice proces este caracterizat la un moment dat printr-o stare. Starea unui proces la un anumit moment este descris ă de următoarele elemente: − codul programului din care provine procesul (care este executat ca proces) − valorile tuturor variabilelor folosite de proces − istoricul apelurilor de funcţii (funcţii a căror execuţie nu s-a încheiat încă) − valoarea contorului de instrucţiuni şi a registrului de stare program − informaţiile despre resursele folosite de proces în acel moment. Practic, pentru a transforma un program într-un proces, Sistemul de Operare trebuie : − să aloce câte o zonă de memorie pentru fiecare din elementele enumerate anterior − să plaseze în contorul de instrucţiuni adresa primei instrucţiuni din codul programului − să plaseze în registrul de stare program (PSW) informaţiile privind modul de execuţie al programului (master/slave). Primele sisteme de calcul permiteau execuţia unui singur program al un moment dat. Programul avea controlul complet asupra sistemului de calcul şi acces la toate resursele acestuia. Sistemele moderne permit încărcarea simultană în memorie şi execuţia concurentă (întreţesută) a mai multor programe. Această evoluţie a necesitat un control mai puternic din partea Sistemului de Operare, o mai mare separaţie între programe şi a condus în cele din urmă la apariţia conceptului de proces. Procesul este o abstractizare a noţiunii de program.
39
În această abordare, Sistemul de Operare poate fi considerat un ansamblu de procese utilizator şi procese sistem. Toate aceste procese se execută în concurenţă, multiplexând Unitatea Centrală Procesare între ele. Comutarea Unităţii Centrale între procese este comandată de Sistemul de Operare şi ea se desf ăşoar ă astfel : − Unitatea Centrală de Procesare execută la un moment dat instrucţiuni apar ţinând unui anumit proces − după un interval de timp trece la execuţia de cod apar ţinând unui alt proces, ş.a.m.d. ă Procesare execută − pe durata unei secunde, Unitatea Central secvenţe de cod provenind din programe diferite, simulând astfel prin viteză paralelismul în execuţia programelor. În contextul unui Sistem de Operare care implementează multiplexarea (comutarea repetată) a Unităţii Centrale între procese, conceptul de stare a unui proces capătă sensul de “situaţie în care se afla la un moment dat un proces în cadrul sistemului”. În această abordare, stările generice în care se poate afla un proces pe parcursul existenţei sale în sistem sunt : − în execuţie, situaţie când codul procesului este executat de Unitatea Centrală de Procesare − în aşteptare : blocat, situaţie în care procesul aşteaptă producerea unui o eveniment gata de execu ţie, situaţie în care procesul aşteaptă să o primească resursa Unitate Centrală pentru a-şi continua execuţia întreruptă anterior datorită epuizării intervalului de timp alocat sau altor cauze. Comutarea repetată a Unităţii Centrale între procese este o formă de pseudoparalelism în execuţia programelor. El nu trebuie confundat cu : − paralelismul real în execuţie, care se produce atunci când echipamentul de calcul dispune de mai multe procesoare care execută simultan programe diferite − paralelismul în lucru, care se refera la activitatea simultană a unităţii centrale, a interfeţelor şi a dispozitivelor de intrare/ieşire în cadrul unui echipament de calcul.
40
Pseudoparalelismul în execuţia proceselor este principiul de bază de funcţionare la Sistemele de Operare cele mai cunoscute : UNIX, Windows NT, Windows 2000, Windows XP. Acest model de lucru mai este cunoscut şi sub denumirea de multiprogramare a Unităţii Centrale de Procesare. Creatorii Sistemelor de Operare moderne au reuşit să îmbunătăţească treptat modelul pseudoparalelismului în execuţia programelor, astfel încât această activitate să devină complet transparentă pentru utilizatori şi să nu influenţeze rezultatele execuţiei programelor.
2.3. FIRE DE EXECUŢIE Un proces este caracterizat prin spaţiul de adrese şi resursele pe care le foloseşte. În cadrul unui Sistem de Operare există situaţii în care este necesar ca anumite resurse să fie folosite în comun de mai multe procese identice. Acest gen de situaţii sunt rezolvate prin aplicarea reentranţei : execuţia unui proces cu mai multe contoare de instrucţiuni. În acest fel un proces se poate multiplică din punct de vedere funcţional, dar există fizic în memoria internă sub forma unui unic spaţiu de adrese. Crearea şi gestionarea unui proces în cadrul Sistemului de Operare necesită consum de timp şi de spaţiu de memorie. De aceea, chiar şi reentranţa proceselor nu este cea mai “economică” soluţie în cazul în care se doreşte utilizarea în comun a unor resurse de către mai multe procese. Cu atât mai mult, reentranţa nu poate fi aplicată atunci când procesele care trebuie să utilizeze în comun un grup de resurse nu sunt identice. O solu ţie posibilă este în acest caz folosirea firelor de execuţie (threads). Un fir de execuţie este un sub-proces. Firele de execuţie sunt o formă de implementare a multiprogramării la nivelul intern al unui proces. Cu alte cuvinte, un proces realizează o gestiune a codului propriu dup ă modelul aplicat de Sistemele de Operare multiprogramate : anumite por ţiuni de cod (funcţii) componente ale procesului sunt executate cvasi-simultan, în intervalul de timp de execuţie alocat procesului. În fapt, procesul “comută” Unitatea Centrală între mai multe funcţii diferite, care formează astfel sub procese sau fire de execuţie ale sale. Fenomenul nu implică crearea de noi procese la nivelul Sistemului de Operare, deci se desf ăşoar ă în condiţii de economie de resurse la nivel general sistem.
41
:Stiva program, unde se menţine istoricul apelurilor de funcţii care nu s-au încheiat, este mecanismul utilizat pentru crearea firelor de execuţie. În cadrul Sistemului de Operare UNIX, biblioteca de funcţii sistem pune la dispoziţia proceselor apeluri sistem care permit “deplasarea” în stivă, deci “comutarea” Unităţii Centrale între funcţiile lansate în execuţie ale unui proces. Observa ţ ie
Un Sistem de Operare care implementează fire de execuţie se numeşte multi-thread. Un fir de execuţie mai este denumit şi proces cu greutate mică (light-weight process - LPW). Un fir de execuţie are următoarele componente : − contor de instrucţiuni − ansamblu de regiştri − stivă proprie. Un fir de execuţie partajează cu alte fire de execuţie ale aceluiaşi proces secţiuni de cod, secţiuni de date şi resurse ale aceluiaşi proces. În acest context, procesul “proprietar”al firelor de execuţie este denumit task , iar un proces tradiţional, sau proces de greutate mare (heavy-weight process HWP) este de fapt un task cu un singur fir de execuţie. Un fir de execuţie funcţionează ca proces. El poate să se găsească în una din stările cunoscute: blocat, gata de execuţie, în execuţie ca şi un proces obişnuit. La un moment dat, există un singur fir de execuţie în execuţie la nivelul procesului proprietar. Spre deosebire de procese însă, firele de execuţie nu sunt independente unul faţă de celălalt. Un fir de execuţie poate avea acces la orice stivă apar ţinând altui fir de execuţie din cadrul aceluiaşi proces. Protecţia între firele de execuţie ale unui proces nu este necesar ă, deoarece ele sunt concepute pentru a coopera şi a se asista reciproc. În cazul gestiunii multi-thread, Unitatea Centrală este partajată între firele de execuţie ale aceluiaşi task, dar trecerea de la un fir la altul se face f ăr ă comutare de context UC. Trecerea UCP de la un fir de execuţie la altul din cadrul aceluiaşi task nu înseamnă decât comutarea (schimbarea valorilor) setului de regiştri generali. Unele Sisteme de Operare implementează mecanismul de fir de execuţie la nivel utilizator prin intermediul unei biblioteci de nivel utilizator. În acest fel trecerea de la un fir de execuţie la altul într-un task se face cu rutinele din această bibliotecă şi nu printr-un apel sistem, care ar produce o întrerupere a nucleului Sistemului de Operare.
42
Comutarea între fire de execuţie la nivel utilizator se face deci f ăr ă intervenţia Sistemului de Operare şi este în consecinţă foarte rapidă. Firele de execuţie la nivel utilizator sunt avantajoase dacă nucleul Sistemului de Operare este la rândul sau multi-thread. Există Sisteme de Operare care implementează gestiunea multithread la nivelul nucleului; cele mai cunoscute dintre acestea fiind OS/2 şi Solaris 2. Eficacitatea firelor de execuţie poate fi înţeleasă dacă gestiunea multi-thread este comparată cu gestiunea multi-proces. În cazul Sistemelor de Operare multi-proces (care execută cvasi-simultan mai multe procese aflate în memoria internă) fiecare proces funcţionează independent faţă de celelalte, are propriul contor de instrucţiuni, propria stivă, propriul spaţiu de adrese, etc. Acest mod de organizare este util atunci când procesele efectuează prelucr ări relativ independente. În cazul în care este necesar ca aceeaşi prelucrare (sau prelucr ări care utilizează acelaşi set de resurse) să fie efectuată de mai multe ori simultan, conceptul de fir de execuţie devine extrem de avantajos. Mecanismul de multi-thread constituie o soluţie pentru problema următoare: cum poate fi creat un proces server care să prelucreze mai multe cereri venite simultan de la procese client.. Exemplu
Un proces server de fişiere care a lansat o operaţie de intrare/ieşire se blochează şi aşteaptă până la terminarea acesteia. Performanţele sale ar fi mult ameliorate dacă acest server nu ar aştepta, ci ar prelua şi trata o altă cerere provenind de la un proces client. Procesul server de fişiere nu poate fi însă multiplicat din raţiuni de economie de spaţiu de memorie. Dacă el implementează însă gestiunea multithread, se poate realiza servirea simultană a mai multor cereri de la procese client, f ăr ă a se face risipă de memorie.
43
2.4. ÎNTRERUPERI Întreruperea este un mecanism prin care Unitatea Centrală de Procesare ia cunoştinţă de apariţia unui eveniment în sistem. Ca urmare a producerii unui eveniment, procesul care era în curs de execu ţie este “întrerupt” (suspendat temporar) iar Sistemul de Operare ia în considerare evenimentul respectiv. Această activitate de luare în considerare a unui eveniment apărut în sistem poartă denumirea de “tratare de întrerupere”. Un proces poate fi întrerupt în timpul execuţiei sale din diverse cauze. Un proces este întrerupt din execuţie : − la încheierea în sistem a unei operaţii de intrare/ieşire − la epuizarea intervalului de timp de execuţie acordat, în cadrul unui Sistem de Operare care implementează multiprogramarea UCP. Un proces generează el însuşi o întrerupere ca urmare a producerii următoarelor evenimente : − la tentativa de execuţie a unei instrucţiuni inexistente sau interzise − la împăr ţirea la zero sau la depăşire − la tentativa de accesare a unei zone de memorie interzise sau în cazul gener ării unei adrese invalide de memorie − la execuţia instrucţiunii de lansare a unui apel sistem. O clasificare generala a evenimentelor care generează întreruperi, împreună cu cauza şi provenienţa acestora este prezentată în tabelul următor : Eveniment Întrerupere externa Excepţie (trap, derută)
Cauza Exterioar ă execuţiei procesului curent Legată de execu ţia procesului curent
Apel sistem
idem (generare explicită)
Provenien ţa Apariţia unui eveniment extern asincron Apariţia unei erori sau a unei situaţii excepţionale în derularea procesului Cererea unui serviciu de la Sistemul de Operare
: Termenul generic de ÎNTRERUPERE este adesea folosit pentru cel trei tipuri de evenimente prezentate în tabela de mai sus. Observa ţ ie
44
Prin raportare la un proces, întreruperile care îl pot afecta se clasifică în: − întreruperi hardware, generate din cauze externe execuţiei procesului − întreruperi software, generate din cauze interne execuţiei procesului. Întreruperile hardware sunt asincrone faţă de execuţia proceselor (se produc la momente de timp nepredictibile) iar cele software sunt sincrone (se produc întotdeauna la execuţia unei anumite instrucţiuni apar ţinând codului proceselor). Întreruperile software pot fi generate de următoarele componente hardware: − Unitatea de Management a Memoriei (UMM), în cazul tentativei unui proces de a accesa o zonă de memorie interzisă (violare de zona) sau inexistentă − Unitatea Centrală (UC), în cazul tentativei unui proces de a executa o instrucţiune interzisă sau inexistente, sau la execuţia instrucţiunii de lansare a unui apel sistem.. : UMM este o componentă hardware care face parte din microprocesor sau este un circuit separat. Rolul UMM este următorul: − în cazul oricărui acces la memorie solicitat de un proces, este indicată o adresă (logic[) care este verificată de UMM − adresa (logic[) este transformată de UMM în adresă fizică, conform unui set de reguli care este sub controlul Unităţii Centrale. Rezultatul este o adresă fizica valida sau o eroare (excepţie). Observa ţ ie
Modul de desf ăşurare al unei întreruperi hardware este următorul: 1. după execuţia fiecărei instrucţiuni, Unitatea Centrală de Procesare testează un indicator (flag) de prezenţă întrerupere 2. prin mecanisme hardware (pornind de la numărul sau codul întreruperii) este regăsită şi apoi plasată pe magistrala de adrese adresa rutinei de tratare întrerupere 3. prin mecanisme hardware (şi nu programat!) se salvează automat în stiva sistem: − valoarea curentă a registrului contor de instrucţiuni (PC) − valoarea curentă a registrului de stare program (PSW) 4. adresa rutinei de tratare întrerupere este încărcată în contorul de instrucţiuni (PC) 5. se execută în continuare codul rutinei de tratare întrerupere, care începe o secvenţă de salvare a informaţiilor referitoare la procesul întrerupt. 45
Pentru fiecare tip de întrerupere care poată fi tratată de Sistemul de Operare există o rutină de tratare specifica (interrupt handler). Adresele rutinelor de tratare întreruperi sunt menţinute intr-un vector de întreruperi, în memoria internă şi începând de la adresa fizica 0. Se consider ă că vectorul de întreruperi face parte din nucleul Sistemului de Operare. În general, Sistemele de Operare utilizează două scheme de bază pentru tratarea întreruperilor: − un indicator unic este utilizat de toate întreruperile şi în acest caz : o o rutină generala de tratare întrerupere este activată la comutarea de context o codul întreruperii, este furnizat prin mecanisme hard în PSW sau intr-o locaţie bine stabilită din memorie o în funcţie de valoarea acestui cod, rutina de tratare apelează procedura de tratare întrerupere corespunzătoare; − nivelul întreruperii este livrat în funcţie de tipul întreruperii: o pentru fiecare nivel există o rutină diferită de tratare întrerupere, activată automat la comutarea de context în cazul apariţiei întreruperii respective o există o ordine de prioritate prestabilită a nivelelor o pe parcursul tratării unei întreruperi de nivel superior este posibil ca să se întârzie livrarea întreruperilor de nivel inferior (mascare sau inhibare a nivelelor inferioare) sau să se suprime livrarea întreruperilor de nivel inferior (dezarmarea nivelelor inferioare ). La apariţia unei întreruperi, indiferent de tipul ei, are loc comutarea de context a Unităţii Centrale de Procesare, adică salvarea informaţiilor de stare a procesului curent (în execuţie) şi încărcarea informaţiilor necesare execuţiei unui nou proces, care este chiar rutina de tratare a întreruperii. Contextul Unităţii Centrale de Procesare se refer ă la: − conţinutul contorului de instrucţiuni (PC) − conţinutul registrelor generali − conţinutul registrului de stare program (PSW) : o starea de execuţie a procesului curent : în aşteptare sau activ modul de lucru al procesului curent : master/slave o o măştile pentru întreruperi specifice procesului curent − informaţiile despre zonele de memorie accesibile procesului şi drepturile asociate.
46
Comutarea de context este o opera ţie indivizibilă (neîntreruptibilă), executată în cadrul maşinii prin mecanisme hardware şi software. La apariţia unei întreruperi Unitatea Centrală este trecută automat în modul de lucru master, ceea ce permite executarea tuturor instrucţiunilor nepermise în modul slave (instrucţiuni de intrare/ieşire, de schimbare a modului de lucru, de control al întreruperilor, etc.).
2.5. APELURI SISTEM Apelul sistem este un mecanism prin care un program (proces) comunică cu Sistemul de Operare şi solicită diverse servicii acestuia. Apelurile sistem sunt mecanismele esenţiale prin care Sistemul de Operare furnizează diverse servicii proceselor utilizator. Apelul sistem este similar cu apelul de procedur ă sau funcţie din cadrul unui program obişnuit, cu deosebirea ca procedura şi funcţia apelată este externă programului şi apar ţine codului Sistemului de Operare. Numărul şi forma apelurilor sistem variază de la un Sistem de Operare la altul şi caracterizează un anumit Sistem de Operare. În cele mai multe cazuri un proces execută un apel sistem pentru lansarea unei operaţii de intrare/ieşire sau pentru lansarea unei operaţii de comunicare cu un alt proces. Fiecărui apel sistem îi corespunde o funcţie de bibliotecă care execută trecerea de la procesul utilizator la rutina din cadrul Sistemul de Operare care va executa serviciul solicitat. Această funcţie efectuează pregătirile necesare activării rutinei de tratare apel din cadrul Sistemului de Operare , astfel încât apelul sistem să apar ă ca un apel obişnuit de procedur ă. În general, funcţia de bibliotecă realizează următorii paşi : − iniţiază apelul sistem, activitate care constă din următoarele operaţii : o plaseaza parametrii apelului sistem intr-un loc bine stabilit, cum ar fi regiştrii procesorului sau o structur ă de date specială pentru transfer parametri. o execută o instrucţiune specială (TRAP sau EMT -Emulator Trap-) care invoca Sistemul de Operare. − încheie apelul sistem prin predarea controlului câtre procesul apelant − transmite codul de retur, o valoare ce indică procesului apelant daca apelul sistem solicitat s-a desf ăşurat în mod corect sau nu. 47
Execuţia unui apel sistem se efectuează conform următoarelor etape: − preia controlul de la procesul apelant prin intermediul funcţiei de bibliotecă − verifică validitatea parametrilor de apel transmişi de proces − daca parametrii de apel sunt corecţi, execută serviciul solicitat, în mod supervizor − la încheierea prelucr ării, plaseaza intr-un registru codul de retur − execută o instrucţiune RETURN FROM TRAP care predă controlul funcţiei de bibliotecă ce face trecerea la procesul apelant. Exemplu
Modul de execuţie al unui apel sistem în cadrul unui Sistem de Operare la care pentru fiecare serviciu ce poate fi solicitat există o rutină de tratare distinctă numită procedura de serviciu. În acest caz apelul sistem este executat după paşii următori (Figura 2.1.): Pasul 1, efectuat de funcţia de biblioteca corespunzătoare apelului sistem, cuprinde fazele: − controlul este transferat de la procesul apelant la Sistemul de Operare − execuţia apelului sistem se va face în continuare în mod supervizor. Pasul 2, efectuat de module ale Sistemului de Operare, cuprinde fazele : − rutina generală de tratare apeluri sistem examinează parametrii apelului şi determină pe baza lor ce serviciu a solicitat programul utilizator − pe baza unei tabele dispecer este determinată adresa procedurii care va efectua serviciul solicitat de procesul apelant. Pasul 3, efectuat de module ale Sistemului de Operare cuprinde fazele : − controlul este predat procedurii de serviciu − procedura de serviciu efectuează prelucrarea solicitată de procesul apelant. Pasul 4, efectuat de funcţia de biblioteca corespunzătoare apelului sistem, cuprinde fazele: − codul de retur este plasat într-un registru sau într-o zon ă special dedicată − se face comutarea din modul de lucru supervizor în modul utilizator − controlul este redat procesului ce a lansat apelul sistem, iar acest proces îşi continuă execuţia cu instrucţiunea care urmează după apelul sistem. 48
Procese utilizator
Proces apelant
• •Apel sistem •
4
1
3
Sistemul de Operare
Procedur ă de serviciu
Memoria internă
2 Procedur ă principală
Procedur ă de serviciu Tabela dispecer
Figura 2.1. Paşii de execuţie ai unui apel sistem.
2.6. SISTEMUL DE FIŞIERE Începând cu calculatoarele din generaţia a II-a Sistemul de Operare va include un sistem de fişiere on-line pe suport magnetic (disc sau banda) pentru stocarea şi regăsirea informaţiei. Sistemul de fişiere stochează informaţia prin intermediul unor obiecte bine definite numite fişiere. Un fişier este o colecţie de informaţii care posedă un nume. Sistemele de fişiere din cadrul majorităţii Sistemelor de Operare moderne au următoarele caracteristici : fişierele sunt grupate (din punct de vedere logic) în directoare directoarele alcătuiesc o structura arborescentă − există un director rădăcină de la care pornesc toate directoare − fiecare proces posedă un director implicit de lucru, care este identic cu cel al utilizatorului proprietar al procesului − fiecare fişier are un nume unic - specificatorul fişierului - care cuprinde numele propriu-zis al fişierului plus poziţia să în cadrul arborelui de directoare (traseul de directoare ce trebuie parcurs în arbore până la acel fişier). 49
Pentru a salva (scrie) informaţia sau a accesa (citi) informaţia dintr-un fişier acesta trebuie deschis. Deschiderea fişierului se efectuează prin intermediul unui apel sistem dedicat. Dacă drepturile de acces ale utilizatorului sunt corespunzătoare, Sistemul de Operare reîntoarce procesului apelant un descriptor de fişier (file descriptor sau file handle), care trebuie apoi folosit în orice operaţie care se refera la fişierul respectiv. Descriptorul de fişier este o valoare numerică, sau un sir de caractere, sau adresa unei tabele. Prin extinderea conceptului de fişier a fost introdusă la unele Sisteme de Operare (UNIX şi MS-DOS) abstractizarea în lucrul cu anumite dispozitive periferice. Perifericele care nu au ataşată o structur ă de fişiere, dar pot fi accesate ca un fişier sunt următoarele : imprimanta, ecranul terminalului, tastatura terminalului, interfeţele de reţea. Acestea sunt denumite fişiere speciale de tip caracter şi suportă operaţii de citire şi de scriere ca orice fişier obişnuit. Fişierele speciale de tip caracter au un descriptor implicit şi sunt alocate automat la deschiderea oricărei sesiuni de lucru cu sistemul. Exemplu
În cadrul Sistemului de Operare UNIX, la o sesiune utilizator sunt alocate automat următoarele fişiere speciale de tip caracter : − fişierul de intrare standard (tastatura terminalului sau al staţiei de lucru), descriptor 0 − fişierul de ieşire standard (ecranul terminalului sau al staţiei de lucru), descriptor 1 − fişierul de ieşire standard de eroare (ecranul terminalului sau al staţiei de lucru), având valoarea descriptorului egala cu 2. Sistemele de fişiere moderne permit uneori şi accesul direct la date. Perifericele care posedă o structur ă de fişiere (discurile magnetice, floppy disc, CD-ROM, ş.a.) pot fi accesate în mod global ca un singur fişier special de tip bloc. În acest caz structura de fişiere nu mai este vizibilă, accesul f ăcându-se direct la nivel de blocuri fizice de date. Acest mod de lucru este de regul ă permis doar utilizatorilor cu drepturi speciale, cum ar fi cei din grupul administratorului de sistem.
50
3. CLASE DE SISTEME DE OPERARE Clasificarea Sistemelor de Operare se poate efectua pe baza mai multor criterii, cum ar fi : − modul de implementare a serviciilor furnizate de Sistem − modelul structural al Sistemului de Operare − modul de acces al utilizatorului la serviciile oferite de Sistem − tipurile de servicii oferite de Sistemul de Operare.
3.1. CLASIFICAREA DUPĂ IMPLEMENTAREA SERVICIILOR 3.1.1. Nucleul Sistemului de Operare Clasificarea după modul de implementare a serviciilor se face prin prisma localizării acestor servicii în raport cu nucleul Sistemului de Operare. Nucleul este componenta principală a oricărui Sistem de Operare. Nucleul poate fi privit ca o colecţie de proceduri de serviciu ce pot fi apelate de către procesele utilizator. În acelaşi timp, nucleul este un “interpretor” care ofer ă “instrucţiuni” (sub formă de apeluri sistem) programelor utilizator. Caracteristicile unui nucleu de Sistem de Operare sunt următoarele : − nucleul poate executa pentru procesele utilizator operaţii care nu sunt permise acestora − zona de memorie în care se află nucleul devine “vizibilă” pentru procese numai atunci când ele invocă serviciile acestuia, în rest fiind invizibilă (inaccesibilă) acestora − codul nucleului este reentrant, există o singur ă copie a nucleului în memoria internă, dar el poate fi executat simultan în contextul mai multor procese. Nucleul unui Sistem de Operare este rezident în memoria internă pe toată durata funcţionării acelui sistem. Nucleul se încarcă în memoria internă, par ţial sau în totalitate, la boot-area Sistemului de Operare. 51
Exemplu
Sistemului de Operare MS-DOS posedă o componentă a nucleului care se numeşte BIOS. BIOS-ul este o suită de funcţii înscrise în memoria internă nevolatilă (ROM) a unui calculator personal. BIOS-ul furnizează rutinele de bază (drivere, funcţii de configurare, etc..) pentru comanda şi controlul componentelor hardware ale unui PC. Nucleul Sistemului de Operare MS-DOS mai cuprinde şi alte componente (stocate în fişierele msdos.sys şi io.sys) care se încarcă în memoria internă volatilă (RAM) la boot-area sistemului. Funcţiunile nucleului legate de execuţia proceselor sunt următoarele: − realizează controlul execuţiei programelor, adică managementul proceselor − poate asigura execuţia simultană a proceselor (multiprogramarea): o reală, atunci când există mai multe procesoare în echipamentului de calcul o simulată (time-sharing), atunci când echipamentul de calcul posedă un singur procesor (o singur ă Unitate Centrală) − poate asigura planificarea proceselor (scheduling-ul) în Sistemelor de Operare care implementează multiprogramarea Unităţii Centrale. Funcţiunile nucleului legate de gestiunea memoriei sunt următoarele: − menţine lista zonelor libere şi ocupate din memoria internă − menţine pentru fiecare proces o listă cu zonele de memorie la care are acces − implementează un spaţiu virtual de adrese ( memorie virtuală) pentru procese, spaţiu care este translatat în adrese fizice la execuţia proceselor (address mapping). Implementarea serviciilor oferite proceselor utilizator, în raport cu nucleul Sistemului de Operare, se poate realiza astfel (Figura 3.1.) : − în spaţiul proceselor utilizator , prin legare la program (proces) a unor funcţii care provin dintr-o bibliotecă partajabilă de funcţii sistem − în spaţiul nucleului, cu accesare prin apeluri sistem; aceste sisteme se numesc monolitice − în gestiunea unor procese separate denumite procese server; aceste sisteme se numesc micro-kernel (micro-nucleu). 52
PROCES
PROCES server
PROCES
PROCES
BIBLIOTECĂ
NUCLEU
mesaj
NUCLEU
NUCLEU
Figura 3.1. Tipuri de Sisteme de Operare după modul de implementare a serviciilor. : În general, fiecare Sistem de Operare utilizează toate cele trei moduri de implementare a serviciilor într-o măsur ă mai mare sau mai mică. Plasarea unui Sistem de Operare într-o anumită categorie tipologică (monolitic, micro-kernel, etc..) se face după modul predominant de implementare a serviciilor în cadrul acelui sistem. Observa ţ ie
3.1.2. Sisteme de tip “bibliotecă de funcţii” Un Sistem de Operare de tip bibliotecă de funcţii plasează majoritatea serviciilor în cadrul bibliotecilor sistem. O astfel de bibliotecă este partajabilă, deci poate fi utilizată de toate procesele din sistem. Biblioteca de funcţii sistem este în fapt o colecţie de funcţii care se pot lega la programe în două moduri : − static, la sfâr şitul compilării unui program (static linking) − dinamic, pe parcursul execuţiei unui proces (dynamic linking). Legarea funcţiilor de bibliotecă la un program (proces) se face o singur ă dată şi are avantajul eficienţei, deoarece la execuţie cererea de servicii devine un apel obişnuit de funcţie în spaţiul procesului, deci se execută cu viteză mare.
53
: Codul bibliotecilor partajate care se încarcă dinamic poate să fie mai ineficient decât codul de program obişnuit, deoarece trebuie să fie PIC (Position Independent Code).
Observa ţ ie ie
Exemple
1. Sistemul de Operare MS-DOS poate fi considerat de tip bibliotecă de funcţii deoarece serviciile solicitate de procese sunt efectuate de un ansamblu de funcţii DOS ( sunt 2 categorii de func ţii:DOS, (apelabile prin INT 021H) şi BIOS).Aceste funcţii au următoarele caracteristici : − o funcţie DOS este un rudiment de apel sistem − funcţiile DOS sunt eficiente (rapide) pentru că neexistând memorie virtuală nu există nici translaţie de adrese − apelul funcţiilor DOS se face prin întreruperi software (INT 021h) şi nu prin plasarea argumentelor pe o stivă. 2. Sistemul de Operare Exokernel este de tip bibliotecă de funcţii. La acest sistem nucleul este aproape complet înlocuit : − cu biblioteci de funcţii care se pot lega la procesele utilizator utili zator − cu maşini virtuale pentru rularea diverselor tipuri de aplicaţii. 3. Sistemul de Operare Windows NT, deşi este considerat de tip microkernel, plasează serviciile cele mai frecvent solicitate într-o bibliotecă sistem.
3.1.3. Sisteme monolitice Sistemele de Operare care plasează majoritatea serviciilor în cadrul nucleului sunt considerate de tip monolitic. Nucleul acestor sisteme are următoarele tr ăsături caracteristice : − este relativ inflexibil; greu de modificat − asigur ă o separaţie netă între spaţiul propriu de adrese şi cel al proceselor utilizator − exercită un control strâns al operaţiilor efectuate de procese şi impune respectarea politicilor de alocare resurse. Următoarele componente ale unui nucleu de Sistem de Operare monolitic sunt utilizate pentru efectuarea serviciilor (Figura 3.2.) :
54
−
− −
procedura (rutina) principală, care preia orice apel sistem şi detectează care este procedura (modulul sistem) care va efectua serviciul solicitat de procesul apelant setul de proceduri de serviciu care execută apelurile sistem setul de proceduri utilitare care sunt folosite de procedurile de serviciu. Procedur ă principală
Procedur ă de serviciu
Procedur ă utilitar ă
Procedur ă de serviciu
Procedur ă utilitar ă
…….
Procedur ă utilitar ă
Procedur ă de serviciu
Procedur ă utilitar ă
Procedur ă de serviciu
…….
Procedur ă utilitar ă
Figura 3.2. Structurarea serviciilor în cadrul nucleu monolitic. Exemple
Cele mai cunoscute Sisteme de Operare de tip monolic sunt : sistemele UNIX, Windows 95, RSX ,VMS Sistemele de Operare din familia UNIX constituie exemple tipice de sisteme cu nucleu monolitic. Categoriile de servicii oferite de un nucleu UNIX sunt : − servicii legate de gestiunea proceselor : o depanarea şi măsurarea (profiling) proceselor o planificarea şi execuţia proceselor comunicaţia inter-procese prin conducte, semnale, memorie o partajată, semafoare, mesaje − servicii legate de gestiunea resurselor : o accounting (contabilizarea utilizării resurselor) tarifare după consumul resurselor o − servicii legate de gestiunea memoriei virtuale şi de alocarea /eliberarea memoriei − servicii legate de protecţie şi securitate.
55
Pe lângă aceste servicii, care sunt furnizate de orice tip nucleu, sistemele UNIX includ în nucleu şi alte servicii suplimentare. Acest lucru conduce la plasarea sistemelor UNIX în categoria celor monolitice. Aceste servicii suplimentare sunt : − managementul perifericelor şi operaţiile cu fişierele − protocoale de comunicaţie în reţea (ex: TCP/IP) − timere, alarme şi legarea dinamică.
3.1.4. Sisteme de tip micro-kernel Un Sistem de Operare care posedă un nucleu de tip micro-kernel (micronucleu) se caracterizează prin următoarele tr ăsături : − nucleul furnizează un minim de servicii proceselor, şi are dimensiune redusă − marea majoritate a serviciilor sunt asigurate de procese “server”, care îndeplinesc solicitările unor procese “client” − comunicaţia între procesele server şi procesele client se face prin mesaje, prin intermediul intermediul nucleului Sistemului de Operare − modul în care un serviciu este invocat de către client este trimiterea unui mesaj ce este interceptat şi direcţionat de nucleul Sistemului Sistemului de Operare către un server − comunicaţia inter-procese este eficientă şi flexibilă. ăşoar ă activitatea după un ciclu de mai mulţi paşi : Un proces server î şi desf ăş − aşteaptă în starea blocat cereri de la clienţi − la apariţia unei cereri creează un fir de execuţie, căruia îi pasează mesajul primit spre prelucrare de la client − firul de execuţie decodifică mesajul, execută operaţia cerută, r ăspunde şi se încheie.
Un proces server din cadrul unui Sistem de Operare micro-kernel poate executa mai multe cereri simultan. Acest proces nu va consuma resurse deoarece în intervalele de aşteptare el este în starea blocat. Se pot enumera principalele avantaje ale Sistemelor de Operare de tip micro-kernel: − modularitate : interacţiunea inter-procese se face prin interfeţe bine precizate (mesaje), şi nu prin variabile globale, ceea ce asigur ă consistenţa codului nucleului
56
− −
−
scalabilitat: pot fi adăugate servere pentru servicii suplimentare distribuire facilă: nu contează pe ce maşină se află serverul apelat de procesul client adaptabilitate: serverele pot fi adăugate în funcţie de necesităţile aplicaţiilor care vor rula pe maşina respectivă.
Pe de altă parte, dezavantajele arhitecturilor micro-kernel sunt : − costul serviciilor este ridicat deoarece sunt necesare prea multe apeluri sistem pentru manipularea mesajelor cu împachetarea şi despachetarea argumentelor mesajelor − mesajele sunt copiate de mai multe ori înainte de a fi livrate. Sisteme de Operare distribuite
Un Sistem de Operare distribuit este un ansamblu de Sisteme de Operare de tip micro-kernel care rulează pe echipamente de calcul interconectate în reţea. Aceste Sisteme de Operare micro-kernel rulează procese server care pot fi apelate de pe oricare altă maşină din reţea. Lansarea unei cereri de servicii de la un client către un proces server se poate face prin mecanismul denumit RPC, apel de procedura la distanţă (Remote Procedure Call ). Un apel de procedur ă la distanţă este de fapt o lansare în execuţie efectuată de un proces client a unei proceduri (funcţii) care apar ţine unui proces server localizat pe o altă maşină din reţea. Procedura este lansată în scopul de a efectua un anumit serviciu pentru procesul apelant (client). Apelurile de procedur ă la distanţă funcţionează după următoarele principii : − se face localizarea (binding-ul) serverului care ofer ă serviciul − sunt construite automat funcţiile de manipulare mesaje pentru client şi server (numite stubs) pe baza specificaţiilor oferite de server pentru procedur ă apelată.
Stub-urile sunt funcţii apelate de procesul client şi de procesul server şi sunt generate de compilatoare din descrierea interfeţei lor (tipul argumentelor şi al rezultatelor cerute). Aceste funcţii realizează: − împachetarea argumentelor procedurii într-un mesaj (marshalling) − trimiterea mesajul astfel creat − despachetarea (demarshalling) r ăspunsului la recepţia unui mesaj.
57
SERVER
CLIENT 11
6
1 5 2
3
4 8
10 STUB
7
9
STUB
1. clientul cheamă stub-ul 2. împachetare (marshalling) 3. stub-ul client trimite mesaj 4. despachetare (demarshalling) 5. apelul procedurii în server 6. execuţia procedurii în server 7. procedura serverului se întoarce 8. stub-ul împacheteaz ă rezultatele 9. rezultatele sunt transmise la client 10. stub-ul client despachetează 11. stub-ul client se întoarce
Figura 3.3. Etapele unui apel de procedur ă la distanţă. Windows NT - un Sistem de Operare de micro-kernel
Windows NT este un Sistem de Operare de tip micro-kernel (micro-nucleu) având particularităţi arhitecturale şi de funcţionare : − serverul de ecran, care se ocupa de grafică şi afişare face parte din nucleul sistemului − serverul Win95 (pentru rularea aplicaţiilor Windows 95) face parte din nucleul sistemului − comunicaţia între procesele server şi cele client se face prin tehnica LPC (Local Procedure Call ) care este un apel RPC simplificat pentru două procese rulând pe aceeaşi maşină. Apelul de procedur ă locală LPC se caracterizează prin faptul că este eliminată conversia datelor şi este evitată copierea argumentelor de dimensiune mare (fenomen care duce la risipă de timp şi spaţiu), prin folosirea unor zone de memorie partajate . Procesul client depune datele în zona partajată, transmiţând procesului server adresa şi descrierea acestei zone. Prin intermediul nucleului Sistemului de Operare Windows NT, zona partajată devine vizibilă pentru procesul server, care prelucrează datele stocate aici de client. La încheierea prelucr ărilor zona partajată devine din nou “invizibilă” pentru procesul server, iar clientul poate accesa şi utiliza aceste date.
58
O altă particularitate a Sistemului de Operare Windows NT este utilizarea prealocării de resurse. Prin această tehnică este creat un fir de execuţie special în cadrul serverului pentru fiecare client foarte activ. Acest fir care va executa numai cererile clientului respectiv şi va “supravieţui” cât timp acel client este activ (firul nu mai este distrus după efectuarea unui anumit serviciu). O zonă de memorie partajată este alocată permanent pentru client şi pentru firul de execuţie de pe server care lucrează cu acel client, şi ca urmare operaţiunile de gestionare memorie sunt simplificate. În completare, un “întrerupător” software, numit pereche de evenimente (event-pair ), este alocat între cele două procese, client şi server, pentru a se realiza semnalizarea reciprocă. Aspecte de implementare ale arhitecturilor micro-kernel
Sistemele de Operare de tip micro-kernel plasează majoritatea serviciilor în cadrul unor procese externe, procesele server. Acest mod de lucru are ca implicaţie principală simplificarea activităţii de gestiune a proceselor nivelul nucleului. Ca fenomen negativ se constată o anumită fragmentare a serviciilor : un serviciu oferit în mod tradiţional de nucleu este adesea compus din mai multe servicii oferite de servere diferite. Această fragmentare conduce la creşterea timpului de r ăspuns pentru o cerere de serviciu venită de la un client. Creşterea timpului de r ăspuns este cauzată şi de faptul că mesajele trebuie să treacă mai multe “graniţe” în deplasarea lor de la client la server şi invers. În cazul sistemului Windows NT, care posedă o arhitectur ă micro-kernel tipică, se încearcă recuperarea eficienţei prin plasarea unor servicii mai des solicitate direct în nucleu. Acest lucru dă sistemului Windows NT o anumită caracteristică de monolit. Pe de altă parte, ideea de a folosi procese server exterioare nucleului este implementată în cazul unor sisteme monolitice cunoscute cum ar fi UNIX, care rulează mai multe servere : − serverul NFS, pentru accesul fişierelor la distanţă − super-serverul inetd, care poate porni la cerere alte servere : servere de acces la distanţă : telnet, rlogin, rsh, rexec o o servere de poştă electronică : smtp, uucp − serverul de transfer fişiere : ftp şi serverul WWW − serverul de nume named , serverele de raportare erori syslogd, klogd − serverul de ferestre X Windows. 59
3.1.5. Amplasare a serviciilor sistem – câteva concluzii Toate cele trei modele de plasare a serviciilor sistem prezentate anterior rezolvă într-un fel particular următoarele două probleme : − Ce resursă se alocă unui proces în vederea satisfacerii unei cereri de servicii : o funcţie de bibliotecă, un modul al nucleul Sistemului de Operare sau un proces server ? − Unde trebuie plasat un serviciu? (însu şirile unui serviciu depind în mod esenţial de plasarea sa) : în cadrul unei biblioteci de funcţii sistem, în cadrul nucleului Sistemului de Operare sau în cadrul unui proces server ? Pornind de la soluţiile adoptate pentru rezolvarea celor două probleme, se pot nota şi alte diferenţe dintre arhitecturile de tip bibliotecă de funcţii şi cele monolit, pe lângă cele evidenţiate în secţiunile anterioare. Aceste diferenţe se refer ă la : − durata de viaţă a informaţiei : anumite informaţii de interes nu pot supravieţui la încheierea unui proces, în cazul bibliotecilor de funcţii − siguranţa informaţiei : informaţiile globale din sistem sunt mai ţinute de nucleul Sistemului de Operare, care bine men supravieţuieşte tuturor proceselor utilizator. Atât Sistemele de Operare monolitice cât şi cele de tip micro-kernel utilizează procese server pentru a rezolva cereri de servicii venite de la procesele utilizator. Cu toate acestea, există diferenţe între sistemele monolitice şi cele micro-kernel, în ceea ce priveşte utilizarea serverelor distribuite în reţea. Aceste diferenţe se refer ă la : − siguranţa gestionării cererilor : o un nucleu monolit, dacă este operaţional, r ăspunde întotdeauna la cererile de servicii ale proceselor o un micro-nucleu nu garantează că un server va r ăspunde la o cerere de servicii, atunci acesta se găseşte pe altă maşină decât clientul care a emis cererea; − legitimitatea cererilor de servicii : la sistemele micro-kernel cu servere distribuite în reţea trebuie adăugat un mecanism de verificare a identităţii clientului care a lansat o cerere, lucru ne-necesar în cazul sistemelor monolit. 60
3.2. CLASIFICAREA DUPĂ MODELUL STRUCTURAL Acest mod de clasificare ia în consideraţie arhitectura generală a Sistemelor de Operare. Câteva clase de Sisteme de Operare care se pot eviden ţia după acest criteriu sunt următoarele : − Sisteme de Operare slab-structurate − Sisteme de Operare ierarhizate − Sisteme de Operare de tip maşină virtuală
3.2.1. Sisteme de Operare slab structurate Sistemele de Operare slab structurate nu prezintă o organizare internă bine conturată, în sensul de grupare a componentelor sistemului sau ale nucleului pe niveluri func ţionale clar delimitate Cele mai cunoscute sisteme din această clasă sunt MS-DOS şi UNIX. În cazul ambelor Sisteme de Operare se poate evidenţia o anumită structurare la nivel general sistem. La nivelul nucleului însă, sistemul MS-DOS este nestructurat iar sistemele UNIX prezintă a structur ă destul de simplă. Sistemul de Operare MS-DOS se caracterizează printr-un model de organizare internă care permite programelor de aplicaţie să aibă acces la nivelul rutinelor de intrare/ieşire de bază. Cu alte cuvinte, un program de aplicaţie poate să acceseze în mod direct o resursă (disc, memorie video, etc..) f ăr ă a mai invoca nucleul sistemului MsDOS (Figura 3.4.). Acest fenomen a f ăcut Sistemul de Operare MS-DOS extrem de vulnerabil la erorile de programare şi/sau la viruşii informatici. : Accesul programelor de aplicaţie la componentele de bază ale sistemului MS-DOS este o consecinţă a permiterii accesului la hardware-ul Sistemului de Calcul. Anumite microprocesoare din familia 80x86 nu au permis implementarea celor două moduri de lucru, master şi slave, care diferenţiază contextul de execuţie al modulelor sistem de cel al programelor de aplicaţie. Reamintim că sistemul MS-DOS rulează pe maşini având Unitatea Centrală construită în jurul unui microprocesor 80x86. Observa ţ ie
61
Programe de aplica ţie Nucleu rezident Drivere MS-DOS Drivere ROM-BIOS Sistem de Operare
Figura 3.4. Structura generală a sistemului MS-DOS. Sistemele de Operare din familia UNIX constituie un alt exemplu de organizare internă limitată. Un sistem UNIX este alc ătuit din următoarele componente principale (Figura 3.5.) − nucleu − interfaţa pentru apeluri sistem − biblioteca de funcţii sistem. Programe utilitare
Nucleu
shell (interpretoare de comenzi) compilatoare biblioteca sistem interfaţa pentru apeluri sistem semnale gestiunea fi şierelor planificarea UC Sistem de gestiunea swapping gestiune pagini Operare terminalelor I/E în mod I/E în mb bloc memorie virtuală caracter drivere de drivere de disc şi drivere de terminal bandă memorie
Figura 3.5. Organizarea internă a unui Sistem de Operare UNIX. Nucleul unui sistem UNIX este format din tot ce se află direct deasupra hardware-lui maşinii. El conţine o multitudine de module negrupate anumită ierarhic, dar există un nivel de bază format din driverele care lucrează direct cu interfeţele fizice. Acest mod de organizare nu este totuşi valabil pentru orice sistem din familia UNIX : sistemul UNIX IBM, AIX posedă un nucleu separat în mai multe niveluri. 62
3.2.3. Sistemele de operare ierarhizate Sistemele de Operare ierarhizate propun o soluţie de modularizare prin gruparea componentelor sistemului pe mai multe niveluri structurale. Un nivel este o încapsulare a unor structuri de date şi a unor operaţii ce se pot efectua asupra acestor date. Fiecare nivel este construit pe baza celui inferior lui şi este alcătuit dintr-un set de rutine care furnizează servicii nivelului imediat superior. În acest fel, un nivel cunoaşte serviciile furnizate de nivelul inferior, f ăr ă să cunoască modul de implementare a acestora. Primul Sistem de Operare ierarhizat pe nivele a fost THE, realizat şi implementat de E.W. Dijsktra şi de elevii săi la Universitatea Eindhoven din Olanda în anul 1968 (Figura 3.6.). Nivelul 5 Nivelul 4 Nivelul 3 Nivelul 2 Nivelul 1 Nivelul 0
Programele utilizator Gestiunea operaţiilor de intrare/ieşire Comunicaţia cu consola sistem Gestiunea memoriei Multiprogramarea Unităţii Centrale Hardware (maşina fizică)
Figura 3.6. Structura Sistemului de Operare THE. La sistemul THE funcţiunile şi rolurile nivelurilor au fost următoarele : Nivelul 0 reprezinta maşina fizică Nivelul 1 conţinea modulele pentru multiprogramarea UCP şi realizarea planificării proceselor (după un algoritm bazat pe priorităţi), precum şi pentru sincronizarea proceselor prin semafoare. Nivelul 2 conţinea modulele de gestiune ale memoriei şi implementa memoria virtuală şi de swapping-ul (evacuare/reîncărcate pagini pe disc). Nivelul 3 cuprindea modulele de comunicaţie procese-consolă operator. Nivelul 4 realizea gestiunea operaţiilor de intrare/ieşire. Schimburile de informaţie între procesor şi dispozitive se efectua prin intermediul tampoanelor (buffers). Deasupra acestui nivel dispozitivele periferice apăreau programelor utilizator ca dispozitive abstracte cu care se puteau efectua operaţii logice de transfer de date. ţinea programele aplicative ale utilizatorilor Nivelul 5 con 63
Un alt exemplu clasic de sistem ierarhizat a fost Sistemul de Operare MULTICS. Acest sistem a fost dezvoltat la sfâr şitul anilor ’60 în cadrul laboratoarelor Bell şi a fost implementat pe un model de calculator de generaţia a III-a produs de General Electrics. Sistemul de Operare MULTICS organizat logic ca o colecţie de inele concentrice la care nucleul formează inelele interioare iar procesele utilizatorilor alcătuiesc învelişul exterior. Câteva caracteristici notabile ale sistemului MULTICS: − Sistemul de Operare era văzut în cadrul proceselor utilizator ca parte din spaţiul propriu de adrese − pentru prevenirea acceselor neautorizate există mecanisme hardware de protecţie la citirea, scrierea şi execuţia segmentelor de memorie − ierarhizarea proceselor pe nivele există şi în cadrul programelor utilizator − apelul unei proceduri de nivel inferior se face printr-o instrucţiune TRAP (deci printr-o întrerupere) cu transmitere de parametri. Arhitectura modularizată a sistemului MULTICS a facilitat dezvoltarea şi depanarea mai rapidă a acestui sistem. Dezavantajele sistemului MULTICS au fost însă mai multe : − dificultate în definirea adecvată a conţinutul fiecărui nivel, astfel încât să existe un optim în funcţionarea Sistemului de Operare − apelurile sistem erau lente deoarece la execuţia unui apel sistem era necesar ă parcurgerea succesivă a mai multor niveluri până la găsirea modulului care efectua serviciul solicitat de procesul apelant; parcurgerea unui nivel ducea de fiecare dată la supraîncărcarea apelului sistem. Aceste dezavantaje au fost sesizate la toate Sistemele de Operare ierarhizate pe niveluri, ceea ce a provocat un recul în implementarea acestui model. Dintre Sistemele de Operare moderne, OS/2 dezvoltat de IBM posedă o structur ă internă bazată pe nivele ierarhice.
64
3.2.4. Sisteme de Operare de tip Maşină virtuală Maşina Virtuală este un model arhitectural care se bazează pe ideea că multiprogramarea Unităţii Centrale poate fi separată de celelalte activităţi ale unui Sistem de Operare. Un Sistem de Operare de tip maşină virtuală se numeşte Monitor de maşină virtuală. Monitorul de maşină virtuală este un nucleu minimal de Sistem de Operare care poate furniza mai multe “copii” ale maşinii fizice. Aceste copii au fost denumite maşini virtuale. Fiecare maşină virtuală trebuie să fie capabilă să simuleze sistemul de tratare întreruperi precum şi modurile de lucru supervizor şi utilizator care se întâlnesc la orice nucleu. Teoretic, o maşină virtuală poate să ruleze orice alt nucleu de Sistem de Operare, care se va prezenta utilizatorilor ca o maşină extinsă dotată cu sistem de fişiere şi cu toate celelalte facilităţi obişnuite. . Primul Sistem de Operare de tip monitor de maşină virtuală a fost VM370, realizat de o echipă de la Centrul de cercetare IBM de la Cambridge în anul 1970. Acest sistem furniza mai multe copii ale hardware-ului maşinii şi simula existenţa pe acelaşi calculator a mai multor Unităţi Centrale lucrând simultan şi separat. Pe aceste copii ale maşinii fizice rulau mai multe sisteme CMS. Sistemul de Operare CMS a fost produs de IBM şi este un sistem monoutilizator interactiv Maşini virtuale IBM 370
Aplicaţii utilizator
Aplicaţii utilizator
Aplicaţii utilizator
Sistem de Operare Sistem de Operare Sistem de Operare CMS CMS CMS Monitor de ma şina virtuală VM/370 Maşina fizică IBM 370
Figura 3.7. Arhitectura unui Sistem de Operare de tip maşină virtuală. 65
După o perioadă în care a fost abandonat, în ultimii ani modelul de maşină virtuală a fost revitalizat sub forma unor sisteme software dedicate rulării unor Sisteme de Operare sub alte sisteme (VMware). Exemple
Unii producători de minicalculatoare din anii ’90 (Sun Microsistems sau Digital Equipment), au implementat maşini virtuale Intel (care simulează funcţionarea unui procesor Intel 80x86) pentru permite rularea aplicaţiilor MS-DOS şi Windows pe platformele proprii. Maşina virtuală Java este un alt exemplu de sistem software care permite rularea de cod executabil (byte-cod ) pe diferite platforme hardware.
3.3. CLASIFICAREA DUPĂ MODUL DE ACCES LA SERVICII Modul de acces servicii se refer ă la felul în care utilizatorul pune în lucru (are acces la) serviciile oferite de un Sistem de Operare. Din punct de vedere istoric se pot distinge două categorii de Sisteme de Operare : − Sisteme de Operare cu prelucrare pe loturi − Sisteme de Operare interactive.
3.3.1 Sisteme de Operare cu prelucrare pe loturi Acestea au fost primele Sisteme de Operare utilizate pe scar ă largă. Ele se caracterizează prin faptul că utilizatorul era complet izolat de sistem. Intervalul de timp între predarea unei lucr ări şi primirea rezultatelor putea fi foarte mare, în mare parte datorită combinaţiei de proceduri automate şi manuale de pe fluxul parcurs de lucrare în sistem (Figura 3.8.).
2
1 Receptie lucr ări Eliberare rezultate
5
Introducere lucrare într-un lot de lucr ări
3 4
Execuţie lucrare
Imprimare rezultate
Sistem de calcul
Figura 3.8. Fluxul de execuţie al unei lucr ări. 66
Fluxul parcurs de o lucrare în sistem era alcătuit din mai multe etape: Etapa 1 era prezentarea lucr ării pe cartele sau suport magnetic la oficiul de recepţie/predare Etapa 2 constă din introducerea lucr ării într-un lot aflat sub formă de fişier pe disc; acest fişier era apoi prelucrat prin spooling Etapa 3 constă din execuţia lucr ării (conform unei planificări automate sau manuale) Etapa 4 constă din imprimarea rezultatelor din fişierul de ieşire al lotului Etapa 5 constă din predarea rezultatelor lucr ării utilizatorului. Prelucrarea pe loturi există sub forma fişierelor de comenzi la şi la Sistemele de Operare moderne. Scripturile utilizate în cadrul unor Sisteme de Operare sunt de fapt secvenţe de comenzi care se execută cu înlănţuire automată ca şi lucr ările dintr-un lot.
3.3.2. Sisteme de Operare cu acces interactiv Aceste sisteme permit interacţiunea directă a utilizatorului cu calculatorul. Prin intermediul unor terminale sau staţii de lucru sunt emise (în mod grafic sau alfanumeric) comenzi către Sistemul de Operare. Comenzile sunt executate într-un timp convenabil, timpul de r ăspuns al Sistemului de Operare este suficient de mic pentru a crea impresia de execuţie instantanee. Unele Sisteme de Operare privilegiază un anumit terminal, care joacă rolul de consolă sistem. De la consola sistem se demarează Sistemul de Operare şi tot aici sunt afişate mesaje de interes general (mesaje de stare sistem, mesaje de eroare, avertismente, etc.).
3.4. CLASIFICAREA DUPĂ TIPUL DE SERVICII OFERITE DE SISTEM Această clasificare ia în considerare facilităţile oferite de Sistemul de Operare pentru dezvoltarea şi rularea aplicaţiilor. Pe baza acestui criteriu pot fi decelate două mari clase de Sisteme de Operare : − Sisteme de Operare de multiprogramate − Sisteme de Operare de timp real.
67
3.4.1. Sisteme de Operare multiprogramate Sisteme de Operare multiprogramate permit execuţia cvasi-simultană a mai multor programe (procese) şi/sau lucrul interactiv cu mai mulţi utilizatori. Simultaneitatea este simulată prin comutarea UCP între procese. Deoarece viteza de lucru a procesoarelor actuale este de ordinul milioanelor de operaţii pe secundă, comutarea este transparentă pentru utilizatorii interactivi, care percep sistemul de calcul ca pe o maşină care le este alocată individual. Sistemele care implementează multiprogramarea UCP se clasifică în : − Sisteme de Operare multitasking-monouser, care permit execuţia (cvasi) simultană a mai multor programe şi lucrul cu un singur utilizator interactiv; cele mai cunoscute sisteme din această categorie sunt : Windows 95, Windows 98, Windows NT, Windows XP, sistemele MAC OS, etc.. − Sisteme de Operare multitasking - multiuser care permit execuţia (cvasi) simultană a mai multor programe şi lucrul simultan cu mai mulţi utilizatori interactivi; cele mai cunoscute sisteme din această categorie sunt : sistemele UNIX, VMS, OS/2, ş.a. Sistemele de Operare multiprogramate nu permit evaluarea precisă a duratei de execuţie a unui proces, această durată depinzând de incărcarea sistemului la momentul execuţiei. Ca urmare, aceste sisteme nu sunt adecvate pentru rularea aplicaţiilor cu restricţii de timp. Deşi cele moderne pun la dispoziţia programelor anumite servicii pentru gestionarea timpului, se consider ă că aceste Sisteme de Operare nu sunt adecvate pentru rularea aplicaţiilor în care restricţiile de timp sunt importante. Sistemele de Operare multiprogramate sunt cele mai r ăspândite deoarece permit dezvoltarea şi rularea unei game largi de aplicaţii din domeniul ştiinţific, tehnic, economic, financiar, etc. Aceste sisteme sunt considerate Sisteme de Operare de uz general.
68
3.4.2. Sistemele de Operare de timp real Sistemele de Operare de timp real permit dezvoltarea şi rularea aplicaţiilor care funcţionează în cadrul unor limite de timp bine precizate. Pentru a satisface aceste cerinţe, sistemul pune la dispoziţia programelor facilităţi avansate pentru gestionarea timpului şi a evenimentelor. Sistemele de Operare de timp real rulează, de regulă, pe calculatoare implicate nemijlocit în funcţionarea unor instalaţii tehnologice. La aceste sisteme limitele de timp pentru efectuarea interacţiunilor aplicaţiilor cu instalaţiile industriale supravegheate sau comandate sunt stricte şi sunt dictate de natura procesului tehnologic. Sistemele de Operare de timp real rulează pe calculatoare care sunt conectate la procesul tehnologic prin intermediul unor interfeţe specializate : convertoare (numeric-analogice, analog-numerice), interfeţe pentru intr ări numerice, ieşirii numerice, ş.a. Sistemul de Operare trebuie să posede în acest caz modulele (drivere-le) pentru controlul acestor interfeţe. Aplicaţii de supervizare şi conducere procese
Traductor Traductor
Proces tehnologic
Sistem de Operare de timp real
Proces tehnologic
CAN
Maşina fizică ÎN
EN
Semnale de la procesul tehnologic
CNA
Traductor Traductor
Comenzi către procesul tehnologic
Figura 3.9. Structura unui sistem de calcul pentru conducere procese Sisteme de Operare de timp real rigid
Aceste Sisteme de Operare garantează efectuarea prelucr ărilor critice într-un timp bine precizat, dar pe de altă parte, majoritatea serviciilor evoluate nu sunt implementate.
69
Se caracterizează prin limitarea tuturor activităţilor proprii ale Sistemului de Operare : − eliminarea unor componente hardware a căror funcţionare se face cu un consum mai mare timp (memoria disc este inexistentă sau foarte redusă) − stocarea datelor se face în memoria internă De cele mai multe ori Sistemele de Operare de timp real rigid sunt dedicate, adică sunt proiectate pentru a rula pe un anumit tip de calculator de proces sau pentru a executa un anumit tip de aplicaţii de supraveghere sau control procese. Sisteme de Operare de timp real suplu
Aceste Sisteme de Operare mai puţin restrictive, în sensul că pot să includă facilităţi evoluate: multiprogramarea Unităţii Centrale de Procesare, memoria virtuală, lucrul interactiv cu utilizatorii, ş.a. Cu toate acestea, activităţile curente ale nucleului sunt pe cât posibil limitate în timp. Sistemele de Operare de timp real suplu permit execuţia cu prioritate sporită sau f ăr ă întreruperi a unor secvenţe de cod din procese. Ele ofer ă un întreg set de apeluri sistem pentru gestionarea timpului şi a evenimentelor, sau permit execuţia unor operaţii neîntreruptibile pentru tratarea evenimentelor. Sistemele de Operare de timp real suplu sunt folosite ca: − suport pentru aplicaţii multimedia, de divertisment sau de realitate virtuală − suport în proiecte ştiinţifice legate de cercetarea submarină, zborurile cosmice, etc. Exemple
Printre cele mai cunoscute Sistemele de Operare de timp real suplu se află sistemele RSX şi VMS. În familia sistemelor UNIX există şi unele variante de timp real, cum ar fi QNX.
70
4. GESTIUNEA PROCESELOR 4.1. CONCEPTUL DE PROCES Procesul este forma sub care se află în cadrul Sistemului de Operare orice program lansat în execuţie. Un proces este o secvenţă de acţiuni a1 , a2 , .., an unde o acţiune ai corespunde unei instrucţiuni din programul care a generat acel proces. Programul este o entitate pasivă stocată într-un fişier pe disc iar procesul este o entitate activă stocată (par ţial sau în totalitate) în memoria internă. Starea unui proces se modifică pe durata existenţei sale în sistem. Starea unui proces la un moment dat este determinată de sensul prelucr ărilor efectuate de proces şi de contextul general al Sistemului de Operare (ceea ce mai există şi ceea ce se întâmplă în acel moment în sistem). Se consider ă că starea unui proces la un moment dat este descris ă de următoarele informaţii : − codul programului prin lansarea căruia a fost generat procesul − valorile tuturor variabilelor apar ţinând procesului − istoricul apelurilor de funcţii (pentru funcţiile în curs de execuţie) − valoarea contorului de instrucţiuni şi a registrului de stare program − informaţiile despre resursele folosite în acel moment de către proces. Localizarea acestor informaţii este prezentată în tabela de mai jos. Element Locul de stocare Codul programului în memorie, în segmentul de cod al procesului Variabilele în memorie, în segmentul de date al procesului Funcţiile în curs de în memorie, în segmentul de stiv ă al execuţie procesului Contorul de Instruc ţiuni în registrul PC al Unităţii Centrale Registrul de Stare Program în registrul PSW al Unităţii Centrale Informaţii despre resursele în memorie, în structurile de date nucleului utilizate de proces
Tabela 4.1. Conţinutul unei intrari în Tabela Proceselor la sistemul UNIX. 71
Pentru a realiza transformarea unui program într-un proces, Sistemul de Operare trebuie : − să aloce spaţiul de memorare corespunzător pentru fiecare dintre elementele enumerate − să plaseze în registrul Contor de Instrucţiuni (PC), adresa primei instrucţiuni din codul executabil al programului respectiv ; − să plaseze în Registrul de Stare Program (PSW) informaţiile privind modul de execuţie (master sau slave) al acelui program. Dintre toate elementele care compun informaţia de stare a unui proces, singurul care r ămâne neschimbat pe tot parcursul execuţiei procesului este codul programului. Ca urmare, atunci când este necesar ca un program să fie executat simultan în mai multe instanţe, acelaşi cod executabil poate fi partajat de mai multe procese (sau altfel spus, “executat cu Contoare de Instrucţiuni diferite”). Folosirea în comun de către mai multe procese a codului executabil al unui program se numeşte reentranţă. Modulele nucleului sunt reentrante la majoritatea Sistemelor de Operare multiprogramate sau în time-sharing
4.2. MODELE DE EXECUŢIE A PROCESELOR 4.2.1. Multiprogramare şi multitasking Calculatoarele moderne permit incărcarea simultană în memorie a mai multor programe, în scopul execuţiei lor concurente. Ca urmare, Sistemul de Operare trebuie să exercite un control mai strâns al execuţiei programelor şi să aplice o mai mare separaţie între programe. Această evoluţie a condus la apariţia conceptului de proces, ca formă de abstractizare a noţiunii de program. Modul de gestionare a execuţiei proceselor constituie un element ce caracterizează în principal orice Sistem de Operare: − dacă procesele sunt executate integral în ordine strict secvenţială, în concordanţă cu momentele apariţiei lor în sistem, atunci acel Sistem de Operare este de tip monotasking (şi implicit mono-user, deci un singur utilizator poate lucra interactiv cu sistemul la un moment dat)
72
−
dacă un Sistem de Operare gestionează execuţia proceselor folosind ca tehnică multiplexarea Unităţii Centrale a calculatorului, atunci acel Sistem de Operare se va numi multitasking. În acest caz comutarea Unităţii Centrale de la un proces la altul este asigurată prin mecanisme hardware şi software şi se desf ăşoar ă astfel : o la un moment dat UCP execută instrucţiuni apar ţinând unui singur proces; după un interval de timp, Unitatea Centrală (care joacă rolul unei “resurse de execuţie a programelor”), este rechiziţionată de la procesul curent şi alocată unui alt proces, aflat în aşteptare pentru “resursa de execuţie” o fenomenul se repetă până când toate procesele aflate în aşteptare pentru execuţie primesc resursa UCP, sau pân ă la apariţia unui eveniment extern care trebuie tratat tot prin lansarea în execuţie a unui proces. o modelul de gestionare a proceselor într-un sistem multitasking conduce la execuţia completă într-un interval de timp a mai multor programe, deşi la un moment de timp oricare UCP execută o singur ă instrucţiune apar ţinând unui singur proces.
Execuţia “întreţesută” a proceselor, care este specifică Sistemelor de Operare multitasking, nu influenţează (nu trebuie să influenţeze) rezultatele de prelucrare a datelor, ci doar durata totală de execuţie a fiecărui proces. Această durată devine practic mai mare : fiecare proces se execută ca şi cum ar avea o Unitate Centrală proprie care funcţionează alternând intervale de lucru cu intervale de pauză (aşteptare). Deoarece la calculatoarele moderne viteza de lucru a Unităţii Centrale este foarte mare (poate ajunge la câteva milioane de operaţii pe secundă), utilizatorii care lucrează simultan şi interactiv cu un Sistem de Operare multitasking nu percep fenomenul de execuţie întreţesută a proceselor. Cu alte cuvinte, datorită diferenţei dintre timpii de percepţie umani şi viteza de procesare a calculatorului, utilizatorii interactivi ai unui Sistem de Operare multitasking sunt serviţi ca şi cum ar exista o Unitate Centrală de Procesare alocată pentru fiecare în parte.
73
4.2.2. Modelul de execuţie concurentă a proceselor Un proces este o activitate coerentă şi cu un scop bine precizat din cadrul unui Sistem de Operare. Acesta activitate (procesul) se amorsează prin lansarea în execuţie a unui program executabil şi este caracterizată în orice moment prin informaţii specifice de stare. Dacă în cadrul unui Sistem de Operare există simultan mai multe procese aflate în diverse stadii de execuţie, care partajează resursa Unitate Centrală prin excludere mutuală (un singur proces se execută la un moment dat, mai multe procese s-au executat într-un interval de timp), atunci se spune că acel Sistem de Operare implementează modelul multiprogramării, sau modelul de execuţie concurentă a proceselor. Desf ăşurarea proceselor, în sensul atingerii obiectivelor de prelucrare a datelor, nu este afectată de execuţia pseudoparalelă bazată pe comutarea Unităţii Centrale. Fiecare proces se desf ăşoar ă ca şi cum fiecare ar avea propria sa Unitate Centrală. Comutarea Unităţii Centrale între procese se efectuează după un algoritm de planificare deţinut şi aplicat de Sistemul de Operare. Acest algoritm determină momentul de timp la care un proces trebuie suspendat, şi cărui proces îi va fi alocată Unitatea Centrală de Procesare la momentul următor. Modul de execuţie al proceselor într-un mediu multiprogramat (în cadrul unui Sistem de Operare care implementează multiprogramarea proceselor) este redat în Figura 4.1. Fiecare proces A, B, C, D are Contor de Instruc ţiuni propriu
A
B
C
Procese
D C B A
D
Timp
Figura 4.1. Evoluţia proceselor în timp, într-un mediu multiprogramat.
74
Din Figura 4.1. se observ ă că cele patru programe A, B, C, D devin în momentul execuţiei patru procese paralele şi independente A, B, C, D, fiecare având un flux propriu de desf ăşurare. Graficul din Figura 4.1 arată că după un anumit timp toate procesele au progresat, dar că la un moment dat există un singur proces activ. Ca urmare a fenomenului de comutare a Unităţii Centrale precum şi datorită tratării evenimentelor asincrone şi sincrone, într-un mediu multiprogramat progresul proceselor nu este uniform. În consecinţă, nu se poate aprecia cu precizie viteza de execuţie a unui proces şi nici durata de execuţie a acestuia Atunci când un proces care se execută într-un mediu multiprogramat trebuie să starteze o operaţie la un moment precis, sau trebuie să aştepte durate de timp bine stabilite, el apelează la mecanisme speciale puse la dispoziţie de Sistemul de Operare. În afara situaţiilor în care este necesar ă evaluarea cu precizie a timpului, procesele nu sunt afectate de multiprogramare şi de faptul că şi ele se desf ăşoar ă (se execută) cu viteze diferite.
4.2.3. Stările unui proces într-un mediu multiprogramat Starea unui proces este caracterizată în orice moment prin valorile elementelor descrise în secţiunea 4.1. Dacă se ia însă în consideraţie situaţia de execuţie în care se poate afla un proces la un moment dat, se pot evidenţia următoarele stări generice (Figura 4.2.) : − proces în execuţie; − proces gata de execu ţie; − proces blocat
Starea “ în execuţie” corespunde situaţiei în care procesul deţine resursa Unitate Centrală.În acest caz Unitatea Centrală execută instrucţiuni apar ţinând codului procesului. Starea “gata de execu ţie” corespunde situaţiei în care un proces este apt s ă îşi continue execuţia, dar este suspendat provizoriu. Această suspendare este necesar ă pentru a se permite altor procese să progreseze în execuţia lor. Procesele gata de execuţie formează o coadă de aşteptare iar următorul proces care va primi resursa Unitate Centrală este selectat din cadrul acestei cozi, pe baza unui algoritm de planificare care respecta politica generală de lucru a Sistemului de Operare. 75
Starea “blocat” corespunde situaţiei în care un proces aşteaptă apariţia unui eveniment extern, f ăr ă de care nu poate continua. În cele mai multe cazuri blocarea unui proces corespunde cu aşteptarea în vederea terminării unei operaţii de intrare/ieşire. Procesele aflate în starea blocat formează o coadă de aşteptare. Un proces păr ăseşte coada proceselor blocate la apariţia evenimentului aşteptat. Stările 2 şi 3 sunt stări de aşteptare pentru un procesele existente în cadrul unui mediu multiprogramat. Starea de aşteptare “gata de execuţie” este o consecinţă a modului de funcţionare a Sistemului de Operare. La rândul sau, acest mod de funcţionare a fost proiectat şi implementat pentru depăşirea restricţiilor determinate de hardware: nu există suficient de multe procesoare pentru a se acorda câte unul fiecărui proces care trebuie să se execute!. Trecerea în starea gata de execuţie este asincrona faţă de execuţia unui proces. Trecerea în starea blocat este sincronă cu execuţia procesului. Starea blocat pentru un proces este, de regulă inerentă problemei, cu alte cuvinte, algoritmului care implementează în program o anumită prelucrare de date. n execu ie
1
2 3
Blocat
4
Gata de execu ie
Figura 4.2. Stările generice ale unui proces într-un mediu multiprogramat.
Tranziţia 1 se petrece atunci când un proces nu poate s ă îşi continue execuţia, f ăr ă ca un anumit eveniment extern (execuţiei sale) să se producă. La unele Sisteme de Operare tranziţia 1 se petrece prin lansarea de către proces unui apel sistem de tip BLOCK sau WAIT. Tranziţiile 2 şi 3 sunt controlate de Sistemul de Operare, f ăr ă ca procesul să poată influenţa acest fenomen. Tranziţia 2 se petrece atunci când procesul a epuizat timpul de execuţie acordat de Sistemul de Operare. Această tranziţie se produce odată cu apariţia întreruperii de ceas. Tranziţia 3 se produce atunci când procesul este selectat din coadă proceselor gata de execuţie. Procesul va primi dreptul de a se executa până la epuizarea intervalului de timp acordat sau până când va trece în starea blocat. 76
Tranziţia 4 se petrece când evenimentul exterior aşteptat de un proces blocat s-a produs. Procesul va trece din coada proceselor blocate în coada proceselor gata de execuţie şi va aştepta să fie selectat pentru execuţie. Componenta Sistemului de Operare care decide cărui proces din coada proceselor gata de execuţie i se va acorda Unitatea Centrală de Procesare se numeşte Planificator de procese (scheduler). Planificatorul efectuează suspendarea şi relansarea proceselor precum şi gestiunea întreruperilor. Conceptual, se consider ă că Planificatorul de procese constituie nivelul de bază deasupra căruia se află restul componentelor Sistemului de Operare, structurate sub forma unor procese secvenţiale (Figura 4.3). Sistemul de Operare
Proces 1 Proces 2 . . . . . . . Proces n Planificatorul de procese
Figura 4.3. Planificatorul de procese al unui Sisteme de Operare.
4.2.4. Crearea proceselor într-un mediu multiprogramat În cadrul unui Sistem de Operare, un proces poate să creeze unul sau mai multe alte procese prin intermediul unui apel sistem special (un apel sistem este o cerere de servicii adresată de un proces Sistemului de Operare). Procesul care a efectuat crearea se numeşte proces tată, iar noile procese se numesc procese fii. Fiecare proces fiu poate şi el să creeze alte procese fii, etc., constituindu-se astfel un arbore de procese similar cu arborele de directoare de pe disc. Când un proces creează un fiu, acesta din urmă poate să obţină resursele de care are nevoie fie direct de la Sistemul de Operare sau să moşteneasca un subansamblu de resurse de la procesul tat ă. Partajarea resurselor între un proces tată şi procesele sale fiu are avantajul că reduce incărcarea generală a sistemului, şi poate constitui suportul pentru schimbul de informaţii dintre procesul tată şi procesele fiu. La orice Sistem de Operare care permite filiaţia proceselor, procesul tată trebuie să cunoască identitatea proceselor fii şi să aibă posibilitatea să examineze starea acestora. Când un proces creează un proces fiu, există două posibilităţi de continuare a execuţiei procesului tată : 1. procesul tată îşi continuă execuţia în paralel cu procesul fiu 2. procesul tată aşteaptă până când unii dintre fii, sau chiar toţi, se încheie. 77
În ceea ce priveşte componenţa procesului fiu, există două posibilităţi : 1. procesul fiu este un duplicat, o copie a procesului tata 2. procesul fiu încarcă un alt program şi îl lansează în execuţie. Un proces se încheie când a fost executată ultima să instrucţiune. Procesul cere Sistemului de Operare să-l suprime (din structurile de date ale nucleului) prin intermediul unui apel sistem de tip exit . Ca urmare a unui apel exit toate resursele deţinute de un proces sunt eliberate de c ătre Sistemul de Operare. În cazul în care procesul de ţine un proces fiu, el are posibilitatea de a solicita încheierea procesului fiu atunci când 1. procesul fiu a depăşit indicele de utilizare al resurselor atribuite; 2. prelucr ările efectuate de procesul fiu nu mai sunt necesare; 3. procesul tată este suprimat şi Sistemul de Operare nu permite ca un proces fiu s ă se execute atunci când procesul tată s-a încheiat. În general, încheierea normală sau anormală a unui proces duce la încheierea tuturor fiilor săi; fenomenul se numeşte terminare în cascadă. La Sistemul de Operare UNIX, crearea unui nou proces se face cu ajutorul apelului sistem fork . Procesul fiu rezultat este copie a procesului tată, dar are identificator (PID) diferit. Cele două procese, tată şi fiu, continuă apoi să se execute de la instrucţiunea de după apelul fork . Există o deosebire între cele două procese: codul de retur întors de apelul sistem fork este 0 pentru procesul fiu, şi diferit de 0 pentru procesul tată. Procesul fiu poate executa apoi un apel sistem exec prin care se lansează un alt proces diferit. Noul proces înlocuieşte complet procesul fiu şi această situaţie reprezintă crearea unui nou proces, diferit de cele deja existente în cadrul Sistemului de Operare. Un model similar există şi la sistemele VMS şi Windows NT
4.3. STRUCTURI DE DATE PENTRU GESTIUNEA PROCESELOR 4.3.1. Tabela Proceselor Planificatorul de procese din cadrul unui mediu multiprogramat realizează ordonanţarea proceselor pe baza informaţiilor aflate într-o tabelă numită Tabela Proceselor (TP) sau PMT ( Proces Map Table). Tabela Proceselor face parte din structurile de date ale nucleului Sistemului de Operare. 78
O intrare în tabela TP corespunde unui singur proces şi conţine, de regulă, următoarele informaţii : - identificatorul (unic) al procesului, PID (Proces Indentifier) ; - conţinutul regiştrilor Unităţii Centrale (Contorul de Instrucţiuni, Acumulatori/Regiştrii Generali, Regiştrii de Index, Pointerul de stivă); conţinutul regiştrilor este salvat în TP ori de câte ori procesul este întrerupt, pentru că la o reluare ulterioar ă acesta să îşi continue execuţia în mod corect - informaţii de planificare (prioritatea procesului, pointeri în diversele cozi de aşteptare) - informaţii privind spaţiul de memorie internă acordat procesului (valori ale regiştrilor de bază şi de limită, ale partiţiei în care este încărcat codul procesului, sau pointeri către tabelele de paginare sau de segmentare memorie, după cum este tehnica de gestiune a memoriei folosite în sistem) - informaţii de contabilizare : timpul procesor utilizat de proces, limitele de timp acordate procesului, ş.a. - informaţii de legate de operaţiile de intrare/ieşire (lista perifericelor folosite în cadrul procesului, starea lor, lista fişierele deschise şi starea lor, valoarea pointerilor de poziţionare în aceste fişiere deschise, etc.). Conţinutul unei intr ări din Tabela Proceselor variază de la un Sistem de Operare la altul. Informaţiile enumerate anterior se regăsesc însă în Tabela Proceselor la majoritatea Sistemelor de Operare multiprogramate, ele fiind absolut necesare pentru a se gira execuţia concurentă a proceselor. Tabela următoare redă informaţiile care se găsesc într-o intrare a Tabelei Proceselor, tipică pentru un Sistem de Operare UNIX. În cazul multor Sisteme de Operare, Tabela Proceselor nu este o tabel ă propriu-zisă ci o listă înlănţuită sau dublu înlănţuită. Astfel, la Sistemul de Operare VMS (realizat de Digital Equipment –DEC pentru a rula pe echipamentele de calcul din seria VAX), Tabela Proceselor este o listă dublu înlănţuită. Un element din această listă corespunde unui proces din sistem, se numeşte Bloc de Control Proces (PCB, Process Control Block) şi are lungimea de 16 cuvinte a 2 octeţi.
79
Gestiunea proceselor Registri, Contor de Instruc ţiuni Cuvint de stare program Pointer de stiva Starea procesului Data lansarii procesului Timp UC utilizat Timp UC utilizat de procesele fii
Gestiunea memoriei Pointer la segmentul de cod Pointer la segmentul de date Pointer catre segmentul bss Statutul la sfirsit de execu ţie Identificator de proces Proces parinte Grupul procesului
Data următoarei alarme Pointer catre cozile de mesaje Biti de semnale în asteptare Identificatorul procesului (PID) Diversi indicatori
uid real, uid efectiv gid real, gid efectiv Tabela cu biti de semnal Diversi indicatori
Gestiunea fişierelor Masca UMASK Director radacina Director de lucru Descriptori de fi şiere uid efectiv gid efectiv Parametri apelurilor sistem Diversi indicatori
Tabela 4.2. O intrare tipică în Tabela Proceselor pentru u sistemUNIX. Nr Conţinut cuvânt 1. Pointer la blocul PCB următor 2. Pointer la blocul PCB anterior 3. Rezervat sistemului de operare 4. Pointer la lista inlantuita a intreruperilor asincrone (AST-Asincronous Trap) 5. Pointer la PCB fizic 6. Cote de resurse alocate 7. Indicatori locali de eveniment 8. Pointer le grupul indicatorilor globali de eveniment 9. Identificatorul procesului (PID) 10. Pointer la tabela de gestiune a spatiului de memorie al procesului 11. Pointer la tabela JIB cu informaţii despre jobul din care face parte procesul 12. Privilegiile procesului 13. Pointer la lista drepturilor de acces la resurse (ACL- Access Control List) 14. Starea procesului 15. Prioritatea procesului 16. Liber
Tabela 4.3. Structura unui Bloc de Control Proces în cadrul Sistemului de Operare VMS.
80
4.3.2. Comutarea de Context O consecinţă directă a multiprogramării Unităţii Centrale este activitatea Sistemului de Operare denumită Comutarea de Context. Comutarea de Context este activitatea Sistemului de Operare prin care procesul aflat curent în execuţie este suspendat, iar Unitatea Centrală este acordată unui alt proces, care, din diverse cauze trebuie s ă înceapă să se execute din acel moment. Comutarea de Context implică salvarea stării procesului curent (care se suspenda) în TP şi restaurarea (incărcarea) stării (informaţiilor de stare) ale procesului care urmează să se execute în continuare. Informaţiile de stare care fac obiectul salvării (sau restaur ării) pentru un proces formează Contextul Procesului respectiv. Într-un sens mai larg, Contextul unui proces poate fi considerat ansamblul informaţiilor aferente acelui proces. Durata activităţii de Comutare de Context trebuie să fie cât mai mică, deoarece ea este o activitate auxiliar ă care se repetă foarte des în cadrul unui Sistem de Operare (multiprogramat). Comutarea de Context se realizează la apariţia unei întreruperi, şi cum la apariţia unei întreruperi regiştrii Unităţii Centrale sunt salvaţi în stivă prin hardware, rezultă că durata Comutării de Context este dependentă şi de hardware-ul calculatorului. În general, cu cât Sistemul de Operare este mai complex, cu atât Comutarea de Context este o operaţie mai amplă, şi ca urmare de durată mai mare. La Sistemul de Operare VMS, Contextul unui Proces este alc ătuit din următoarele elemente: − conţinutul celor patru regiştri Pointeri de Stivă (există câte o stivă pentru cele patru moduri de lucru posibile : nucleu, executiv, supervizor, utilizator (Kernel, Executiv, Supervisor, User) − conţinutul celor 14 Registre Generale ale Unităţii Centrale; − Contorul de Instrucţiuni (PC) şi Cuvântul de Stare Program (PSW); − registrul cu adresa tabelului de paginare al procesului − cuvântul care conţine lungimea acestui tabel (aceste informaţii se refer ă la gestiunea spaţiului de memorie alocat procesului); − nivelul întreruperilor generate la terminarea operaţiilor de intrare/ieşire aferente procesului; − bitul de monitorizare performante a procesului. 81
Comutarea de Context în cadrul Sistemului de Operare VMS, între două procese concurente P0 şi P1 se face cu salvarea şi restaurarea stării fiecăruia în cadrul Blocului de Control propriu (PCB0 şi respectiv PCB1). Diagrama de comutare este reprezentată în Figura 4.4. Din diagramă se observă că retragerea UCP de la un proces se face cu salvarea stării (salvarea Contextului) acestuia; iar alocarea Unităţii Centrale unui proces este precedată de încărcarea stării acelui proces (restaurarea Contextului). Timp
Proces P0
Sistemul de Operare
Proces P1
În execuţie Salvare stare proces P 0 în PCB0 ncarcare stare proces P 1 din PCB1 Inactiv
Întrerupere sau apel sistem
În execu ţie
Salvare stare proces P 1 în PCB1 Reîncarcare stare proces P 0 din PCB0
Inactiv
În execuţie
Figura 4.4. Comutarea de Context la Sistemul de Operare VMS.
4.4. PROCESE SUB UNIX Sistemul de Operare UNIX este de tip multitasking - multiuser şi implementează multiprogramarea Unităţii Centrale. Ca la toate mediile multiprogramate, în cadrul sistemului UNIX un proces este o activitate care rezultă din lansarea în execuţie a unui program sau a unui modul par ţinând Sistemului de Operare. Un proces sub UNIX are ataşate mai multe atribute dintre care amintim : Identificatorul Procesului (PID –unic), PID părinte, ID grup (gid) şi ID utilizator real (uid) care identifică posesorul procesului, ID utilizator efectiv care specifică cu drepturile cărui utilizator se execută procesul la un moment dat, etc. 82
Un proces sub UNIX are ata şaţi diver şi descriptori, care sunt structuri de date care păstrează starea procesului plus toate informaţiile esenţiale pentru continuarea procesului, din locul în care execuţia sa a fost suspendată la un moment dat. Execuţia unui proces utilizator în cadrul sistemului UNIX se poate face în două moduri : 1. mod utilizator, în care procesul are acces numai la propria zonă de text, date şi stiva; 2. mod nucleu, în care procesul poate avea acces la structurile de date ale nucleului. Un proces trece din modul de lucru utilizator în modul nucleu (nucleul devine o parte integrantă a acelui proces) când lansează un apel sistem sau când generează o întrerupere. Pentru această situaţie, oricărui proces i se asociază stiva nucleu, care va stoca parametrii aferenţi apelurilor sistem.
4.4.1. Contextul unui proces sub UNIX Contextul unui proces sub UNIX este ansamblul informa ţiilor care pot fi consultate prin acţiunile unui proces sau care modifică în urma acţiunilor unui proces. În cazul Sistemului de Operare UNIX, contextul unui proces, denumit şi imaginea procesului, cuprinde două componente : − Contextul utilizator ; − Contextul sistem.
Contextul utilizator iniţial este de fapt programul executabil din care provine acel proces; contextul utilizator este stocat în memoria internă, în zonele alocate pentru procesele utilizator. Contextul sistem iniţial este realizat de interpretorul de comenzi (la lansarea în execuţie a programului) şi este apoi stocat în cadrul structurilor de date ale nucleului UNIX. Contextul utilizator este alcătuit din 3 zone de memorie distincte din punct de vedere logic: − segment de text (zona text); − segment de date (zona data); − segment de stivă (zona stack ). Segmentul de text reprezintă partea pur ă, nemodificabilă, a programului. Segmentul de text cuprinde codul executabil al programului din care a provenit procesul. Sub UNIX, mai multe procese care au segmente de cod identice pot utiliza în comun o singur ă copie din memorie a acestui segment.
83
Segmentul de date cuprinde variabilele globale şi statice ale programului, care sunt alocate static în memorie încă de la începutul execuţiei programului. Segmentul de date cuprinde şi zonele de memorie alocate dinamic în timpul execuţiei, prin funcţii cum ar fi malloc, calloc, realloc, sau free. În principiu, lungimea segmentului de date este cunoscută încă de la compilarea unui program, dar poate fi modificată în urma apelurilor sistem prin care se alocă/dezalocă memorie suplimentar ă pentru date. Segmentul de stivă (zona stack ) cuprinde informaţiile prin care se realizează apelurile la funcţii şi proceduri: în stiva se stochează parametrii de apel şi datele locale, care se suprimă la încheierea procedurii sau funcţiei. Contextul sistem al unui proces este alcătuit din următoarele elemente: − Partea static[ a contextului sistem, formată din : o Contextul regiştrilor Unităţii Centrale (Regiştri Generali, Contorul de Instrucţiuni, Registrul de Stare program, etc.) o Intrarea în Tabela Proceselor corespunzând acelui proces o Zona U − Partea dinamică a contextului sistem, formată din : o Tabela pregion (a regiunilor per proces), ce conţine informaţii care permit alocarea de spaţiu de memorie fizică pentru (segmente din) acel proces o Stiva nucleu, care conţine păr ţile din stiva nucleului referitoare la apelurile sistem (apelurile la modulele nucleului) efectuate de acel proces. Zona U este o componentă a contextului sistem specifică UNIX. Câmpurile Zonei U cuprind următoarele informaţii: − un pointer către intrarea corespunzând procesului din Tabela Proceselor − Identificatorul utilizatorului real şi efectiv al procesului (valorile variabilelor uid şi efuid), în funcţie de care se stabilesc drepturile de acces la fişiere, cozi de mesaje, memorie comună sau semafoare − Tabela descriptorilor de fişiere utilizator (TDFU) accesate de proces, starea fişierelor deschise de proces, parametrii operaţiilor de I/E : tipul fiecărei operaţii, zona tampon utilizată, deplasamentul în cadrul fişierelor deschise − Directorul curent de lucru şi terminal asociat cu procesul − Valorile variabilelor de mediu (environment) pentru acel proces − Starea semnalelor pentru acel proces. 84
4.4.2. Stările unui proces sub UNIX Stările unui proces sub UNIX corespund celor descrise în secţiunea 4.2.3., dar cu unele substări particulare (Figura 4.6.) : − Starea În execu ţie ( RUN ): o În execuţie în mod utilizator o În execuţie în mod nucleu − Starea Gata de execu ţie ( READY ), în aşteptarea resursei UCP: Gata de execuţie preemptat (trecerea în starea de gata de o execuţie s-a efectuat în urma unei întreruperi care a apărut atunci când procesul se execută în mod nucleu, adică un apel sistem lansat de acel proces era în curs de execuţie); Gata de execuţie, stocat în memoria internă (această stare o este numită şi gata pentru planificare) Gata de execuţie, evacuat pe disc o − Starea Blocat ( WAIT ): Adormit (Sleeping ), în aşteptarea unui eveniment extern ; o o Suspendat, stopat de un semnal SIGSTOP provenind de la un alt proces şi în aşteptarea unui semnal SIGCONT) − Starea terminat ( ZOMBI ), încheiat, dar încă existent în Tabela Proceselor. M E M I N T E R N A D I S C
intrerupere apel sistem
TERM
(zombi)
terminare
RUN mod user
RUN mod nucleu
READY preemptat
slee WAIT
evacuare pe disc
WAIT
return
distribuir trezire
READY planificare
memorie internă suficientă
CREAT
creare proces ( fork )
memorie internă
trezire
READ
Figura 4. 6. Stările proceselor şi tranziţiile între stări la SistemulUNIX 85
Nucleul sistemului UNIX permite comutarea de context (rechiziţia UCP de la un proces şi alocarea acesteia unui alt proces) în patru cazuri : − când procesul curent trece în aşteptare prin lansarea funcţiei sleep − când procesul curent se termina prin apelul funcţiei sistem exit − la revenirea dintr-un apel sistem, când procesul care a lansat apelul nu mai este cel mai prioritar − la revenirea dintr-o întrerupere, când este necesar ă trecerea procesului în modul utilizator, iar procesul care a fost iniţial întrerupt nu mai este cel mai prioritar. Funcţia sistem sleep este apelată de nucleu atunci când procesul curent se află în execuţie în mod nucleu (în urma lansării unui apel sistem) şi trebuie să se oprească şi să aştepte producerea unui eveniment. Evenimentele pentru care procesele sunt în aşteptare sunt mapate pe adrese. Procesele pot fi în aşteptare pentru evenimente sigure (cu probabilitate mare de producere,: eliberare tampon sau i-node, terminarea unei operaţii de I/E cu discul) sau nesigure, de aceea funcţia sleep este apelată de nucleul UNIX cu un parametru de prioritate. În ultimele două cazuri comutarea de context are loc datorită faptului că priorităţile proceselor s-au schimbat între timp, datorită apariţiei întreruperii de ceas şi a lansării rutinei de tratare întrerupere de ceas, care, - între altele -, recalculează priorităţile proceselor din sistem. Procesul curent, care efectua return (dintr-un apel sistem sau din întrerupere) nu mai este cel mai prioritar, deci trece în aşteptare. Transferarea proceselor din cozile de aşteptare din memoria internă în cozile de aşteptare de pe disc (şi invers) este efectuată de procesul swapper , care apar ţine nucleului sistemului UNIX. Procesul swapper transfer ă imaginea unui proces din memoria internă pe disc, atunci când: − trebuie încărcat în memorie un alt proces şi spaţiul este insuficient; − dimensiunea segmentului de date al unui proces a crescut (în urma unei alocări dinamice de memorie) şi nu există o regiune de memorie internă libera, suficient de mare pentru acel segment. Criteriile folosite de swapper, pentru alegerea procesului care va fi evacuat din memorie pe disc, sunt următoarele : − timpul de rezidenţă în cozile de aşteptare Ready din memoria internă, plus prioritatea procesului;â − timpul de rezidenţă în cozile de aşteptare WAIT din memoria internă, plus prioritatea procesului.
86
ANEXA. SISTEMUL DE FIŞIERE UNIX 1. Elementele unui sistem de fişiere Sistemul de Operare UNIX există sub forma mai multitudini de variante, dintre care majoritatea se aliniază la unul dintre standardele următoare: − standardul System V, realizat şi brevetat de firma americană ATT − standardul BSD, dezvoltat la Universitatea Berkeley-California. Sistemul UNIX de Gestiune a Fişierelor se aliniază la rândul său la unul dintre aceste două standarde. În cele ce urmează va fi prezentat un Sistem de Gestiune a Fişierelor corespunzând standardului System V. Sistemul de Gestiune a Fişierelor UNIX corespunde definiţiei generale: este o colecţie de fişiere stocate pe suport magnetic în cadrul unui sistem ierarhic de directoare, plus o colecţie de structuri de date şi de programe pentru gestiunea acestor fişiere şi directoare. Sistemul de Gestiune a Fişierelor UNIX poate fi alcătuit din unul sau mai multe sisteme de fişiere. Un sistem de fişiere este o colecţie de fişiere şi directoare plus tabelele prin intermediul cărora se realizează gestiunea acestor fişiere şi directoare. Un sistem de fişiere formează un aşa-numit disc virtual, constituit din trei entităţi de bază (Figura (8.3): superblocul tabela de i-noduri blocurile de date. Un disc virtual poate să fie localizat pe un singur disc fizic, dar şi distribuit pe mai multe discuri fizice. Este de remarcat de asemenea că, prin partiţionare, un disc fizic poate să gazduiască mai multe sisteme de fişiere. În cadrul unui sistem de fişiere UNIX spaţiul fizic de disc este alocat în blocuri ce pot fi între 512 şi 4096 de octeti.
2. Superblocul UNIX Superblocul este structura prin intermediul căreia se realizează gestiunea spaţiului pe disc în cadrul unui sistem de fişiere UNIX. Gestiunea spaţiului de disc se realizează prin contorizarea blocurilor libere (SGF UNIX nu efectuează nici un fel de contorizare a blocurilor ocupate !). 87
Superblocul UNIX descrie starea de ocupare a discului virtual, conţinând debutul listei înlănţuite de blocuri libere de pe acest disc. Lista de blocuri libere din Superbloc este o listă de liste, în care fiecare fiecare element al listei este o stivă FIFO, iar primul element al listei (adică prima sub-lista FIFO) este stocată în Superbloc iar celelalte elemente (celelalte sub-liste) sunt stocate în blocuri de date special alocate ale discului virtual UNIX. Bloc nr. 0
boot Superbloc
Bloc nr. 1 Bloc nr. 2 i-nod 5
Bloc nr. 3
i-node 2 i-nod 6
i-node 3 i-nod 7
i-node 4 i-nod 8
i-nod 16 i-nod 17 ………………………………………………. i-nod 32
Tabela i-nod-urilor
………………………………………………..
Bloc nr. s_isize -1 Bloc nr. s_isize
……………………………………………….. Bloc de date
........................
Bloc nr. s_fsize - 1
Blocurile de date
Bloc de date
Figura 8.3. Structura discului UNIX în standard System V. Printre informaţiile sunt stocate pe în Superblocul UNIX se află: − s_isize, dimensiunea în blocuri a tabelei de i-noduri − s_fsize, dimensiunea în blocuri a sistemului de fişiere − s_fname, numele extern al sistemului de fişiere − s_free, lista blocurilor libere şi s_nfree: numărul de blocuri libere − s_i-node, lista i-nod-urilor libere şi s_ni-node, numărul de inoduri libere 88
Informaţiile conţinute de Superbloc permit determinarea numărului maxim de fişiere de pe discul virtual, precum şi dimensiunea întregului sistem de fişiere. Superblocul oricărui sistem de fişiere UNIX montat este copiat în memoria internă, pentru a spori viteza generală de lucru a SGF-ului UNIX.
3. Tabela de i-noduri Un fişier dintr-un sistem de fişiere de UNIX este specificat prin calea în cadrul sistemul de directoare, numele fişierului şi o reprezentare internă a structurii fişierului denumită i-nod (i-nod=index node). I-nod-ul conţine descrierea modului în care datele apar ţinând fişierului sunt stocate pe disc precum şi alte informaţii privitoare la fişier: proprietarul fişierului, drepturile de acces, datele calendaristice la care s-au f ăcut accese la fişier. Două fişiere aflate pe acel sistem de fişiere tip UNIX pot partaja acelaşi inod. În acest caz, unul din câmpurile i-nodului va specifica câte fişiere partajează acel i-nod. I-nod-urile sunt memorate într-o structur ă linear ă numită tabelă de i-noduri (lista de i-nod-uri), tabelă ce apar ţine sistemului de fişiere. Numărul i-nodului este de fapt poziţia lui în această tabelă. Pentru a micşora durata timpului de acces la fişierele din sistem o copie a acestei tabele (completată cu alte informaţii) este păstrată şi în memoria internă. Un i-nod conţine toate informaţiile despre fişierul asociat, cu excepţia numelui acestuia; care este păstrat în fişierul director căruia îi apar ţine fişierul respectiv. I-nodul nu specifică calea de acces la fişier. Informaţiile conţinute de un i-nod sunt: − tipul fişierului − masca drepturilor de acces (specifică drepturile de acces ale utilizatorilor din sistem asupra fişierului, în funcţie de relaţia dintre ei şi proprietarul fişierului); − numărul de legături (câte fişiere se refer ă la i-nod) − lungimea fişierului în octeţi − identificatorul proprietarului fişierului − identificatorul grupului căruia îi apar ţine fişierul − data calendaristică şi momentul ultimei accesări a fişierului − data calendaristică şi momentul ultimei modificări a fişierului − data calendaristică şi momentul creării fişierului; − o tabelă cu 13 intr ări ce conţine adresele blocurilor de date apar ţinând fişierului. 89
Sistemul de Operare alocă spaţiu fişierelor în unităţi de câte un bloc (un bloc este un multiplu de 512; această este o caracteristică comună tuturor fişierelor dintr-un sistem de fişiere). Spaţiul alocat unui fişier nu este întotdeauna contiguu.Adresele blocurilor alocate unui fişier sunt păstrate în tabela de adrese a i-nod-ului asociat. Pentru a limita lungimea i-nod-urilor, a timpului de căutare în tabela şi a permite crearea de fişiere de dimensiuni foarte mari, este folosită o structur ă de adresare mixtă: − primele 10 intr ări conţin adrese de blocuri de date ale fişierului − intrarea 11 conţine adresa unui bloc cu adrese de blocuri de date (primul nivel de indirectare) − intrarea 12 realizează al doilea nivel de indirectare − intrarea 13 realizează al treilea nivel de indirectare. : Trebuie f ăcută distincţie între operaţia de scriere a unui i-nod şi cea a conţinutului fişierului asociat. Conţinutul unui i-nod se modifică în momentul în care se schimba posesorul, drepturile de acces sau numărul de legături. Modificarea conţinutului unui fişier implică automat modificarea inod-ului asociat, în timp ce o modificare a i-nod-ului nu implică neapărat modificarea conţinutului fişierului. Observa ţ ie
Copia în memorie a tabelei i-nod-urilor conţine şi alte informaţii suplimentare, faţă de cea păstrată în sistemul de fişiere. Aceste informaţii sunt următoarele: − starea i-nodului, care poate să indice dacă i-nod-ul este blocat, sau dacă există un proces care aşteaptă ca i-nod-ul să fie deblocat − numărul i-nod-ului (în tabela de pe disc aceast ă informaţie nu este înscrisă, poziţia în tabelă fiind chiar numărul i-nod-ului) − numărul de periferic logic al discului pe care se afl ă sistemul de fişiere căruia îi apar ţine i-nod-ul respectiv.
90