# THE (sistema operativo)

Il THE fu il primo sistema operativo progettato a strati e venne realizzato alla Technische Hogeschool Eindhoven nei Paesi Bassi da Edsger Dijkstra e dai suoi studenti e pubblicato nel 1968. Edsger Dijkstra non gli ha mai dato un nome ufficiale, essendo THE semplicemente un acronimo dal nome dell'università in cui è stato creato.

## Descrizione

Il sistema THE era un semplice sistema batch per un computer olandese, l'Electrologica X8, che aveva 32 K di parole a 27 bit. Il sistema fu notato principalmente per il suo progetto semplice e lineare, soprattutto per la sua struttura a livelli, e per l'uso di un gruppo di processi concorrenti che impiegavano semafori per la sincronizzazione. Il sistema operativo stesso fu creato come un insieme di processi tra loro cooperanti. Inoltre, furono creati cinque processi utente che servivano come agenti attivi per compilare, eseguire e stampare i programmi utente. Quando un job veniva concluso, il processo ritornava alla coda di input per selezionare un altro job. Questo sistema utilizzava un algoritmo di schedulazione della CPU basato sulle priorità, che venivano ricalcolate ogni 2 secondi ed erano inversamente proporzionali al tempo in cui la CPU era stata usata recentemente (negli ultimi 8-10 secondi). Questo schema dava maggiore importanza ai processi I/O bound e a quelli nuovi.
La gestione della memoria era limitata dalla mancanza di supporto hardware. Tuttavia, dato che il sistema era limitato e i programmi potevano essere scritti solo in ALGOL, veniva usato un sistema di paginazione software. Il compilatore ALGOL generava automaticamente chiamate alle routine di sistema, che assicuravano la presenza in memoria delle informazioni richieste, usando lo swapping, se necessario. Il dispositivo di immagazzinamento dei dati era una memoria a tamburo di 512 KB parole. Veniva utilizzata una pagina di 512 parole, con una strategia di sostituzione di pagina LRU (Least Recently Used).
Un'altra delle caratteristiche principali del sistema THE era il controllo degli stalli. Per evitare che si verificassero stalli, veniva usato l'algoritmo del banchiere.

### Struttura "a strati"

Il sistema aveva 6 livelli ed era così strutturato:
| Livello | Funzione |
| 5 | Operatore |
| 4 | Programmi utente |
| 3 | Gestione input/output |
| 2 | Comunicazioni processo/console |
| 1 | Gestione della memoria e del tamburo |
| 0 | Allocazione della CPU e multiprogrammazione |
In questa struttura detta "a strati" ogni livello aveva un compito ben preciso:
* Il livello 0 si occupava di allocazione del processore, avvicendando i processi in corrispondenza delle interruzioni o della scadenza del timer. Sopra il livello 0 il sistema era composto da processi sequenziali, ognuno dei quali poteva essere programmato senza doversi preoccupare del fatto che più di un processo fosse in esecuzione su di un solo processore. In altre parole, il livello 0 forniva la multi-programmazione della CPU;
* Il livello 1 effettuava la gestione della memoria. Esso allocava spazio per i processi nella memoria principale e su un tamburo (o drum, antenato dei moderni hard disk) di 512K parole usato per trattenere parti di processi (pagine) per le quali non vi era spazio in memoria principale. Al di sopra del livello 1 i processi non dovevano preoccuparsi del fatto di essere nella memoria principale piuttosto che nel tamburo; il software del livello 1 si preoccupava di far sì che le pagine dei processi fossero presenti nella memoria principale nel momento in cui venivano richieste;
* Il livello 2 gestiva la comunicazione tra ogni processo e la console dell'operatore. Al di sopra di questo livello ogni processo di fatto aveva la sua console di operatore;
* Il livello 3 si prendeva cura di gestire i dispositivi di I/O e la memorizzazione nei buffer del flusso di informazioni da e per essi. Al di sopra del livello 3 ogni processo poteva accedere a dispositivi di I/O astratti, più semplici e gradevoli rispetto ai dispositivi reali caratterizzati da svariate peculiarità;
* Il livello 4 ospitava i programmi utente. Tali programmi non dovevano preoccuparsi dei processi, della memoria, della console o della gestione dell'I/O;
* Il livello 5 era il processo operatore di sistema.
Un'ulteriore generalizzazione del concetto di stratificazione era presente nel sistema Multics, progenitore di UNIX. Lo schema a strati del THE era in realtà solo una convenzione progettuale, poiché tutte le parti del sistema venivano alla fine collegate insieme in un unico programma oggetto.