Sistemi Operativi

Introduzione ai sistemi operativi

 

Un sistema operativo è un programma specializzato nella gestione dell’hardware su cui risiede, e da questo punto di vista può essere definito come un intermediario tra l’utente e l’hardware, dove per utente non si intende solo una persona umana ma anche programmi o altri computer che hanno la necessità di usare il sistema. Un sistema operativo svolge talmente tanti compiti che potrebbe essere definito in altrettanti modi diversi. E’ più facile dire ciò che fa un sistema operativo che esprimere ciò che è. Se si tiene in considerazione che un sistema operativo si occupa di allocare e deallocare le risorse ai vari utenti (processi) che ne fanno richiesta allora un S.O. può essere definito un allocatore di risorse, se invece si tiene in considerazione il fatto che un S.O. controlla l’esecuzione dei vari programmi per impedire un non corretto utilizzo del computer specie per ciò che riguarda l’I/O allora il S.O. è un programma di controllo, che per altro ha la particolarità di non terminare mai (Kernel), almeno fino allo spegnimento della macchina. Ma un S.O. e soprattutto un aiuto nell’uso dell’hardware sottostante, cioè rende conveniente l’uso del computer sollevando l’utente dalla gestione diretta delle periferiche come i dischi o altre risorse, occupandosi di queste in maniera efficiente. Infatti, alcuni sistemi sono dotati d’interfacce grafiche utilizzate dagli utenti umani e interfacce software per utenti non umani.

Esistono molti tipi di sistemi operativi, alcuni sono l’evoluzione d’intuizioni e soluzioni adottate per i primi computer altri sono delle specializzazioni di sistemi già esistenti e che non aggiungono nulla di nuovo a quanto gia esiste. Quella che segue è l’evoluzione dei sistemi operativi:

q               Sistemi batch semplici  (primo S.O.)

q               Sistemi batch multiprogrammati (evoluzione)

q               Sistemi time-sharing (evoluzione)

q               Sistemi per personal computer (specializzazione di ciò che già esisteva con poche innovazioni sostanziali ma molti miglioramenti)

q               Sistemi paralleli

q               Sistemi distribuiti

q               Sistemi real-time

Sistemi batch semplici 

In principio i computer erano enormi, molto costosi e difficili da programmare. Un programmatore interagiva con questa macchina tramite una console e inseriva i programmi (da scrivere già in codice macchina) usando delle schede perforate che venivano lette tramite dei lettori di schede. L’interazione con il computer non era “dinamica” nel senso che il programmatore preparava dei job (consistenti nel programma da eseguire, dai dati da usare, e da altre informazioni (schede di controllo)), che eseguiva e ne attendeva i risultati. Tutto questo era poco produttivo e conveniente e ci si rese ben presto conto che vi erano molte procedure (come quelle che effettuavano operazioni di I/O) che il programmatore doveva riscrivere per ogni nuovo programma anche se erano poi sempre le stese. Così si pensò che tali compiti potevano essere scritti una volta per tutte ed inserite come parti software sempre presenti in un computer. Questo è il primo embrione di sistema operativo che andrà via via arricchendosi di nuove funzionalità. A questo punto però mentre i programmatori si concentravano sulla realizzazione dei programmi e il sistema batch della gestione a lotti degli stessi, una nuova figura professionale si preoccupava di fare da tramite tra il programmatore e il sistema, cioè l’operatore. Quest’ultimo, infatti, aveva il compito di raccogliere le schede dei vari programmatori, di organizzarle, di inserirle nel computer, di eseguire i job, di attendere l’output degli stessi e di restituire i risultati ai rispettivi programmatori. Nel frattempo potevano essere passate ore o giorni e se un programmatore aveva commesso un errore nel proprio programma solo dopo questo elevato lasso di tempo (detto turnaround) poteva porvi rimedio (cioè leggere la stampa dell’immagine binaria del suo programma in memoria, capirci qualcosa, correggere, ricompilare, riconsegnare all’operatore e attendere). Questo tipo di sistema aveva sì risolto il problema della ridondanza di codice uguale per ogni programma ma aveva introdotto due nuovi inconvenienti che saranno risolti solo in seguito: 1) il programmatore non interagiva più direttamente con la macchina 2) un turnaround elevato.

Inoltre nelle prime versioni dei sistemi batch semplici la CPU restava spesso inutilizzata, infatti, se un job in esecuzione doveva effettuare delle operazioni di I/O ad esempio da un lettore di schede, la velocità di quest’ultima risorsa era molto più bassa di quella della CPU che non poteva effettuare altre computazioni per tutto il tempo dell'operazione di lettura. Con l’avvento dei dischi e della tecnica denominata spooling questo problema venne in parte risolto. Lo spooling consiste nel copiare sul disco i dati letti dalle schede o da scrivere su una stampante e migliorare cosi l’uso della CPU. Quindi il disco viene usato come un grande buffer.

Sistemi batch multiprogrammati

Sebbene lo spooling migliorava le prestazioni di un sistema, non era sufficiente a garantire un uso costante o ininterrotto della CPU, infatti, per quanto veloce, un disco è sempre molto più lento della CPU. Così si pensò di sviluppare un sistema batch multiprogrammato ovvero un sistema in grado di eseguire un job finche questi usa la CPU, (ovvero finché non richiede un’operazione di I/O), e di eseguirne un altro, quando il primo effettua le sue operazioni di I/O.

In questo modo venivano usate contemporaneamente la CPU e il dispositivo di I/O, cosa che non accadeva precedentemente dove le risorse venivano usate in sequenza. Questo approccio introduce molti concetti importanti, infatti, il sistema deve decidere quali job caricare in memoria tra quelli presenti sul disco (scheduling a lungo termine dei job), e quale eseguire tra quelli presenti in memoria (scheduling a breve termine della CPU), deve poi garantire che i processi tenuti contemporaneamente in memoria restino in un certo ordine (gestione della memoria). Sebbene l’uso della CPU era pressoché costante e che le prestazioni erano ulteriormente migliorate, ci si rese conto che se si fosse aumentata l’interattività tra programmatore e computer sarebbe aumentata anche la loro produttività (a vantaggio di tutti tranne dell’operatore che diventerà non necessario nei sistemi time-sharing è sarà cancellato).

Sistemi time-sharing

Il time-sharing risolve alcune difficoltà che un utente incontrava nell’uso di un sistema batch multiprogrammato ovvero il fatto che un job dopo essere stato impostato e lanciato non poteva essere modificato durante la sua esecuzione e l’utente fino alla fine del job non aveva niente da fare. Inoltre un programma doveva essere scritto e testato staticamente, cioè non poteva essere provato sulla macchina mentre si tentavano delle modifiche. La naturale evoluzione di un simile sistema fu il sistema time-sharing (multitasking) nel quale più job vengono eseguiti dalla CPU che commuta la loro esecuzione non quando il job deve effettuare un’operazione d' I/O, ma con una frequenza tale da dare l’impressione agli utenti che tutti i processi caricati vengano eseguiti contemporaneamente, ciò consente ad ogni utente di interagire con il proprio programma durante la sua esecuzione, di modificarne i dati di input o di controllarne il funzionamento lanciando altri programmi.

Quindi con un sistema time sharing ogni programmatore aveva una sua postazione costituita da una tastiera e da un monitor e il sistema forniva un editor e un debugger e cosa più innovativa un file system on-line cioè supportava il salvataggio/lettura dei dati organizzati in file. I sistemi time-sharing presero vita negli anni 60 ma ebbero successo solo negli anni 70. Un sistema time-sharing avendo la necessità di caricare e tenere in memoria molti programmi, le cui dimensioni complessive potevano essere superiori alle dimensioni effettive della memoria introduce due concetti innovativi: 1) lo swapping 2) la memoria virtuale.

Con lo swapping un processo in memoria non attivo veniva temporaneamente scritto sul disco mentre un altro veniva spostato dal disco in memoria per essere eseguito.

Con la memoria virtuale una porzione di disco viene usata come una estensione della memoria centrale che diventa virtualmente più grande.

Sistemi per personal computer

Con la riduzione dei costi dei componenti hardware è stato possibile realizzare computer moto piccoli se paragonati ai primi computer. Queste nuove macchine vennero chiamate personal computer, perché venivano assegnate ad un singolo utente. I sistemi operativi per questa classe di macchine erano multitasking ma supportavano anche operazioni in batch, sebbene assegnate ad un singolo utente alcuni sistemi supportavano la sicurezza sui file qualora la macchina veniva collegata ad altre macchine con altri utenti, alcuni sistemi piuttosto che ottimizzare l’uso delle risorse, puntarono verso la convenienza dell’uso di queste ultime, cioè rendere più facile il proprio utilizzo anziché il più intensivo possibile.

Sistemi paralleli

Nei sistemi paralleli esistono due o più CPU che devono essere coordinate da S.O. per un corretto funzionamento.

Un sistema parallelo viene detto anche multiprocessore o sistema strettamente accoppiato perché le CPU condividono le risorse del sistema. Un sistema del genere ha un alto numero di job eseguiti in un unità di tempo per cui si dice che ha un elevato throughput. Occorre precisare però che aumentando di n volte il numero di processori non vuol dire aumentare di n volte il throughput questo perché occorre un certo tempo per gestire il corretto funzionamento delle n CPU e gestire la conflittualità delle risorse condivise, tale tempo è chiamato overhead. Un’altra caratteristica dei sistemi paralleli e l’alta affidabilità o tolleranza ai guasti, infatti, in un sistema con n processori se se ne guasta uno ne restano n-1 che possono continuare a funzionate (con prestazioni ridotte), questa caratteristica è detta degradazione controllata. Alcuni sistemi paralleli, infatti, vengono progettati appositamente per supportare l’alta affidabilità piuttosto che un incremento di prestazioni, questi sistemi, infatti, hanno un hardware duplicato (il costo è ovviamente proporzionato) nel quale a determinati lassi di tempo (checkpoint) viene copiata l’immagine binaria di tutto ciò è presente nell’hardware primario. Se si verifica un guasto, l’hardware duplicato non guastato prende il posto di quello guastato e i processi vengono riavviati a partire dallo stato in cui erano nell’ultimo checkpoint.

I sistemi paralleli si distinguono in sistemi simmetrici e sistemi asimmetrici.

Nei primi su ogni CPU risiede ed e eseguita una copia del S.O. che quando necessario comunica con gli altri processori. I programmi vengono eseguiti ripartendoli tra le varie CPU. Programmare un sistema del genere è molto complesso.

Negli asimmetrici invece il S.O. risiede su un processore detto master e che fa da coordinatore, mentre sugli altri processori detti slave vengono eseguiti solo i programmi.

Sistemi distribuiti

Nei sistemi distribuiti più CPU sono tra loro collegate tramite linee telefoniche o bus ad alta velocità, le CPU non condividono tra loro la memoria o altre risorse e per questo sono detti debolmente accoppiati.

Sistemi real-time

I sistemi real-time sono particolari sistemi sviluppati per risolvere problemi nei quali il tempo di esecuzione e determinante, es. un braccio meccanico in una fabbrica di automobili dopo aver determinato la posizione della vettura deve potersi fermare in tempo per non danneggiarla.

© 2018 sito prototipale studio di GiuseppeGi