Il Sistema Operativo

Il sistema operativo è un insieme di programmi e di moduli software, scritti allo scopo di rendere disponibili all’uso le risorse di calcolo e i dispositivi collegati al computer. È il programma responsabile della gestione dei componenti hardware che costituiscono un computer e dei programmi che su di esso girano. Il compito principale del sistema operativo è quello di permettere all'uomo di interagire direttamente con la macchina.

Ciascun programma ha compiti specifici da svolgere, per esempio quando un utente interagisce col computer le richiese vengono interpretate dai vari programmi e poi raggiungono l’hardware. Il sistema operativo è in grado di accedere anche a periferiche non previste inizialmente, deve però poter disporre dei relativi device driver, in conclusione il sistema operativo è in grado di poter essere personalizzato e ampliato a seconda della macchina su cui viene installato. I dispositivi con tecnologia Plug and Play riescono a farsi riconoscere dal sistema e richiedere l’installazione dei driver corretti.

Un sistema è detto monoprogrammato quando in un dato istante contiene nella memoria centrale solo codice utente proveniente da un unico programma. Il codice viene eseguito dalla CPU che preleva le istruzioni dalla memoria e le esegue una per volta. Quando il programma utente termina la memoria diventa disponibile ed accoglie un nuovo programma da eseguire. Nei sistemi monoprogrammato la CPU potrebbe essere sfruttata meglio, se nel tempo in cui non viene usata dal programma utente fosse usata da altri programmi.

Il sistema multiprogrammato è in grado di gestire più programmi utente nello stesso periodo. Il sistema è più complesso e deve per esempio decidere quale istruzione far eseguire dopo quella attuale, evitare che i dati di un programma vengano inquinati dalle istruzioni di un altro, risolvere gli eventuali conflitti per l’assegnazione di una determinata risorsa (per esempio una stampante).

Il Time Sharing (a partizione di tempo) è un modo di gestione che assegna a una risorsa un tempo limite per il suo uso, questo periodo di tempo viene detto Time Slice. Quando il time slice termina il sistema operativo “parcheggia” il programma e manda in esecuzione il successivo. Nel sistema operativo vi possono essere dei meccanismi di priorità che permetteno ad alcuni programmi di essere eseguiti prima e magari con un time slice più lungo. Va comunque notato che non tutte le periferiche sono gestite dal time sharing, per esempio per una stampante non c’è un time slice in quanto ogni utente usa il dispositivo finché gli serve e poi lo rilascia. Il time sharing presuppone sempre l’esistenza di un time slice.

I sistemi operativi hanno tre configurazioni fondamentali:

  1. Sistemi dedicati: Questi sistemi (PC e workstation) prevedono l’utilizzo da parte di un solo utente per volta. Tuttavia i sistemi dedicati attuali (Windows e Linux) supportano il multitasking, cioè permettono di eseguire più applicazioni contemporaneamente sulla stessa macchina. Attraverso l’uso di una interfaccia grafica a finestre si possono vedere e gestire diverse applicazioni e passare dall’una all’altra molto semplicemente. In questi casi il sistema operativo contiene DLL (librerie di collegamento dinamico) che contengono procedure e funzioni condivise tra diverse applicazioni. Tipico esempio sono le finestre di dialogo che possono essere usate da più applicazioni usando lo stesso codice. In questi sistemi vi è uno sfruttamento intenso delle risorse disponibili.
  2. Sistemi batch: in questo tipo di sistema l’utente non interagisce con il calcolatore durante l’esecuzione dei programmi, quindi bisogna preparare prima tutto il lavoro e poi alla fine si ottiene il risultato. Può essere considerato l’opposto dell’interattività. Questo sistema ha evidenti svantaggi ma permette uno sfruttamento intelligente delle risorse, in quanto eliminando i tempi di attesa I/O il sistema risulta più veloce ed efficiente. Quando il lavoro richiesto finisce la CPU viene liberata e si può dedicare ad altre applicazioni e per mezzo dell’elaboratore di canale il risultato viene trasferito all’output. Gli eleboratori di canale sono costituiti da un’area di memoria detta buffer, nella quale si accumulano i caratteri da trasferire. Il Job stream è la sequenza di fasi da eseguire nel modo batch. Il sistema batch non essendo interattivo non è molto diffuso, tuttavia si trova nei sistemi moderni dove non è richiesto l’intervento dell’operatore o dove si eseguono sempre gli stessi comandi e magari a determinati orari. L’estensione dei file batch è BAT, questi file sono comodi quando si devono eseguire delle sequenze di comandi sempre uguali e non si vuole far eseguire un insieme complicato di comandi ad un utente inesperto. Un tipico esempio è il file Autoexec.bat che contiene l’insieme dei comandi da far eseguire all’accensione del computer come connettersi alla rete, caricare il mouse e la tastiera e tutto il resto.
  3. Sistemi interattivi multiutente: Sono dei sistemi dove più utenti possono operare allo stesso tempo. Attraverso l’uso del time sharing della CPU a ciascun utente viene dedicata a turno e per un dato tempo l’uso della CPU, se questo dato tempo (time slice) è abbastanza breve ciascun utente ha l’impressione di lavorare su una macchina dedicata. Ovviamente la velocità dalla CPU e la dimensione della memoria centrale sono dei parametri fondamentale per il time sharing.

I Processi

Il sistema operativo assegna le risorse in modo che tutti i richiedenti vengano prima o poi soddisfatti e divide la memoria centrale tra gli utenti facendo in modo che non possano accedere a zone fuori della loro competenza in modo da non poter modificare il codice del sistema operativo o quello degli altri utenti.

Il Processo è un in insieme di azioni da eseguire in sequenza e di dati elaborati dalle stesse azioni. La differenza tra programma e processo è che il processo si evolve nel tempo ed è sequenziale mentre il programma rimane uguale e contiene cicli e salti.

Il processore è l’oggetto che causa l’evoluzione di un processo. Gli stati possibili di un processo sono 5:

  1. Esecuzione: sta utilizzando la CPU, è in evoluzione.
  2. Pronto: è in attesa di utilizzare la CPU.
  3. Attesa (wait): è in attesa del completamento di un’operazione I/O.
  4. Terminazione: termina il programma.
  5. Parcheggio: il processo si trova in memoria di massa.

I passaggi di stato di un processo sono i seguenti:

Le Interruzioni

Un classico esempio di interruzione sono le richieste di I/O che non hanno un tempo prevedibile. Quando le interruzioni derivano da fattori esterni al sistema si dicono asincrone, esempi di tali interruzioni sono: errori, la fine stampa, l’invio di dati o comandi tramite tastiera. Per esempio in caso di errore si deve generare un messaggio e decidere se il processo deve continuare o essere terminato. Le interruzioni sincrone dipendono da fattori interni alla macchina, anche dal programma stesso, per esempio dal time sharing che dopo un certo periodo dall’ultima comunicazione con la risorsa crea l’interruzione.

Il Nucleo

L’unità centrale (CPU) è un esecutore sequenziale di operazioni. Con il time sharing la CPU può essere vista come un insieme virtuale di processi funzionanti a turno, il processore è uno solo ma corrisponde a più processi virtuali. Il Nucleo (Kernel) è la parte del sistema operativo più vicina alla macchina, le sue funzioni sono di:

La gestione della memoria

Il gestore della memoria simula l’esistenza di una pluralità di unità di memoria centrale, ciascuna associata a uno dei processori virtuali generati dal nucleo(kernel).

Con il metodo a partizioni fisse la memoria centrale viene divisa appunto in un numero di locazioni di uguale dimensione. Questo metodo presenta due limiti fondamentali:

  1. Il numero massimo di processi in memoria è prefissato.
  2. Un blocco contenente un processo breve è comunque considerato occupato e perciò lo spazio rimanente risulta sprecato.

Con il metodo a ripartizioni variabili i programmi vengono caricati in sequenza dovunque ci sia spazio, ciò però comporta il problema che dopo lo scaricamento si verranno a creare spazi di lunghezza variabile in posizioni casuali e quindi questo comporta un maggior carico di lavoro per il sistema operativo, ovviamente però vi è un miglior sfruttamento della memoria centrale.

Se il programma è molto grande si usa la tecnica Overlay (sovrapposizione) dove solo una parte per volta del programma viene caricata nella memoria centrale e la parte restante viene lasciata sulla memoria di massa. La zona del disco che viene riservata alla parte restante si chiama Swap.

La gestione della memoria virtuale si ha con due diverse tecniche:

Il File System

File System: è un modulo del sistema operativo che si occupa dell’organizzazione fisica e logica dei file su una memoria di massa.

Il file system provvede alla virtualizzazione delle memorie di massa e genera una macchina costituita da dispositivi indipendenti l’uno dall’altro. Tutto ciò che viene registrato su memoria di massa ha il nome di file. Le principali funzioni sono:

I dischi vengono divisi in anelli concentrici (tracce) e in fette radiali (settori), i file vengono divisi in blocchetti di di dimensioni uguali tra loro e ugualmente i dischi vengono divisi in aree della stessa dimensione. Quindi dovendo scrivere un file su disco non è necessario che ci sia uno spazio contiguo grande per tutto il file, ma basta che ci sia un numero di aree libere uguale al numero di blocchi del file. Nei sistemi operativi Linux, Dos e Windows il sistema gerarchico di directory è strutturato ad albero, il suo livello più elevato è la root, collocata in posizione fissa e nota al sistema. Usare il pathname assoluto significa indicare il percorso completo con tutti i nodi partendo dalla root, mentre il pathname relativo indica il percorso a partire dalla directory corrente.