10-I Sistemi Operativi

10-I Sistemi Operativi

 

{gspeech style=2} 

Introduzione
Con il passare degli anni i computer sono diventati dei sistemi sempre più complessi, con software sempre più sofisticati, necessari per gestirne il funzionamento e le interazioni con gli utenti. A causa di questa complessità, il software di un calcolatore può essere suddiviso in due categorie: i programmi di sistema (che controllano e regolano il comportamento del calcolatore stesso) e i programmi applicativi.
I programmi applicativi sono noti a tutti gli utenti di un computer e possono essere di vario tipo: editor di testo, word processor, foglio di calcolo, browser per Internet, giochi, programmi per la riproduzione e la creazione di file multimediali, e così via.
I programmi di sistema invece sono quei programmi che, in gran parte nascosti agli occhi degli utenti comuni, rendono possibile la gestione delle risorse del sistema e ne controllano il funzionamento e l’interfacciamento con l’esterno; tra questi il più importante è il sistema operativo.

Il sistema operativo (che in seguito verrà indicato con l’acronimo SO) svolge una funzione fondamentale; infatti agisce come intermediario tra l’utente ed il calcolatore stesso, controllando tutte le risorse dell’hardware e mettendo a disposizione un ambiente nel quale eseguire i programmi applicativi. Vediamo immediatamente il motivo per cui, in un computer, devono essere presenti i sistemi operativi.
Un calcolatore moderno, come già abbiamo detto nel primo modulo, è un sistema molto articolato, costituito da uno o più processori, da una certa quantità di memoria principale (la RAM), da uno o più dischi fissi (hard disk), dalla tastiera, dal monitor, dal mouse, dalla stampante, dalla scheda video, dalla scheda audio, dal modem, dalle schede di rete e da tanti altri dispositivi di basso livello, di cui molti utenti ignorano persino l’esistenza.
Se chi scrive un programma dovesse prendere in considerazione tutti questi componenti e usarli correttamente, curandosi dei dettagli con cui essi lavorano e delle moltissime complicazioni che potrebbero verificarsi durante ognuna delle possibili operazioni, certamente risulterebbe quasi impossibile costruire delle applicazioni funzionanti. Molti anni fa ci si rese conto che era opportuno rendere invisibile al programmatore la complessità dell’hardware, sia per un problema di efficienza dei programmi, sia per permettere il trasporto del software da una macchina all’altra avente caratteristiche hardware differenti.
La soluzione a questo problema è rappresentata dall’introduzione di un tipo di software che stia al di sopra dell’hardware e che si occupi di controllare tutte le parti del sistema presentando all’utente un’interfaccia più semplice da capire e più facile da programmare, tale software è appunto il sistema operativo.
Possiamo a questo punto affermare che un SO ha principalmente due compiti:
gestire i dispositivi hardware e le loro interazioni;

supervisionare l’esecuzione dei programmi, assegnando in maniera opportuna le risorse e rilevando eventuali errori.
Per comprenderne pienamente l’importanza del SO diamo uno sguardo all’architettura interna di un calcolatore:

Hardware

Programmi di sistema

Programmi applicativi

Linguaggio macchina

Utilità di sistema

Programmi per la gestione ufficio

Dispositivi fisici

Sistema operativo

Giochi e programmi vari

Come possiamo osservare dallo schema, l’architettura di un elaboratore può essere strutturata in livelli, ognuno dei quali comunica solo con quelli adiacenti. È interessante notare che il linguaggio macchina, pur essendo un software, viene annoverato all’interno della componente hardware: questo è dovuto al fatto che esiste un legame strettissimo tra le istruzioni del linguaggio macchina ed i dispositivi fisici che le implementano, al punto che praticamente ogni famiglia di microprocessore o di microcontrollore dispone di un proprio specifico linguaggio macchina, diverso da tutti gli altri anche solo per delle piccole sfumature nel linguaggio. A causa di questo fatto abbiamo che ogni piattaforma ha delle caratteristiche hardware differenti dalle altre ed è dotata di un proprio linguaggio macchina; se non esistesse il sistema operativo, un programmatore dovrebbe preoccuparsi di scrivere una versione del proprio programma per ognuna di esse, o limitarsi ad ignorarne alcune, seguendo invece attentamente le evoluzioni di quelle prescelte per adattarvisi. 
Per ovviare a questo enorme inconveniente, il SO fornisce al programmatore, ed agli utenti in genere, un’unica interfaccia, qualsiasi sia la piattaforma sottostante; è infatti compito di chi scrive il SO far sì che le azioni decise dal programmatore siano tradotte nelle opportune istruzioni per la macchina rendendole poi comprensibili alla piattaforma sottostante nel suo linguaggio specifico.
Prima di esaminare le caratteristiche dei vari tipi di SO, è opportuno dire qualche parola su quello che avviene nel nostro PC al momento dell’accensione, ossia durante la cosiddetta fase di boot; faremo riferimento alla piattaforma hardware I386 e sue successive evoluzioni fino ai moderni Pentium dato che si tratta del più diffuso tipo di architettura.
Per prima cosa il processore carica da una ROM (Read Only Memory – memoria a sola lettura) il firmware della scheda madre, ossia un programma che provvede alla gestione dei primi istanti di funzionamento della macchina, fornendo una serie di funzionalità che verranno sfruttate da programmi successivi per completare l’avviamento.
Guardando con attenzione le scritte che vengono mostrate a video non appena si accende il computer, possiamo vedere che il BIOS (cioè il firmware degli elaboratori 386) esegue alcuni test, riconoscendo l’hard disk e le altre periferiche collegate alla scheda madre; questa fase prende il nome di POST, ovvero Power On Self Test.
Al termine di questa fase, il BIOS carica il master boot record (indicato con l’acronimo MBR), costituito da un settore localizzato nei primi 512 byte dell’hard disk, contenente, tra le altre cose, il programma incaricato del caricamento del sistema operativo, detto appunto boot loader.
Nel caso di un sistema contenente un solo SO, questo viene avviato automaticamente, spesso mostrando a video delle informazioni che permettono di sapere quali operazioni esso sta compiendo; se invece il nostro computer contiene più sistemi operativi, un boot loader opportunamente configurato presenterà un menu o un prompt che permette all’utente di specificare quale di essi avviare per primo.
Ogni SO ha il proprio boot loader, ma non tutti permettono di effettuare il multiboot, ovvero la possibilità di poter avviare SO differenti. Ad esempio, i sistemi basati su MS-DOS, come quelli della famiglia Windows, permettono di installare un loader nell’MBR (tramite il comando disk/mbr), che non consente di indicare sistemi alternativi, ma provvede semplicemente a caricare il boot sector di una partizione indicata come attiva.
Data la complessità di un SO, esso può avere componenti differenti tra loro ed un sistema può differire da un altro per moltissimi aspetti; tuttavia all’interno di un qualsiasi SO è quasi sempre possibile trovare dei sottosistemi che interagiscono tra loro per realizzare le funzioni necessarie alla gestione dell’intero sistema di elaborazione e che costituiscono la parte basilare di un sistema operativo:

1. gestione dei processi;
2. gestione della memoria principale;
3. gestione della memoria secondaria;
4. gestione del file system;

5. gestione dei dispositivi di I/O;
6. protezione delle risorse;
7. interprete dei comandi.

Un concetto chiave in tutti i sistemi operativi è il processo, ovvero l’istanza di un programma in esecuzione, che è costituito da:

1. il codice eseguibile (detto anche testo);
2. i dati su cui il codice lavora;
3. una lista (più o meno lunga) di strutture dati e informazioni che occupano risorse di sistema. 

È opportuno tener conto del fatto che programma e processo sono due cose distinte. Infatti un programma è un’entità passiva, ovvero un codice binario che può risiedere in un sistema di memorizzazione (come il disco) anche se il computer è spento e la cui durata può essere (almeno in teoria) infinita. Un processo invece è un’entità attiva, che scaturisce da un programma quando questo viene mandato in esecuzione e la cui durata è variabile e dipende dall’ambiente di esecuzione.
Quest’analisi conclude la descrizione introduttiva riguardo ai sistemi operativi, per meglio comprendere però la loro struttura è necessario analizzare nel dettaglio le caratteristiche generali di un qualsiasi sistema operativo standard.
Alla luce di quanto esposto nel paragrafo introduttivo, dove abbiamo presentato le principali funzioni dei sistemi operativi, possiamo affermare che, a livello formale le funzioni di un SO possono essere riassunte in tre parti principali:

1. gestione delle risorse hardware;
2. creazione e gestione del file system;
3. creazione e gestione dell’interfaccia con l’utente.

Per quanto riguarda la prima voce, la gestione delle risorse hardware, essa consiste, nei moderni computer, nel riconoscimento automatico della configurazione di sistema, secondo le funzionalità della tecnologia Plug&Play, oppure secondo le modalità tradizionali se il dispositivo hardware non dispone di tale possibilità; inoltre un altro compito consiste nell’allocazione in modo intelligente delle risorse hardware.
Per quanto riguarda invece la creazione e gestione di un file system bisogna osservare che l’organizzazione corretta delle informazioni all’interno di tutte le risorse di memoria appartenenti al sistema è di fondamentale importanza per il buon funzionamento del computer. Questo sistema di organizzazione prende il nome di file system e si occupa principalmente del caricamento e dell’esecuzione dei file eseguibili, della manutenzione del sistema ovvero delle memorie (in modo particolare dei dischi fissi, come vedremo in seguito parlando di Windows 98), dell’ottimizzazione del funzionamento di tutto il sistema, della corretta allocazione dei dati.
Infine, l’ultima parte riguarda la creazione di un’interfaccia fra l’utente ed il computer. Bisogna distinguere quale sia il sistema operativo in esame, perché nei sistemi operativi professionali l’interfaccia è rappresentata da righe di comandi visualizzate sullo schermo ed usate per il controllo delle operazioni; nei sistemi di tipo grafico, invece, l’interfaccia è creata in modo da risultare anche più piacevole, grazie all’uso di finestre e soprattutto di grafica bidimensionale.
Per quanto riguarda i componenti principali di un sistema operativo dobbiamo osservare che, a causa dell’evoluzione di tecnologie sempre più sofisticate, è praticamente impossibile al giorno d’oggi vedere i componenti fondamentali di un SO, soprattutto se si fa riferimento alla famiglia Windows. Gli utenti però devono tenere sempre ben presente che, al di là delle implementazioni grafiche che possono esserci, il SO mantiene alcuni componenti fon­damentali che non possono essere eliminati.

Il Kernel
A questo proposito si ha che il componente fondamentale di un sistema operativo è il cosiddetto kernel ovvero il nucleo; esso costituisce tutto l’insieme di istruzioni che consentono ad un microprocessore di operare ciclicamente per creare un ambiente operativo di basso livello. Questa parte del sistema operativo si occupa di definirne l’architettura fondamentale creando nello stesso tempo i presupposti necessari per dotare il sistema di funzionalità multitasking (ovvero della capacità di compiere più azioni contemporaneamente). Il kernel, infatti, rappresenta il componente del sistema operativo che più di tutti è correlato al funzionamento specifico del microprocessore (in altri termini il kernel si preoccupa proprio di dialogare direttamente col microprocessore).
Facendo riferimento ai microprocessori della famiglia INTEL il kernel del SO si occupa dell’inizializzazione di tutte le tabelle e dei registri speciali all’interno della CPU.
Un altro compito importante del kernel è rappresentato dalla cosiddetta virtualizzazione della memoria che permette ad ogni applicazione di vedere uno spazio di memoria virtuale di dimensione molto maggiore di quella presente fisicamente nel sistema sotto forma di moduli. Questo vuoi dire che, praticamente ogni applicazione può accedere ad uno spazio di memoria di qualche GByte anche se la memoria di sistema del proprio PC è limitata a 64 MByte.
Ultima delle funzioni fondamentali del kernel è la creazione di un sistema di protezione della memoria che non permetta alle applicazioni eseguite contemporaneamente sulla stessa macchina, di interagire tra loro se non in modo autorizzato e controllato.
Per il funzionamento di base di un sistema operativo sono comunque presenti numerosi altri componenti, organizzati come dei moduli di supporto e ad ognuno dei quali è attribuita una funzionalità specifica. Nei sistemi operativi della famiglia Windows, ad esempio, tali moduli sono rappresentati da piccoli programmi, detti virtual machine (macchine virtuali) che vengono eseguiti al massimo livello gerarchico (o di privilegio) e pertanto in grado di modificare il comportamento del sistema oppure di dotarlo di funzionalità nuove, non implementate in precedenza. Ad esempio, vengono implementati in questo modo i moduli che si occupano di creare ambienti di comunicazione basati sul protocollo TCP/IP, indispensabili per permettere il collegamento dei computer alla rete Internet.

Il BIOS
Si definisce BIOS un insieme di istruzioni codificate in linguaggio macchina, memorizzate stabilmente nella memoria per sola lettura (ROM) del sistema.
Tutte le routine che appartengono al BIOS sono realizzate per gestire la configurazione, la comunicazione, l’interfacciamento tra il sistema operativo e le componenti hardware e le, secondo gli standard ISA e PCI che ormai sono direttamente integrati negli appositi spazi sulla scheda madre.
Nei computer moderni, molte funzioni del BIOS sono state rimpiazzate da moduli specifici più specializzati e versatili ma, nonostante ciò, il BIOS ne conserva ancora di fondamentali. La prima fra queste è quella che si occupa dell’inizializzazione di base di tutte le periferiche del sistema, con particolare riguardo per quelle che sono interne alla scheda madre e per quelle dotate di particolari configurazioni proprie. Come secondo compito vi è quello di controllo e diagnostica delle funzionalità delle varie risorse (memoria, risorse di Input/Output, identificazione della CPU). L’ultima funzione, più semplice, ma anche fondamentale, consiste nell’effettuare il controllo detto di bootstrap prima di passare il controllo del funzionamento del computer al sistema operativo.
Il bootstrap è un insieme di operazioni che permettono il caricamento del sistema operativo in memoria, seguito dalla cessione del controllo del sistema direttamente al kernel del sistema operativo. Questo processo sembra semplice, ma in realtà coinvolge l’esecuzione in successione di un certo numero di procedure, secondo lo schema seguente:

1. inizializzazione del disco fisso per consentire un accesso a basso livello per mezzo del BIOS;
2. inizializzazione della memoria del sistema nella quale verranno inseriti i componenti principali del sistema operativo;
3. recupero dal disco del componente di caricamento del sistema operativo stesso, detto loader.

Praticamente la fase di bootstrap finisce dopo il caricamento del loader, che si occupa in prima persona delle successive inizializzazioni e del caricamento vero e proprio del SO, possiamo pertanto affermare che la sequenza di avvio è la seguente:

1. il bios inizia l’accensione;
2. segue il passaggio del controllo al loader;
3. infine il controllo viene assunto dal kernel del sistema operativo.

 {/gspeech}

 Esercizi
1. Quali compiti svolge un microprocessore?
2. Illustrare la differenza tra programmi di sistema e programmi applicativi.
3. Che cosa sono le periferiche di un computer?
4. Che cosa significa periferica di ingresso o di input?
5. Quali sono i compiti specifici di un sistema operativo?
6. Che cos’è il kernel di un sistema operativo?
7. Che cos’è il BIOS?
8. In cosa consiste la fase di bootstrap?
9. Perché è non solo utile, ma necessario utilizzare dei sistemi operativi? 

Esercizi
1. Con il termine processo generalmente si indica:
* un elemento che gestisce l’interfaccia utente
* l’istanza di un programma in esecuzione
* la gestione delle periferiche
* il software necessario per la stampa dei documenti

2. Con il termine BIOS si intende:
* il cuore del sistema operativo
* un insieme di istruzioni codificate in linguaggio macchina, memorizzate nella ROM del sistema
* il kernel del sistema operativo
* un protocollo per internet.

3. Il kernel del sistema operativo rappresenta:
* l’interfaccia utente
* il motore di ricerca interno alla macchina
* una porzione di memoria destinata alle applicazioni
* il nucleo del sistema operativo

Commento all'articolo