Capitolo 6

Capitolo 6

I Sistemi Operativi Multiprogrammati (1960-1970)

Con l'aumento della potenza e della complessità dell'hardware dei computer negli anni '60, divenne sempre più evidente la necessità di software di sistema più sofisticato per gestire le risorse della macchina e semplificare l'esecuzione dei programmi. I semplici sistemi di batch processing, pur avendo rappresentato un primo passo verso l'automazione, mostravano i loro limiti in termini di efficienza e interattività. Questo periodo vide l'emergere dei sistemi operativi multiprogrammati e time-sharing, che avrebbero rivoluzionato il modo in cui gli utenti interagivano con i computer e avrebbero gettato le basi per i sistemi operativi moderni.

6.1 Le Limitazioni del Batch Processing:
Un'Esecuzione Sequenziale e Inefficiente

Come discusso nel Capitolo 3, il batch processing prevedeva l'esecuzione sequenziale di un insieme di lavori, con un intervento limitato dell'operatore. Sebbene questo approccio migliorasse l'utilizzo del computer rispetto all'esecuzione manuale di ogni singola istruzione, presentava diverse significative limitazioni:

  • Bassa utilizzazione della CPU: Durante le operazioni di input/output (I/O), la CPU spesso rimaneva inattiva in attesa che il dispositivo esterno completasse il suo compito. Questo portava a una sottoutilizzazione della costosa risorsa CPU.
  • Lunga attesa per i risultati: Gli utenti dovevano attendere il completamento dell'intero batch per ottenere i risultati del proprio lavoro, anche se questo richiedeva solo una frazione del tempo di esecuzione totale.
  • Mancanza di interattività: Non era possibile interagire con il programma durante la sua esecuzione, rendendo difficile il debugging e l'esecuzione di applicazioni che richiedevano un feedback immediato.
  • Priorità limitate: Tutti i lavori nel batch venivano generalmente eseguiti con la stessa priorità, senza possibilità di favorire lavori più urgenti o importanti.

Queste limitazioni spinsero i ricercatori e gli sviluppatori a esplorare nuove modalità di gestione delle risorse del computer che potessero superare le inefficienze del batch processing.

6.2 L'Emergere della Multiprogrammazione:
Condividere la CPU per Massimizzare l'Utilizzo

La multiprogrammazione è una tecnica che permette a più programmi (o processi) di risiedere contemporaneamente nella memoria principale e di condividere la CPU. L'idea fondamentale è che quando un programma deve attendere il completamento di un'operazione lenta (come un'operazione di I/O), la CPU può passare all'esecuzione di un altro programma pronto per essere eseguito. In questo modo, si cerca di mantenere la CPU il più possibile occupata, migliorando l'efficienza complessiva del sistema.

Per implementare la multiprogrammazione, erano necessari diversi meccanismi:

  • Gestione della memoria: Il sistema operativo doveva essere in grado di allocare e gestire lo spazio di memoria per ospitare più programmi contemporaneamente, garantendo che un programma non interferisse con la memoria di un altro.
  • Scheduling della CPU: Il sistema operativo doveva implementare algoritmi per decidere quale dei programmi pronti per l'esecuzione dovesse ottenere l'accesso alla CPU e per quanto tempo.
  • Protezione: Era fondamentale che il sistema operativo fornisse meccanismi di protezione per impedire che un programma potesse accedere o modificare la memoria o le risorse di un altro programma in modo non autorizzato.

La multiprogrammazione permise di aumentare significativamente la produttività dei sistemi informatici, in quanto più lavori potevano essere completati nello stesso intervallo di tempo.

6.3 I Primi Sistemi Operativi Multiprogrammati:
Pionieri nella Gestione delle Risorse

Alcuni dei primi sistemi operativi a implementare la multiprogrammazione includono:

  • Atlas Supervisor: Sviluppato per il computer Atlas all'Università di Manchester all'inizio degli anni '60, questo sistema operativo fu uno dei primi a introdurre concetti come la memoria virtuale e la multiprogrammazione, dimostrando la fattibilità di queste tecniche.
  • IBM OS/360: Introdotto nel 1964, OS/360 fu uno dei primi sistemi operativi su larga scala progettato per supportare la multiprogrammazione su una famiglia di computer IBM System/360 con diverse capacità hardware.
  • OS/360 era un sistema operativo estremamente complesso per l'epoca e rappresentò una pietra miliare nello sviluppo dei sistemi operativi, introducendo concetti come i job control language (JCL) per la gestione dei lavori e sofisticati meccanismi di gestione della memoria. Tuttavia, la sua complessità lo rendeva anche difficile da implementare e da gestire.
  • Altri sistemi operativi come il Master Control Program (MCP) sviluppato per i computer Burroughs anch'essi implementarono forme di multiprogrammazione.

6.4 L'Introduzione del Time-Sharing:
L'Illusione di un Computer Personale per Molti Utenti

Il time-sharing è un'estensione della multiprogrammazione che permette a più utenti di interagire contemporaneamente con il computer. L'idea è di suddividere il tempo della CPU in piccoli intervalli (time slices o quanti di tempo) e di assegnare ciascun intervallo a un utente diverso. La CPU passa rapidamente da un utente all'altro, creando l'illusione che ogni utente abbia a disposizione un computer personale dedicato.

Il time-sharing fu motivato dal desiderio di fornire un'esperienza di calcolo interattiva a più utenti contemporaneamente, superando le limitazioni del batch processing. Questo era particolarmente importante in contesti come la ricerca scientifica e l'istruzione, dove molti utenti potevano aver bisogno di accedere al computer per eseguire piccoli programmi, modificare file o interagire con il sistema in tempo reale.

Per implementare il time-sharing, erano necessarie tecniche come:

  • Time slicing: La CPU viene assegnata a ciascun processo per un breve periodo di tempo.
  • Swapping: Se un processo non utilizza la CPU per un periodo prolungato (ad esempio, in attesa dell'input dell'utente), il suo spazio di memoria può essere temporaneamente spostato su disco (swapped out) per fare spazio ad altri processi attivi. Quando il processo diventa di nuovo pronto per l'esecuzione, viene riportato in memoria (swapped in).
  • Gestione degli utenti e dei terminali: Il sistema operativo doveva essere in grado di gestire l'accesso di più utenti tramite terminali remoti.

6.5 Sistemi Operativi Time-Sharing Pionieristici:
Verso l'Interattività

Alcuni dei primi e più influenti sistemi operativi time-sharing includono:

  • CTSS (Compatible Time-Sharing System): Sviluppato al MIT (Massachusetts Institute of Technology) all'inizio degli anni '60, CTSS fu uno dei primi sistemi time-sharing di successo. Permise a più utenti di accedere interattivamente a un computer mainframe tramite terminali, aprendo nuove possibilità per la ricerca e l'istruzione. CTSS influenzò profondamente lo sviluppo di sistemi operativi successivi.
  • Multics (Multiplexed Information and Computing Service): Un progetto ambizioso iniziato nel 1965 come collaborazione tra il MIT, la General Electric e i Bell Labs. L'obiettivo era creare un sistema operativo time-sharing potente, affidabile e sicuro, con funzionalità avanzate come un file system gerarchico. Sebbene il progetto Multics non raggiunse un successo commerciale immediato, molte delle sue idee e dei suoi concetti influenzarono profondamente lo sviluppo dei sistemi operativi futuri.
  • Unix: Nato come un progetto "spurio" all'interno dei Bell Labs negli anni '60, principalmente ad opera di Ken Thompson e Dennis Ritchie, Unix fu inizialmente ispirato da alcune delle idee di Multics ma con un approccio più semplice e modulare. Una delle caratteristiche distintive di Unix fu la sua portabilità, resa possibile dalla sua implementazione in linguaggio C (sviluppato anch'esso presso i Bell Labs da Ritchie). Le prime versioni di Unix supportavano il time-sharing e introducevano concetti fondamentali come il file system gerarchico e l'interfaccia a riga di comando (shell), che avrebbero avuto un impatto duraturo sul mondo dell'informatica.

6.6 Concetti Fondamentali dei Sistemi Operativi Moderni Introdotti in Questo Periodo

Il decennio 1960-1970 fu cruciale per la definizione di molti dei concetti fondamentali che ancora oggi sono alla base dei sistemi operativi moderni:

  • Gestione della memoria: Furono sviluppate le prime tecniche per l'allocazione della memoria (ad esempio, partizioni fisse e variabili) e per la protezione della memoria tra processi diversi. L'introduzione della memoria virtuale in sistemi come Atlas e OS/360 rappresentò un passo avanti significativo, permettendo ai programmi di utilizzare più memoria di quella fisicamente disponibile.
  • Scheduling della CPU: Vennero introdotti i primi algoritmi di scheduling per decidere quale processo dovesse essere eseguito dalla CPU in un ambiente multiprogrammato e time-sharing. Algoritmi come il round-robin (utilizzato in molti sistemi time-sharing) e algoritmi basati sulle priorità iniziarono a essere studiati e implementati.
  • Gestione dei dispositivi: I sistemi operativi iniziarono a includere meccanismi per gestire e controllare i diversi dispositivi di input/output connessi al computer, fornendo un'interfaccia uniforme ai programmi applicativi.
  • File system: Sistemi operativi come Multics e Unix introdussero il concetto di file system gerarchico, che permetteva di organizzare i dati in directory e sottodirectory, semplificando la gestione e l'accesso ai file.
  • Interfaccia utente: Mentre il batch processing spesso non prevedeva un'interazione diretta con l'utente durante l'esecuzione, i sistemi time-sharing introdussero l'interfaccia a riga di comando (CLI) come mezzo principale per l'interazione con il sistema operativo.

6.7 Sfide e Innovazioni nello Sviluppo dei Sistemi Operativi

Lo sviluppo dei sistemi operativi multiprogrammati e time-sharing negli anni '60 fu un'impresa estremamente complessa. I programmatori di sistemi operativi dovevano affrontare sfide come la gestione concorrente di più processi, la sincronizzazione e la comunicazione tra processi, la protezione delle risorse del sistema e la gestione degli errori.

Questo periodo vide anche l'emergere di importanti innovazioni nelle tecniche di sviluppo del software e nella progettazione dei sistemi. La modularità, la strutturazione del codice e l'introduzione di linguaggi di programmazione di alto livello come il C per lo sviluppo di sistemi operativi (come nel caso di Unix) contribuirono a gestire la crescente complessità del software di sistema.

L'evoluzione dei sistemi operativi negli anni '60, con il passaggio dal batch processing alla multiprogrammazione e al time-sharing, rappresentò un cambiamento fondamentale nel modo in cui gli utenti interagivano con i computer e nell'efficienza con cui le risorse hardware venivano utilizzate. L'introduzione di concetti chiave come la gestione della memoria, lo scheduling della CPU, la gestione dei dispositivi e i file system gettò le basi per i sistemi operativi moderni che utilizziamo oggi. Sistemi pionieristici come OS/360, CTSS, Multics e Unix ebbero un impatto duraturo sul campo dell'informatica, influenzando profondamente lo sviluppo del software di sistema per i decenni a venire.