Bazele sistemeleor de operare


 

Arhitectura calculatoarelor

Calculatoarele s-au schimbat foarte mult in ultimele patru decenii. Schimbarile au afectat mai ales capacitatea si viteza lor. Principiile de functionare sunt urmatoarele (stabilite de catre John von Neumann in 1945):
  1. Program stocat: Instructiunile si datele se stocheaza la fel in memoria calculatorului sub forma numerica.
  2. Pentru reprezentarea interna a datelor si a instructiunilor se utilizeaza sistemul de numeratie 2.
  3. Unitatea de control face deosebire intre datele si instructiunile aceluiasi program si executa instructiunile automat.
  4. Unitatea aritmetico-logica este capabila sa efectueze operatii aritmetice si  logice.
  5. Periferice: unitati I/O (Intrare/Iesire) care realizeaza legatura dintre calculator si utilizator.


CPU (Central Processing Unit) =Unitatea de control + Unitatea Aritmetico-Logica

Memoria contine atat datele cat si instructiunile programelor. Memoria este adresabila si pentru realizarea lor fizica se utilizeaza
semiconductori ai caror continut se pierde la oprirea calculatorului. Accesul la memorie trebuie sa fie foarte rapid, deoarece timpul de acces influenteaza timpul de executie al procesului.

Periferice: tastatura, mouse, monitor, plotter, scanner, unitati de hard disk, unitati floppy disk etc.

Program = un set de instructiuni care rezolva o anumita problema.  Pe parcursul executiei unui program, procesorul pe baza continutului registrului PC (Program Counter) incarca o instructiune din memorie, o decodifica si o executa, dupa care incrementeaza PC (adresa urmatoarei instructiuni). Acest ciclu se numeste ciclu Neumann.

Comunicarea cu periferice se poate rezolva in trei moduri.

1. Transfer programat (polling):

        Procesorul in mod continuu verifica perifericele si daca gaseste informatii, atunci citeste de acolo. Dezavantajul metodei este ca procesorul este in mod continuu ocupat si verifica chiar daca nu sunt date pe periferice.

2. Transfer pe baza de intreruperi ( Interrupted Request - IRQ )

        Perifericul pe o linie proprie informeaza procesorul ca necesita transfer de date. Daca cererea este acceptata atunci unitatea centrala (procesorul) isi intrerupe activitatea curenta (memoreaza punctul de intrerupere) rezolva transferul de date cu perifericul, iar dupa ce a terminat transferul isi continua activitatea de la punctul de intrerupere. In cazul acestei metode timpul procesorului se pierde in salvarea starii procesului intrerupt si reluarea executiei procesului intrerupt.

3. Transfer direct de memorie (DMA - Direct Memory Access)

        Transferul este realizat cu ajutorul unei unitati de control independent si  microprocesorul nu este ocupat de aceasta treaba. La inceputul transferului microprocesorul trebuie sa furnizeze unitatii de control adresa de inceput si dimensiunea blocului de memorie destinat transferului.

Model logic cu 7 nivele

7. Aplicatii
6. Limbaje de programare de nivel inalt
5. Limbaje de programare de nivel scazut
4. Sistem de operare
3. Hardware
2. CPU: microprocesor, registri
1. Circuite logice
 

Notiuni de baza

Procese


Program (task): Un set de instructiuni care rezolva o anumita problema si este scris intr-un limbaj de programare.

Proces: Un program aflat in executie. (Un program poate crea mai multe procese).

Dupa ce se executa si ultima instructiune se termina procesul. Intr-un sistem de operare multiuser si multitasking esista o multime de procese care se executa de catre microprocesor. Gestionarea acestor procese este treaba sistemului de operare.

Orice proces are atasat un PCB (Process Control Block)-bloc de control al procesului. Acest PCB contine urmatoarele campuri:

     PID - identificatorul procesului
     PC - valoare Program Counter
     starea procesului
     continutul registrilor
     zone de memorie atasate procesului
     tabela descriptorilor de fisiere

Resurse

Resurse: toate cele necesare procesului pe parcursul executiei.
Exemple de resurse:
    -zone de memorie ( zona de date, zona de cod, zona de stiva)
    -microprocesor
    -fisiere
    -dispozitive I/O

Resursele pot fi:

Definitii:

    S.O. d.p.d.v. al resurselor: gestioneaza resursele calculatorului si face impartirea acestor resurse intre procesele sistemului.
    S.O. d.p.d.v. al utilizatorului: asigura interfata intre hardverul calculatorului si utilizatorul.

Structura S.O., servicii oferite

Nucleu (Kernel)

Nucleul este format dintr-o multime de procese care sunt create la pornirea calculatorului si sunt active pana la oprirea acestuia.
Procesele utilizatorilor sunt create de catre kernel. In momentul crearii se creaza PCB-ul procesului, se aloca memorie pentru datele si instructiunile procesului. Kernelul este responsabil pentru rularea proceselor de catre procesor, el stabileste ordinea de executie a acestora si realizeaza protectia acestor procese.

Apeluri sistem:

Procesele utilizator comunica cu kernelul cu ajutorul apelurilor de sistem.

Aceste apeluri sistem sunt realizate cu intreruperi software si realizeaza transferul controlului la kernel. Protectia proceselor se
realizeaza prin cele doua moduri de executie al unui proces:

USER MODE: in acest mod procesul poate executa un set restrans de instructiuni. In acest mod nu poate accesa o anumita resursa.

KERNEL MODE : procesul poate executa orice instructiune

Un proces pe parcursul executiei isi poate schimba modul de executie. Cand are nevoie de resurse atunci trece in modul kernel, iar cand isi termina treaba cu resursa atunci revine in mod user.
 

Deservirea apelurilor sistem

  1. Se salveaza parametrii procesului
  2. Controlul este transferat la kernel ( la un  anumit proces kernel )
  3. Parametrii apelului sistem se transfera la kernel printr-o stiva
  4. Procesul trece in KERNEL MODE
  5. Se executa procesul kernel la care s-a transferat controlul
  6. Rezultatele sunt puse intr-o zona de memorie speciala
  7. Procesul trece in USER MODE
  8. Se continua executia procesului


#include <stdio.h.>

main(){
    int c;
    while( read(0,c,1) !=EOF )
        write(1, c, 1);
    return 0;
}

cc prog.c -o prog.x

In exemplul de mai sus am utilizat doua apeluri sistem: read si write

Drivere de dispozitive ( Device Drivers )

Perifericele pot accesa kernelul prin doua cai:
 
  1. prin drivere
  2. prin sistemul de intreruperi
1. Driverele sunt realizate de catre producatorii de hardware si de catre programatorii de sistem. O parte din driver poate fi continuta in ROM-ul hardverului specific.
2. Perifericele informeaza kernelul despre activitatea lor prin cereri de intreruperi. Aceste cereri se lanseaza:
    -daca apar defecte la un anumit dispozitiv
    -la inceputul si la sfarsitul unui transfer de date

Procesoarele au de obicei terminale (pini) la care sosesc toate semnalele de intreruperi. La sosirea unui asemenea semnal in primul rand trebuie stabilita sursa acestui semnal. Modul cel mai simplu in care se poate stabili acest lucru este interogarea tuturor perifericelor (polling). Mult mai eficient este sistemul de intreruperi cu un vector. Fiecare element al acestui vector contine adresa unei rutine de tratarea unei exceptii.

Vectorul de intreruperi se initializeaza la incarcarea sistemului de operare si continutul lui se poate modifica pe parcursul executiei proceselor. De exemplu anumite procese doresc ca procesele sa actioneze altfel decat cel implicit la primirea unui semnal, atunci redefinesc tratarea semnalului respectiv.

Tratarea intreruperilor

  1. Determinarea sursei intreruperii
  2. Determinarea adresei rutinei care trateaza exceptia
  3. Se salveaza parametrii procesului aflat in executie
  4. Controlul este transferat rutinei de tratare a exceptiei (proces kernel)
  5. Se executa transferul de date
  6. Controlul este redat procesului intrerupt care isi continua executia

Suport oferit pentru scrierea programelor

Sistemele de operare ofera suport pentru scrierea programelor. Primul compilator de limbaj inalt de sub s.o.  UNIX era compilatorul C.
Fazele executiei unui program C
  1. Editarea textului programului
  2. Compilare
  3. Editarea legaturilor
  4. Incarcarea codului executabil si executia programului
1. Sub orice sistem de operare exista editoare de texte cu care putem scrie programe in diferite limbaje de programare. Programul scris intr-un anumit limbaj de programare se numeste COD SURSA.
    Limbajul C - fisiere cu extensia .c
    Limbajul Java - fisiere cu extensia .java
    Limbajul Pascal - fisiere cu extensia .pas

2. Codul sursa trebuie convertit intr-un set de instructiuni care este inteles de catre microprocesor. Aceasta operatie este realizata de catre compilator. Rezultatul acestei faze este un fisier care se numeste COD OBIECT. Codul obiect inca nu contine adrese absolute si presupune ca modulul program incepe de la adresa 0. Un program poate fi compus din mai multe module. Aceste module pot fi toate scrise de catre noi sau putem utiliza module din biblioteca de sistem.

3. Editarea legaturilor este realizata de catre linker. Sarcina acestui program este sa rezolve legaturile dintre diferitele module ale aceluiasi program si sa produca un COD EXECUTABIL.
Nici codul executabil nu poate sa contina adrese absolute, fiindca nu se stie unde va fi incarcat respectivul  program in memorie. Daca concomitent se ruleaza mai multe programe atunci programele intotdeauna vor fi incarcate in zone de memorie libere.

4. Incarcatorul de programe (LOADER) apartine nucleului. Acest program incarca fisierul executabil in memorie, stabileste adresa de baza si creaza blocul de control al procesului (PCB).
Astfel deodata sunt incarcate toate modulele program si cele din biblioteca sistem. Daca avem deja incarcate programe care utilizeaza aceleasi module de biblioteca atunci aceste module vor exista de mai multe ori in memorie. Pentru a rezolva acest neajuns s-au creat sub Windows bibliotecile dinamice (DLL - Dynamic Link Library). Aceste biblioteci se incarca in mod dinamic in momentul cand se executa un cod din biblioteca respectiva. Dupa incarcarea lor aceste biblioteci vor fi partajate de toate procesele.

Cu noile medii de dezvoltare integrate pentru diferite limbaje de programare nici nu se vad aceste faze ale executiei programului. La apasarea unor combinatii de taste se realizeaza compilare, editare de legaturi si executie.