Definizione di sistema operativo
Un sistema operativo è un insieme di programmi (software) che gestisce gli elementi fisici di un calcolatore (hardware); fornisce una piattaforma ai programmi applicativi e agisce da intermediario fra l'utente e la struttura fisica del calcolatore. Un sistema operativo fornisce un ambiente nel quale i programmi possono essere eseguiti in modo utile e produttivo.
I principali scopi di un sistema operativo sono così riassumibili:
- Rendere un computer accessibile a tutti, esperti e non esperti, quindi semplice da utilizzare;
- Eseguire tutti i programmi richiesti dagli utenti;
- Sfruttare in maniera efficiente le risorse hardware;
Il sistema operativo svolge diversi ruoli:
- È un assegnatore di risorse: gestisce tutte le risorse e decide la risoluzione dei conflitti per un uso efficiente e sicuro delle risorse;
- È un programma di controllo: gestisce l'esecuzione dei programmi utenti in modo da impedire che si verifichino errori.
Non si dispone di una definizione completa ed esauriente di sistema operativo. Le funzioni di controllo e assegnazione di risorse sono state racchiuse in un unico insieme coerente di programmi: il sistema operativo. Non si dispone nemmeno di una definizione universalmente accettata di che cosa faccia parte di un sistema operativo. Un punto di vista semplice è considerare che esso comprenda tutto quello che il rivenditore fornisce quando gli si richiede “il sistema operativo”. Una definizione più comune è quella secondo cui il sistema operativo è il solo programma che funziona sempre nel calcolatore, generalmente chiamato kernel (nucleo). Oltre al kernel vi sono due tipi di programmi: i programmi di sistema, associati al sistema operativo, ma che non fanno parte del kernel, e i programmi applicativi, che includono tutti i programmi non correlati al funzionamento del sistema.
Organizzazione di un sistema di calcolo
Normalmente in un sistema di calcolo, dopo l'accensione materiale (con l'apposito bottone), avviene l'avviamento del sistema. Tale fase richiede la presenza di uno specifico programma iniziale, di solito non troppo complesso, detto programma d'avviamento (bootstrap program), in genere contenuto in tipi di memoria noti con il termine generale di firmware, il cui supporto fisico è parte integrante della macchina. Esempi di firmware sono le memorie a sola lettura (ROM), e le memorie programmabili cancellabili elettronicamente (EEPROM). Tipicamente il contenuto memorizzato in una ROM o in una EPROM viene caricato. Il suo scopo è quello di inizializzare ogni aspetto del sistema ovvero i registri della CPU e i controllori dei diversi dispositivi. Il programma d'avviamento deve caricare nella memoria il sistema operativo e avviarne l'esecuzione, perciò individua e carica nella memoria il kernel del sistema operativo. Il sistema operativo avvia quindi l'esecuzione del primo processo d'elaborazione, (per esempio sotto Linux, il primo processo è “init”), e attende che si verifichi qualche evento.
Un evento è di solito segnalato da un'interruzione, interrupt, si tratta di segnali che i controllori dei dispositivi possono inviare alla CPU ogni qualvolta un singolo dispositivo ha dei nuovi dati da sottoporre all'attenzione della CPU. Un altro tipo di segnale che può essere inviato alla CPU è l'eccezione, exception o trap, che è un interrupt causata da un programma in esecuzione a seguito di un evento eccezionale (esempio: un errore, una divisione per zero, un accesso alla memoria non valido) oppure a seguito di una richiesta specifica effettuata da un programma utente. Ogniqualvolta riceve un segnale d'interruzione, la CPU interrompe l'elaborazione corrente e trasferisce immediatamente l'attenzione al relativo segnale di interruzione. Una volta completata l'esecuzione della procedura richiesta, la CPU riprende l'elaborazione precedentemente interrotta. Il sistema operativo è quindi anche un gestore di interrupt.
Architettura degli elaboratori
Oggigiorno, il mercato offre principalmente due differenti sistemi di calcolo: i sistemi monoprocessore e i sistemi con più processori.
Un sistema monoprocessore è dotato di una CPU principale in grado di eseguire un insieme di istruzioni di natura generale, comprese quelle necessarie ai processi utenti. Quasi tutti i sistemi, inoltre, possiedono altri processori specializzati, deputati a compiti particolari. Essi possono assumere la forma di processori specifici di un dispositivo, ad esempio il microprocessore all'interno della tastiera, per convertire la pressione di ciascun tasto nel codice appropriato da trasmettere alla CPU. Sebbene i sistemi monoprocessore siano ancora molto comuni, l'importanza dei sistemi multiprocessore, conosciuti anche come sistemi paralleli o sistemi strettamente connessi, è in rapida crescita. Questo tipo di sistemi dispone di più unità d'elaborazione in stretta comunicazione, che condividono i canali di comunicazione all'interno del calcolatore (bus), i timer dei cicli di macchina (clock) e talvolta i dispositivi di memorizzazioni e periferici.
Tali sistemi hanno tre vantaggi principali:
- Maggiore produttività;
- Economicità;
- Incremento dell'affidabilità.
Inoltre la capacità di poter continuare ad offrire un servizio anche se una delle unità di calcolo è fuori uso, permette una maggiore tolleranza ai guasti (fault-tolerant).
I sistemi di elaborazione multiprocessore si distinguono anche in:
- Simmetrici: dove ogni unità ha la stessa capacità degli altri ed è abilitato a svolgere tutte le operazioni del sistema (condizione di parità);
- Asimmetrici: dove un'unità di elaborazione principale controlla il sistema e le altre attendono istruzioni dall'unità principale oppure svolgono compiti specifici predefiniti (sistema gerarchico).
Struttura del sistema operativo
Nonostante la struttura dei sistemi operativi possa variare grandemente, vi sono alcuni aspetti comuni. Tra le più importanti caratteristiche dei sistemi operativi vi è la multiprogrammazione e il time-sharing o multitasking.
La multiprogrammazione consente di aumentare la percentuale d'utilizzo della CPU, organizzando i lavori in modo tale da mantenerla in continua attività. Il sistema operativo tiene contemporaneamente in memoria centrale diversi lavori. Dato che, in genere, la memoria centrale è troppo piccola per contenere tutti i programmi da eseguire, questi vengono collocati inizialmente sul disco in un'area apposita, detta job pool, contenente tutti i processi in attesa di essere allocati nella memoria centrale. Il sistema operativo ne sceglie uno tra quelli contenuti nella memoria e inizia l'esecuzione: a un certo punto potrebbe trovarsi nell'attesa di qualche evento, come il completamente di un'operazione di I/O. in questi casi, in un sistema non multi programmato, la CPU rimarrebbe inattiva. In un sistema con multiprogrammazione, invece, il sistema operativo passa semplicemente a un altro lavoro e lo esegue. Quando il primo lavoro ha terminato l'attesa, la CPU ne riprende l'esecuzione. Finché c'è almeno un lavoro da eseguire, la CPU non è mai inattiva.
Il timesharing (o multitasking) è un'estensione logica della multiprogrammazione; la CPU esegue più lavori commutando le loro esecuzioni con una frequenza tale da permettere a ciascun utente l'interazione col proprio programma durante la sua esecuzione. Un sistema di calcolo interattivo permette la comunicazione diretta tra utente e sistema. L'utente impartisce le istruzioni direttamente al sistema operativo oppure a un programma, attraverso una tastiera o un mouse, e attende una risposta immediata. Il tempo di risposta dovrebbe perciò essere breve, in genere meno di un secondo. Un sistema operativo a partizione del tempo d'elaborazione permette a più utenti di condividere contemporaneamente il calcolatore. Il sistema passa rapidamente da un utente all'altro, quindi ogni utente ha l'impressione di disporre dell'intero calcolatore, che in realtà è condiviso da molti utenti. In pratica, ogni utente ha almeno un programma in esecuzione in memoria, chiamato processo. Se diversi processi sono in esecuzione nello stesso istante la CPU decide attraverso degli algoritmi di scheduling chi deve essere mandato in esecuzione. Con questa filosofia, bisogna però prestare una particolare attenzione alle interferenze che si potrebbero verificare (esempio: prelevare il valore corretto presente in un particolare registro, deve rispecchiare il valore che mi interessa, quindi non deve essere perturbato da eventuali modifiche dovute a processi in esecuzione).
In un sistema basato sulla partizione del tempo di elaborazione, il sistema operativo deve garantire tempi di risposta accettabili: questa finalità è raggiunta, in alcuni casi, grazie alla tecnica detta swapping (avvicendamento), che consente di scambiare i processi presenti in memoria con quelli che risiedono sul disco e viceversa. La situazione tipica che può provocare l'utilizzo intensivo dello swapping è l'esecuzione contemporanea di diverse applicazioni, in quanto ognuna necessita di un certo quantitativo di RAM libera per funzionare, e visto che nei normali PC questa risorsa si esaurisce molto in fretta, si allocano alcuni processi in memorie secondarie.
Attività del sistema operativo
I moderni sistemi operativi sono guidati dalle interruzioni. Quando i dispositivi dell'I/O non richiedono alcun servizio, il sistema operativo rimane inerte e attende che accada qualcosa. Quasi sempre, è un'interruzione o un'eccezione a segnalare eventi. Un segnale di eccezione (trap o exception) indica che si è verificata un'interruzione generata da un problema, dovuta a un errore o alla richiesta di erogazione, da parte di un programma utente, di un servizio del sistema operativo.
Dal momento che il sistema operativo e gli utenti condividono la dotazione di programmi e dispositivi dell'elaboratore, è necessario assicurarsi che un errore provocato da un programma utente non possa arrecare danno ad altri programmi. Senza un'efficace protezione da errori, il calcolatore è costretto a eseguire un solo processo per volta. Un sistema operativo progettato in maniera soddisfacente deve evitare che un programma viziato da errori possa indurre un'esecuzione scorretta di altri programmi.
Per garantire il corretto funzionamento del sistema è necessario distinguere tra l'esecuzione di codice del sistema operativo e di codice definito dall'utente. Sono necessarie almeno due diverse modalità: modalità utente e modalità di sistema. Per indicare quale sia la modalità attiva l'architettura della CPU deve essere dotata di un bit, chiamato appunto bit di modalità: di sistema (0) o utente (1). Quando l'elaboratore agisce per conto di un'applicazione utente, il sistema è in modalità utente. Tuttavia, allorquando l'applicazione utente rivolga una richiesta di servizio al sistema operativo (tramite una chiamata di sistema), per soddisfare la richiesta questi deve passare dalla modalità utente alla modalità di sistema. La duplice modalità di funzionamento (dual mode) consente la protezione del sistema operativo rispetto al comportamento degli utenti e viceversa. Questo livello di protezione si ottiene definendo come istruzioni privilegiate le istruzioni di macchina che possono causare danni allo stato di sistema. Poiché la CPU consente l'esecuzione di queste istruzioni soltanto nella modalità di sistema, se si tenta di far eseguire in modalità utente un'istruzione privilegiata, la CPU non la esegue, ma la tratta come un'istruzione illegale inviando un segnale di eccezione al sistema operativo. Se la CPU non dispone di queste due modalità di funzionamento il sistema operativo può andare incontro a serie limitazioni. Un programma utente potrebbe anche cancellare il sistema operativo scrivendo nuove informazioni nelle locazioni in cui questo è memorizzato. Una volta che la protezione hardware sia attiva, gli errori di violazione della modalità sono rilevati dall'hardware stesso, e di norma sono gestiti dal sistema operativo. Se un programma utente causa un errore, l'hardware reagirà sollevando un'eccezione. L'eccezione cede il controllo al sistema operativo, cioè segue una condotta analoga a quanto farebbe un'interruzione. Quando si imbatte nell'errore di un programma, il sistema operativo deve terminare il programma in maniera anomala. La cosa è gestita dal medesimo codice preposto alla terminazione anomala di un processo a seguito di una richiesta dell'utente: si compone un messaggio di errore appropriato, e si rilascia la memoria del programma incriminato. Il contenuto della memoria rilasciata è solitamente trascritto su un file, perché l'utente o il programmatore possano esaminarlo ed eventualmente correggerlo in vista di un nuovo utilizzo del programma.
Occorre, inoltre, assicurare che il sistema operativo mantenga il controllo dell'elaborazione, cioè impedisca che un programma utente entri in un ciclo infinito senza più restituire il controllo al sistema operativo. A tale scopo, viene utilizzato un timer, programmabile affinché invii un segnale d'interruzione alla CPU a intervalli di tempo specificati, che possono essere fissi (1/60 di secondo) o variabili. Prima di restituire all'utente il controllo dell'esecuzione, il sistema assegna un valore al timer. Se esso esaurisce questo intervallo genera un'interruzione che causa il trasferimento del controllo al sistema operativo, che può decidere se gestire le interruzioni come un errore fatale o concedere altro tempo al programma. La presenza di un timer garantisce quindi che nessun programma utente possa essere eseguito troppo a lungo.
Gestione dei processi
Il sistema operativo attraverso il gestore dei processi ha il compito di:
- Creare e rimuovere i processi degli utente e di sistema;
- Sospendere e riprendere l'esecuzione dei processi;
- Fornire dei meccanismi per la sincronizzazione dei processi;
- Fornire dei meccanismi per la comunicazione tra processi;
- Fornire dei meccanismi per la gestione dei deadlock (situazioni di stallo).
Un programma di per sé non è un processo d'elaborazione; un programma è un'entità passiva, come il contenuto di un file memorizzato in un disco, mentre il processo è un'entità attiva, con un contatore di programma che indica la successiva istruzione da eseguire. Un processo necessita di risorse per poter compiere un determinato lavoro, quali la CPU, la memoria i dispositivi di I/O.
Gestione della memoria
Il gestore della memoria si occupa della gestione dei dati in memoria prima e dopo l'esecuzione di un processo. In particolare, si deve occupare di caricare in memoria le istruzioni del processo per poter avviare la sua esecuzione. Questo è un importante modulo del sistema operativo in quanto rende più efficiente l'utilizzo della CPU. Le attività più importanti di un gestore della memoria sono:
- Tenere traccia di quale parte della memoria è occupata e da chi è usata;
- Decidere quali processi e dati spostare dentro e fuori la memoria;
- Allocare e deallocare blocchi di memoria quando è richiesto.
La gestione dei file è uno dei componenti più visibili di un sistema operativo. I calcolatori possono registrare le informazioni su molti mezzi fisici diversi, ciascuno con le proprie caratteristiche quali la velocità, la capacità, la rapidità nel trasferimento dei dati, il metodo d'accesso (diretto o sequenziale). Un file è una raccolta d'informazioni correlate definite dal loro creatore. I file possono rappresentare programmi, sia sorgente sia oggetto, e possono rappresentare anche dati. I file di dati possono essere a loro volta numerici, alfabetici, alfanumerici o binari; ma è chiaro che la loro forma può essere libera. I file sono generalmente organizzati in directory, che ne facilitano l'uso. Infine, se più utenti hanno accesso ai file, si potrebbe voler controllare chi ha la possibilità di accedevi e in che modo (per esempio, lettura, scrittura, aggiunta).
Il sistema operativo è responsabile delle seguenti attività connesse alla gestione dei file:
- Creazione e cancellazione di file;
- Creazione e cancellazione di directory;
- Fornitura delle funzioni fondamentali per la gestione di file e directory;
- Associazione dei file ai dispositivi di memoria secondaria;
- Creazione di copie di riserva dei file su dispositivi di memorizzazione non volatili.
Lo scopo principale di un sistema di calcolo è quello di eseguire programmi. Durante l'esecuzione, i programmi devono trovarsi in memoria centrale. Giacché la memoria centrale è troppo piccola per contenere tutti i dati e tutti i programmi, e il suo contenuto va perduto se il sistema si spegne, il calcolatore deve disporre di una memoria secondaria a sostegno della memoria centrale. La maggior parte dei moderni sistemi di calcolo impiega i dischi come principale mezzo di memorizzazione secondaria, sia per i programmi sia per i dati. La velocità di un Sistema Operativo è caratterizzante anche da come è gestita la memoria di massa, alcune operazioni cruciali sono:
- Gestione dello spazio libero;
- Assegnazione dello spazio;
- Scheduling del disco.
Sistemi di I/O
Uno degli scopi di un Sistema Operativo è nascondere all'utente la complessità dell'hardware. Le caratteristiche dei dispositivi di I/O sono nascoste alla maggior parte dello stesso sistema operativo dal sottosistema di I/O, che ha lo scopo di:
- Gestire la memoria riservata ai trasferimenti I/O verso i buffer.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.