Sisteme de Operare - notiuni generale
Un sistem de operare este un program sau un set de programe de calculator care gestioneaza resursele hardware ale unui sistem de calcul si ofera servicii aplicatiilor software. In esenta un SO actioneaza ca un intermediar care faciliteaza accesul la resurse pentru utilizatori si alte programe de calculator.
manager de resurse: alocă CPU, memorie, I/O între programe concurente
mașină extinsă / virtuală: oferă o abstractizare mai ușor de folosit decât hardware-ul brut
Scurt istoric
Anii 1950 – Procesare în serie (batch processing): Nu existau SO propriu-zise. Programele erau introduse pe cartele perforate și executate secvențial. Operatorul uman era "sistemul de operare".
Anii 1960 – Primele SO reale și multiprogramarea: IBM OS/360 (1964) — primul SO care încerca să funcționeze pe o întreagă familie de calculatoare. Apare conceptul de multiprogramare (mai multe programe încărcate simultan în memorie). Tot acum apare MULTICS (precursorul UNIX), care introduce timesharing-ul la scară mare.
1969–1970 – UNIX: Ken Thompson și Dennis Ritchie la Bell Labs. Portabil (rescris în C în 1973), modular, filosofia "fă un singur lucru și fă-l bine". A influențat aproape toate SO moderne.
Anii 1980 – Calculatorul personal: MS-DOS (1981), apoi Apple Macintosh (1984) cu prima interfață GUI comercială de succes. Momentul în care SO devine ceva cu care interacționează utilizatorul obișnuit, nu doar specialiștii.
1991 – Linux: Linus Torvalds creează un kernel gratuit și open-source. Astăzi e baza Android, a serverelor web, a supercomputerelor din Top500 (practic toate rulează Linux).
2000+ – SO mobile și cloud: iOS (2007), Android (2008). Apariția containerizării (Docker) și a SO-urilor orientate pe cloud/microservicii.
Clasificarea Sistemelor de Operare
După numărul de utilizatori:
SO mono-utilizator (MS-DOS, Windows 95)
SO multi-utilizator (UNIX, Linux, Windows Server).
După numărul de procese/taskuri:
SO mono-tasking (MS-DOS — un singur program la un moment dat)
SO multi-tasking (toate SO moderne).
După scopul principal:
SO de tip desktop/stație de lucru (Windows 10/11, macOS, distribuții Linux desktop)
SO de tip server (Windows Server, Red Hat Enterprise Linux, Ubuntu Server)
SO embedded/încorporate (FreeRTOS, VxWorks — în automobile, routere, dispozitive IoT)
SO mobile (Android, iOS)
SO de timp real — RTOS (QNX, VxWorks — sisteme critice unde timpul de răspuns e garantat).
După modul de distribuire / licențiere:
SO proprietare (Windows, macOS)
SO open-source (Linux, FreeBSD).
Principalele functii ale unui SO
Principalele funcții ale unui sistem de operare includ:
Gestionarea Proceselor: Controlul și coordonarea executării programelor, inclusiv alocarea resurselor necesare.
Un proces poate conține unul sau mai multe fire de execuție (thread-uri) — unități mai mici de lucru care partajează aceleași resurse (memorie, fișiere deschise) ale procesului părinte, dar se execută independent. De exemplu, un browser web poate folosi un thread pentru afișarea paginii și altul pentru descărcarea fișierelor, totul în cadrul aceluiași proces.
Gestionarea Memoriei: Alocarea și eliberarea spațiului de memorie pentru programe și date.
Sistemele de operare moderne folosesc un mecanism numit memorie virtuală, prin care fiecare program „vede" un spațiu propriu de adrese, aparent continuu și potențial mai mare decât memoria RAM fizică disponibilă. SO-ul se ocupă de corespondența între adresele virtuale și cele fizice, mutând transparent date între RAM și disc atunci când e necesar.
Gestionarea Dispozitivelor: Controlul dispozitivelor periferice pentru o comunicare eficientă între hardware și software.
Gestionarea Fișierelor: Organizarea, stocarea, recuperarea și gestionarea accesului la date și fișiere.
Securitatea și Accesul Multiplu: Protejarea datelor și resurselor sistemului într-un context multi-utilizator.
Un element cheie al securității este separarea în niveluri de privilegii: procesorul funcționează în cel puțin două moduri — kernel mode (mod privilegiat, cu acces complet la hardware și memorie) și user mode (mod restricționat, în care rulează aplicațiile obișnuite). Când o aplicație are nevoie de o operație privilegiată (ex: scrierea pe disc), ea solicită acest lucru kernel-ului printr-un system call, iar procesorul comută temporar în kernel mode. Această separare împiedică un program defect sau malițios să afecteze direct hardware-ul sau alte programe.
Imaginați-vă că scrieți un program care trebuie să salveze un fișier pe disc. Fără SO, ar trebui să știți exact cum funcționează controlerul de disc, la ce adrese de memorie să trimiteți comenzile, cum să gestionați erorile hardware. Și dacă mâine schimbați discul cu un alt model, ar trebui să rescrieți tot codul. SO-ul abstractizează toate aceste detalii — voi apelați pur și simplu o funcție de tip "salvează fișier" și SO-ul se ocupă de rest.
Tipuri principale de Interfete
Sistemele de operare oferă diferite moduri de interacțiune cu utilizatorii și aplicațiile, principalele două tipuri fiind:

Interfața în Linie de Comandă (CLI)
Oferă o interfață bazată pe text, unde utilizatorii introduc comenzi prin tastatură pentru a executa operații specifice. Este versatila pentru utilizatori avansați și pentru automatizarea sarcinilor prin scripturi. Exemple de interpretoare de comenzi includ Bash pe Linux și macOS, și PowerShell sau Command Prompt pe Windows.

Interfața Grafică cu Utilizatorul (GUI)
Oferă o interfață vizuală, bazată pe ferestre, icoane / simboluri și meniuri, care permite utilizatorilor să interacționeze cu sistemul de operare prin dispozitive de intrare, cum ar fi mouse-ul și tastatura.
Alte tipuri de interfete
Interfețe bazate pe atingere (Touch-based)
Utilizează ecrane tactile pentru a selecta elemente și a introduce comenzi.
Folosite frecvent pe dispozitive mobile (telefoane, tablete) și laptopuri cu ecrane tactile.
Avantajele includ intuitivitatea și viteza de navigare.
Interfețe activate vocal (Voice-enabled)
Permit controlul vocal al sistemului de operare și al aplicațiilor.
Folosesc tehnologii de recunoaștere vocală pentru a interpreta comenzile utilizatorului.
Exemple: Siri (iOS), Google Assistant (Android), Cortana (Windows).
Avantajele includ comoditatea și accesul hands-free.
Interfețe bazate pe citirea activității creierului (BCI)
Utilizează semnalele cerebrale pentru a controla dispozitivele și a interacționa cu sistemele de operare.
Tehnologie emergentă cu potențial revoluționar pentru persoanele cu dizabilități.
Exemplu: Neuralink de la Elon Musk.
Avantajele includ posibilitatea controlului direct al dispozitivelor prin gândire
Interfețe bazate pe
gesturi
Permit controlul prin gesturi ale mâinilor sau corpului.
Utilizate frecvent în jocuri și realitate virtuală.
Exemple: Kinect de la Microsoft, Leap Motion.
Avantajele includ imersiunea și interactivitatea sporită.
Interfețe bazate pe mișcarea ochilor
Permit controlul prin mișcarea ochilor.
Folosite de persoane cu dizabilități motorii severe.
Exemplu: Eye Gaze de la Tobii.
Avantajele includ accesibilitatea și ușurința de utilizare.
Interfața API (Application Programming Interface)
Interfața API este un set de reguli și definiții care permit programelor de calculator să solicite servicii de la sistemul de operare.
Funcționare:
Programatorul apelează o funcție API specifică, oferind parametrii necesari.
Sistemul de operare execută solicitarea și returnează un rezultat programului.
Beneficii:
Permite programatorilor să acceseze funcțiile avansate ale sistemului de operare.
Simplifică dezvoltarea software-ului, oferind o interfață standard.
Facilitează portabilitatea programelor între diferite sisteme de operare.
Tipuri de API-uri:
API-uri specifice sistemului de operare (ex: Windows API, POSIX API).
API-uri specifice aplicațiilor (ex: API-ul Facebook, API-ul Google Maps).
Exemple de solicitări API:
Deschiderea unui fișier
Crearea unui proces
Trimiterea unui mesaj către o altă aplicație
Accesarea rețelei
Importanța API-urilor:
API-urile sunt elemente fundamentale ale programării moderne. Ele permit programatorilor să se concentreze pe logica specifică a aplicației lor, fără a se preocupa de detaliile implementării specifice sistemului de operare.
Shell
Un shell este un program de calculator care acționează ca interfață de linie de comandă (CLI) între utilizator și sistemul de operare. Permite utilizatorilor să introducă comenzi text pentru a interacționa cu diverse componente ale sistemului.
Funcționalități principale:
Interpretarea comenzilor: Shell-ul interpretează comenzile introduse de utilizator, le transformă în instrucțiuni inteligibile pentru sistemul de operare și le execută.
Acces la resurse: Oferă acces la fișiere, directoare, programe și alte resurse ale sistemului.
Controlul proceselor: Permite lansarea, oprirea și gestionarea proceselor (programe în execuție).
Comunicarea cu sistemul: Oferă diverse utilitare pentru a configura sistemul, a verifica starea sa și a primi informații.
Automatizarea sarcinilor: Permite scrierea de scripturi shell, care sunt fișiere text ce conțin comenzi ce pot fi executate automat.
Tipuri de shell-uri:
Bourne Shell (sh): Shell-ul clasic original, disponibil pe majoritatea sistemelor Unix. A stabilit convențiile de sintaxă pe care le-au moștenit multe shell-uri ulterioare.
C Shell (csh): Oferă o sintaxă inspirată din limbajul C și funcții interactive îmbunătățite (istorie de comenzi, aliasuri).
Korn Shell (ksh): Combină compatibilitatea cu Bourne Shell cu funcții avansate de programare și editare a liniei de comandă.
Bash (Bourne Again Shell): Cel mai răspândit shell pe sistemele Linux. Modern, versatil, cu o sintaxă bogată și multe funcții integrate. Este shell-ul implicit pe majoritatea distribuțiilor Linux.
Zsh (Z Shell): Shell-ul implicit pe macOS începând cu versiunea Catalina (2019). Oferă autocompletare avansată, corecție automată a comenzilor și o configurabilitate extinsă (framework-ul Oh My Zsh este foarte popular).
Fish (Friendly Interactive Shell): Un shell modern, proiectat cu accent pe ușurința utilizării. Oferă sugestii automate bazate pe istoricul comenzilor, evidențierea sintaxei în timp real și o configurare funcțională „din cutie", fără a necesita personalizare extensivă.
PowerShell: Dezvoltat de Microsoft, se diferențiază fundamental de shell-urile Unix: în loc să proceseze text (ca Bash sau Zsh), PowerShell lucrează cu obiecte .NET. Aceasta înseamnă că ieșirea unei comenzi nu este un simplu șir de caractere, ci un obiect structurat cu proprietăți și metode, ceea ce face procesarea datelor mai robustă, deși abordarea este conceptual diferită de filozofia Unix.
Exemple de interacțiuni cu shell-ul:
ls: Listarea conținutului unui director.
cd: Schimbarea directorului curent.
mkdir: Crearea unui director.
cp: Copierea fișierelor.
mv: Mutarea sau redenumirea fișierelor.
rm: Ștergerea fișierelor.
echo: Afișarea mesajelor pe ecran.
grep: Căutarea textului în fișiere.
Avantajele utilizării shell-ului:
Flexibilitate: Permite executarea rapidă a diverselor comenzi și scripturi.
Eficiență: Oferă un mod direct de a interacționa cu sistemul, fără interfețe grafice.
Automatizare: Permite automatizarea sarcinilor repetitive prin scripturi.
Control detaliat: Oferă acces la funcții avansate ale sistemului de operare.
Dezavantajele utilizării shell-ului:
Curba de învățare: Poate fi dificil de utilizat pentru utilizatorii inexperimentați.
Lipsa de interactivitate: Interfața text poate fi mai puțin intuitivă decât interfețele grafice.
Erori: Introducerea greșită a comenzilor poate duce la erori sau probleme.
Concluzie:
Shell-ul este un instrument puternic pentru interacțiunea cu sistemele de operare, oferind flexibilitate, eficiență și control detaliat. Deși poate fi dificil de utilizat pentru incepatori, shell-ul poate fi un instrument esențial pentru administratorii de sistem și utilizatorii avansați.
Kernel-ul
Kernel-ul este componenta centrală a majorității sistemelor de operare.
Kernel-ul este un program de calculator aflat la baza unui sistem de operare. Acesta acționează ca un manager sau mediator fundamental între hardware și aplicațiile software.
Are control complet asupra tuturor componentelor hardware ale sistemului.
Funcții principale:
Gestionarea memoriei: Kernel-ul alocă memorie aplicațiilor în execuție, asigurându-se că datele nu se suprapun și că memoria este eliberată atunci când nu mai este necesară.
Gestionarea proceselor: Se ocupă de crearea, programarea, prioritizarea și terminarea proceselor (programe aflate în execuție). De asemenea, facilitează comunicarea și sincronizarea între procese.
Gestionarea dispozitivelor: Controlează accesul la hardware prin intermediul unor programe specializate numite drivere de dispozitiv, permițând aplicațiilor să interacționeze cu hardware-ul într-o manieră abstractă.
Gestionarea fișierelor: Organizează stocarea și preluarea datelor într-un sistem de fișiere.
Gestionarea rețelei: Permite comunicațiile între sistemul de calcul și alte dispozitive dintr-o rețea.
Securitate: Implementează mecanisme de protecție pentru a controla accesul la resurse și a proteja sistemul împotriva programelor rău intenționate.
Arhitectura:
Kernel-ul operează într-un spațiu privilegiat al sistemului, numit "kernel space". Are acces direct la hardware și la zonele sensibile de memorie.
Aplicațiile de utilizator sunt rulate într-un spațiu separat, "user space", iar comunicarea cu kernel-ul pentru a solicita servicii se face prin "system calls".
Aplicațiile nu pot accesa direct hardware-ul. Orice solicitare trece prin stratul de system calls, care comută procesorul din user mode în kernel mode, permițând kernel-ului să execute operația în siguranță și să returneze rezultatul aplicației.
Tipuri de kernel-uri:
Monolithic: Încorporează o mare parte din funcționalitățile sistemului de operare în propriul cod, rezultând într-o amprentă mai mare, dar potențial mai rapidă. (Ex: Linux)
Microkernel: Oferă funcții de bază ale kernel-ului (gestionarea proceselor, a memoriei) și se bazează pe alte servicii ale sistemului de operare care rulează în spațiul utilizatorului, având o amprentă mai mică și potențial mai stabilă. (Ex: Minix)
Hybrid Se situează între monolitic și microkernel, adoptând elemente din ambele arhitecturi. (Ex: Windows, macOS)
Timesharing
Timesharing este o tehnică utilizată în sistemele de operare pentru a partaja resursele CPU (procesor) între mai mulți utilizatori sau procese simultan.
Context istoric:
Timesharing-ul a apărut în anii 1960 ca răspuns la o problemă economică: un mainframe costa milioane de dolari, iar alocarea sa unui singur utilizator la un moment dat era extrem de ineficientă — majoritatea timpului, procesorul aștepta operații lente (citire de la tastatură, scriere pe bandă magnetică). Primul sistem de timesharing funcțional a fost CTSS (Compatible Time-Sharing System), dezvoltat la MIT în 1961, care permitea mai multor utilizatori conectați prin terminale să folosească simultan un IBM 7094. Succesul CTSS a inspirat dezvoltarea proiectului MULTICS, care la rândul său a influențat direct crearea UNIX.
Concept:
Într-un sistem timesharing, CPU-ul este alocat fiecărui utilizator sau proces pentru o perioadă scurtă de timp, numită "quantum".
Când un quantum se termină, CPU-ul este realocat altui utilizator sau proces care așteaptă.
Acest proces se repetă rapid, creând iluzia că toți utilizatorii sau procesele au acces simultan la CPU.
Mecanismul tehnic care face posibilă această alternare rapidă se numește context switch (comutare de context): atunci când quantum-ul unui proces expiră, SO-ul salvează întreaga stare a procesului curent (registrele procesorului, contorul de program, starea stivei) și restaurează starea procesului următor din coadă. Acest lucru se întâmplă de sute sau mii de ori pe secundă, suficient de rapid pentru ca utilizatorul să nu perceapă întreruperile. Context switch-ul are totuși un cost: timpul petrecut salvând și restaurând starea nu este timp productiv, motiv pentru care optimizarea sa este un obiectiv important în proiectarea SO-urilor.
Beneficii:
Permite mai multor utilizatori să utilizeze un singur sistem de calculator simultan.
Crește eficiența utilizării CPU-ului, reducând timpul de inactivitate.
Îmbunătățește răspunsul sistemului pentru utilizatori, oferind o experiență mai interactivă.
Implementare:
Se utilizează un program special numit "scheduler" pentru a gestiona alocarea CPU-ului.
Schedulerul utilizează diverse algoritmi pentru a determina care utilizator sau proces primește accesul la CPU în continuare.
Algoritmii de scheduling pot lua în considerare factori precum prioritatea utilizatorului, tipul de proces, durata quantum etc.
Tipuri de timesharing:
Preemptive timesharing: Schedulerul poate întrerupe un proces care utilizează CPU-ul și îl poate relua ulterior.
Non-preemptive timesharing: Un proces își păstrează controlul asupra CPU-ului până când renunță voluntar la el.
Exemple de sisteme de operare care utilizează timesharing:
Unix
Linux
Windows
macOS
Considerații:
Timesharing poate introduce o ușoară latență (întârziere) în execuția proceselor.
Este important să se utilizeze algoritmi de scheduling eficienți pentru a optimiza utilizarea resurselor.
Concluzie:
Timesharing este o tehnică fundamentală în sistemele de operare moderne, permițând utilizarea eficientă a resurselor CPU și oferind o experiență interactivă pentru mai mulți utilizatori simultan.
Last updated