Il concetto di Sistema operativo Il sistema operativo nasce intorno agli anni 50 per l'estrema complessità con la quale si gestivano manualmente i calcolatori dell'epoca, immaginate di dover dare istruzioni manualmente e leggere dalla memoria manualmente ogni singola istruzione. Il sistema al giorno d'oggi rappresenta un astrazione rispetto al hardware del calcolatore, infatti possiamo benissimo essere allo scuro di come funziona realmente un calcolatore, ma saperlo comunque farlo funzionare. Sostanzialmente quindi il sistema operativo è un insieme di componenti software, che garantisce l'operatività del calcolatore, coordinando e gestendo le risorse hardware di elaborazione e memorizzazione, le periferiche I/O ed interfacciando il sistema HW all'utente senza che quest'ultimo abbia reale percezione delle operazioni che si stanno svolgendo. Nella memoria del calcolatore risiedono due tipi di software, il software di base che sostanzialmente rappresenta in memoria il sistema operativo, e il software applicativo, che sostanzialmente sono tutti i programmi in esecuzione dell'utente. Classificazione dei Sistemi operativi Nei sistemi monoprogrammati o monotasking, che spesso sono anche monoutente, vi è una bassa utilizzazione delle risorse hardware del sistema, soprattutto della componente più veloce che è la CPU: la CPU non fa niente quando è in attesa che l'utente impartisca un comando o è costretta a cicli di attesa durante operazioni di I/O su dispositivi lenti. In questi sistemi un solo processo per volta può essere eseguito e questo usufruisce di tutte le risorse del sistema. Quest'ultima cosa è il solo vantaggio di questi sistemi, oltre la semplicità, ma naturalmente si paga col fatto di non poter eseguire più elaborazioni contemporaneamente. Nei sistemi multiprogrammati, che spesso sono anche multiutente, più processi sono presenti in memoria e il controllo viene trasferito da un processo in esecuzione ad un altro per evitare lunghe attese da parte della CPU ed aumentarne il fattore di utilizzazione. Nei sistemi multiutente a divisione di tempo (time-sharing) o interattivi, come ad es. UNIX, per dare l'impressione a ciascun utente di avere una propria macchina personale il trasferimento del controllo viene forzato periodicamente tramite il meccanismo delle interruzioni hardware. Se un calcolatore è dotato di più unità di elaborazione (CPU) riesce a realizzare un vero e proprio parallelismo dei processi (overlapping), ossia i processi sono realmente eseguiti in parallelo, vale a dire tanti processi possono essere eseguiti contemporaneamente nel tempo quante sono le CPU disponibili. Nel caso più comune (e più economico) esiste una sola CPU nel sistema di calcolo, perciò il parallelismo non è reale ma simulato. L'esecuzione di diversi processi viene alternata (tecnica di interleaving); in ogni momento solo un processo alla volta è in esecuzione, e potrebbe anche trattarsi di codice del sistema operativo, mentre l'esecuzione di tutti gli altri viene sospesa. In un sistema time-sharing l'interleaving è abbastanza frequente da dare l'impressione umana che i job vengano eseguiti contemporaneamente, proprio come se ciascuno avesse una sua CPU dedicata. Un sistema operativo multiprogrammato consente quindi una migliore utilizzazione delle risorse hardware, a fronte di una maggiore complessità del sistema operativo stesso. Infatti la multiprogrammazione presenta vari problemi, di protezione o interferenza nell'accesso a dati comuni, di interazione e comunicazione tra i processi che devono essere risolti dal sistema operativo tramite opportuni algoritmi e opportune procedure che il sistema operativo deve mettere a disposizione del programmatore di applicazioni. Il sistema operativo deve implementare un algoritmo di scheduling che opera le transizioni da un processo ad un altro, tenendo in conto anche fattori di priorità assegnati ai processi. La multiprogrammazione ha un costo computazionale che può essere spesso trascurabile, ma non è mai nullo, nonostante l'hardware possa offrire funzionalità che la facilitano: c'è sempre un overhead software non nullo, cioè del tempo impiegato dal sistema operativo per la schedulazione e altre attività connesse. Bootstrap Indica, in generale, l'insieme dei processi che vengono eseguiti da un computer durante la fase di avvio, in particolare dall'accensione fino al completo caricamento in memoria primaria del kernel del sistema operativo a partire dalla memoria secondaria. Kernel Costituisce il nucleo di un sistema operativo. Si tratta di un software avente il compito di fornire ai processi in esecuzione sull'elaboratore un accesso sicuro e controllato all'hardware. Dato che possono esserne eseguiti simultaneamente più di uno, il kernel ha anche la responsabilità di assegnare una porzione di tempo-macchina (scheduling) e di accesso all'hardware a ciascun programma (multitasking). L'accesso diretto all'hardware può essere anche molto complesso, quindi i kernel usualmente implementano uno o più tipi di astrazione dall'hardware, il cosiddetto: Hardware abstraction layer. Queste astrazioni servono a "nascondere" la complessità e a fornire un'interfaccia pulita ed uniforme all'hardware sottostante, in modo da semplificare il lavoro degli sviluppatori. I kernel si possono classificare - in base al grado di astrazione dell'Hardware - in quattro categorie: Kernel monolitici, che implementano direttamente una completa astrazione dell'hardware sottostante. Microkernel, che forniscono un insieme ristretto e semplice di astrazione dell'hardware e usano software (chiamati device driver o server) per fornire maggiori funzionalità. Kernel ibridi (o microkernel modificati), che si differenziano dai microkernel puri per l'implementazione di alcune funzioni aggiuntive al fine di incrementare le prestazioni. Esokernel, che rimuovono tutte le limitazioni legate all'astrazione dell'hardware e si limitano a garantire l'accesso concorrente allo stesso, permettendo alle singole applicazioni di implementare autonomamente le tradizionali astrazioni del sistema operativo per mezzo di speciali librerie.