Classificazione dei sistemi operativi
Prima generazione
I calcolatori erano basati sulle valvole e praticamente non vi era sistema operativo. Erano sistemi dedicati quasi esclusivamente per il calcolo numerico/scientifico ed erano in possesso solo di poche università. C'era un unico staff per qualsiasi operazione venisse effettuata sul calcolatore: dal progetto e costruzione, all'esecuzione dei programmi e manutenzione. Tutti i programmi erano scritti in linguaggi macchina (non esisteva l’assembler); i linguaggi di programmazione ad alto livello erano sconosciuti; i sistemi operativi erano assenti e venivano svolti solo controlli fisici d'integrità delle valvole; solo negli ultimi anni, si introdussero i primi sistemi a schede perforate.
Seconda generazione – Batch (gestione a lotti)
Determinata dall'introduzione dei transistor. I calcolatori potevano essere prodotti e venduti a clienti ma ancora poco diffusi a causa del prezzo molto elevato e quindi usati solo da università e grandi industrie. Nascono figure professionali distinte nel processo di produzione di un programma (job). È definito job un programma o insieme di programmi. Il processo di esecuzione di un programma era eseguito nel seguente modo: il programmatore scriveva il programma su carta (in Fortran o Assembler), perforava le schede e le consegnava all'operatore, che le inseriva nella coda dei programmi, le inseriva nel calcolatore e, se necessario, caricava il compilatore adeguato per la corretta esecuzione del programma. Infine, consegnava l'output finale al programmatore. L'esecuzione di un programma richiedeva una cospicua spesa in termini di tempo, perché il calcolatore doveva caricare il compilatore, eseguire il compilatore, scaricare il compilatore, caricare l'assembler, eseguire l'assembler, scaricarlo, caricare l'oggetto, eseguire il programma e così via. Per minimizzare questi tempi e utilizzare al massimo la potenza dei calcolatori vennero introdotti i sistemi batch: vengono eliminati i tempi morti tra programmi successivi di utenti diversi e vengono automatizzate le operazioni manuali. Vengono accorpati i lavori (job) in lotti (batch), operazione svolta da un calcolatore ausiliario e trasferito su un'unità di ingresso veloce (nastro). Ogni lavoro veniva caricato da un operatore ed eseguito in sequenza senza interruzione fino al termine. L'output veniva scritto su un nastro invece di essere stampato. La CPU risultava comunque sottoutilizzata a causa della lentezza delle periferiche di I/O, a cui si doveva adeguare. Servivano due sistemi distinti: uno per la gestione dei lotti, uno per l’esecuzione dei programmi. Vi era quindi un primo calcolatore di potenza contenuta che si occupava della gestione dei lotti. Questi venivano poi caricati sul calcolatore vero e proprio che si occupava di eseguire le operazioni. Come output veniva fornito un nastro magnetico, che veniva passato ad un successivo calcolatore che forniva in output la stampa dei risultati.
Terza generazione – Multitasking
Vengono introdotti i circuiti integrati e la multiprogrammazione. Con la multiprogrammazione più di un processo viene caricato in memoria contemporaneamente. Le operazioni di I/O di un processo sono sovrapposte temporalmente all'esecuzione delle istruzioni di un altro processo. Ciò è possibile grazie al canale che gestisce l'I/O. Il problema è che il multitasking non distingue i processi che usano spesso le periferiche da quelli che usano spesso la CPU. Se uno di questi prende possesso della CPU, non la rilascia fino alla sua fine o fino a una possibile richiesta di I/O, bloccando gli altri programmi.
Sistemi time sharing
Il tempo di utilizzo della CPU viene suddiviso dal sistema operativo in quanti di tempo (time slice). Ogni processo in memoria riceve a turno l'uso della CPU per un quanto di tempo. Al termine del quanto, il controllo torna al sistema operativo che decide a chi affidare la CPU al successivo quanto di tempo. L'utente lavora al terminale e ha l'impressione di avere la macchina a sua completa disposizione, in quanto passa la maggior parte del tempo a pensare o scrivere e non a eseguire programmi. Si può generare un overhead critico nel caso in cui ci siano molti utenti collegati o in caso di quanti troppo brevi.
Differenza tra batch e time sharing
L'obiettivo del batch è di massimizzare l'uso della CPU, mentre quello del time sharing è minimizzare il tempo di risposta.
Quarta generazione – Sistemi distribuiti
Sono basati sulla tecnologia VLSI (Very Large Scale Integration). Due sistemi operativi hanno dominato la scena dei PC e delle workstation:
- MS-DOS (Microsoft) con il derivato Windows
- UNIX (Bell Labs)
La crescita di reti di PC e di WS (WorkStation) ha permesso lo sviluppo di:
- Network Operating Systems: l'utente "vede" più calcolatori, può accedere a macchine remote e copiare file; ogni macchina ha il suo sistema operativo locale.
- Distributed Operating Systems: appare all'utente come un tradizionale sistema monoprocessore anche se è composto da più processori; l'esecuzione di programmi può essere a carico di macchine diverse (anche in parallelo). Due casi: gli N processori non condividono o condividono clock e/o memoria (loosely o tight coupled).
Sistemi real-time
Sistemi operativi creati per una specifica applicazione che ha dei vincoli precisi nei tempi di risposta. Il sistema operativo deve garantire un tempo massimo entro il quale mandare in esecuzione un programma a seguito di un evento. Vengono usati principalmente per:
- Gestione di strumentazione
- Controllo di processo
- Gestione di allarme
- Sistemi transazionali (banche, prenotazioni)
In generale si ha un sistema real-time quando il tempo di risposta dalla richiesta di esecuzione di un processo al completamento della stessa è sempre minore del tempo prefissato.
Componenti dei sistemi operativi
I sistemi operativi, seppur diversi tra loro nella struttura, molti hanno scopi comuni che devono conseguire. Il sistema operativo deve gestire:
Gestione del processo
Un processo è del programma in esecuzione che ha bisogno di risorse per portarsi a termine, cioè di tempo di CPU, di memoria, di file e di dispositivi di I/O. Il sistema operativo è responsabile delle seguenti attività: creazione e cancellazione di processi, sospensione e ripristino di processi, mettere a disposizione meccanismi per la sincronizzazione e comunicazione fra processi.
Gestione della memoria principale
La memoria, condivisa dalla CPU e dai dispositivi di I/O, è l'unico dispositivo di memorizzazione che la CPU può indirizzare direttamente, di conseguenza le istruzioni possono essere eseguite solo se si trovano effettivamente in memoria. Occorre quindi poter gestire più programmi in memoria, per migliorare l'utilizzo della CPU e quindi le prestazioni del sistema. Esistono allora più schemi per la sua gestione che dipendono dall'hardware.
Gestione della memoria secondaria
Il sistema operativo è responsabile di: gestire lo spazio libero, allocare lo spazio, fare lo scheduling del disco. Dato che l'uso del disco è molto frequente la gestione deve essere efficiente.
Gestione del sistema di I/O
Lo scopo è nascondere l'hardware all'utente, per questo motivo si usano: sistemi di buffer caching, un'interfaccia generale per i driver dei dispositivi, driver per specifici dispositivi hardware. Solo il driver conosce le caratteristiche dello specifico dispositivo a cui è assegnato.
Gestione dei file
Il sistema operativo ha una visione logica uniforme del processo di memorizzazione dell'informazione. Esiste un solo tipo di oggetto: il file, che è la sola unità logica di memoria. Il sistema operativo si occupa di: creazione e cancellazione di file e directory, supporto di primitive per la manipolazione di file e directory, mapping dei file sulla memoria secondaria e backup dei file su dispositivi di memorizzazione stabili.
Sistema distribuito
Un sistema distribuito è un insieme di unità che non condividono la memoria, i dispositivi periferici o un clock. Ogni unità dispone di una propria memoria locale. Le unità comunicano tra loro tramite reti e le comunicazioni avvengono tramite protocolli. Dal punto di vista dell’utente, un sistema distribuito è un insieme di sistemi fisicamente separati organizzato in modo tale da apparire come un unico sistema coerente, ovvero appare come una singola memoria principale e un unico spazio di memoria di massa. L’accesso ad una risorsa condivisa permette di accelerare il calcolo, di aumentare la disponibilità di dati e di incrementare l’affidabilità.
Gestione delle protezioni
Un sistema operativo con più utenti consente che i processi vengano eseguiti in concorrenza. I processi devono essere protetti dalle attività di altri processi, occorrono quindi meccanismi di autorizzazione. Protezione: è il meccanismo che controlla l'accesso da parte di programmi, processi o utenti alle risorse di un sistema di calcolo (ad esempio una parte di memoria allocata per un processo non deve poter essere scrivibile da parte di un altro processo).
Interprete dei comandi
L’interfaccia fra utente e sistema può avere aspetti diversi:
- Istruzioni di controllo
- Shell
- Interfaccia grafica
Il sistema operativo
Il suo compito è quello di accettare comandi da parte dell’utente. Un sistema operativo è costituito da nucleo (kernel) e da una interfaccia verso l'utente.
System call
L'interfaccia tra il Sistema Operativo e i programmi degli utenti è definita da un insieme di Istruzioni Estese, ovvero System Call (chiamata di sistema). Esse creano, cancellano, usano oggetti software gestiti dal sistema operativo. La loro implementazione può essere diversa a seconda del sistema operativo. Tipiche chiamate di sistema:
- Controllo dei processi
- Gestione dei file
- Gestione dei dispositivi
- Gestione dell’informazione
- Comunicazioni
I programmi dell'utente comunicano con il sistema operativo e gli richiedono servizi per mezzo delle Chiamate di Sistema. A ogni system call corrisponde una Procedura di Libreria (che il programma può invocare) che ha i seguenti compiti:
- Mette i parametri della system call in un sito predefinito (es. Registro)
- Istanzia un'istruzione TRAP per mandare un interrupt al sistema operativo
- Nasconde i dettagli dell'istruzione TRAP
- Rende le system call come chiamate di procedura normali (es. da programmi in C)
Sistemi monolitici
Il sistema operativo è costituito da una collezione di procedure ognuna delle quali può chiamare qualsiasi altra. Unica struttura presente sono le system call che comportano il salvataggio dei parametri e l'esecuzione di una trap speciale detta kernel call o supervisor call. Una chiamata di sistema è realizzata così:
- Un programma utente esegue una trap verso il nucleo;
- Il sistema operativo determina il numero del servizio richiesto;
- Il sistema operativo individua e chiama la procedura di servizio;
- Viene restituito il controllo al programma utente
Struttura di MS-DOS
Vi è un duplice modo di funzionamento: i sistemi che condividono risorse devono garantire che programmi non corretti non interferiscano con gli altri processi in esecuzione. L’hardware (mode bit) permette al sistema operativo di operare in due modalità differenti:
- User mode: normale funzionamento dei programmi utente
- Monitor mode (o kernel mode o system mode): operazioni effettuate dal sistema operativo. Quando avviene un interrupt si passa al kernel mode. Alcune istruzioni (privileged instructions) possono essere eseguite solo in kernel mode:
- Tutte le istruzioni di I/O sono privileged instruction
- Occorre garantire che nessun programma possa essere eseguito in kernel mode
Struttura di UNIX
Struttura a tre strati:
- Un programma principale che richiama la procedura di servizio richiesta
- Un insieme di procedure di servizio che eseguono le chiamate di sistema
- Un insieme di procedure di utilità che forniscono il supporto alle procedure di servizio
Sistemi multilivello
Il sistema operativo è organizzato in una gerarchia di livelli. Il 1o sistema con una struttura di questo tipo fu THE, realizzato alla Technische Hogelschool Eindhoven in Olanda da Dijkstra nel 1968 per il computer Electrologica X8 (32k di parole di 27 bit ed un tamburo 512k parole usato per memorizzare parti di programma). THE ha 6 livelli.
| Strato | Funzionalità |
|---|---|
| 5 | Operatore |
| 4 | Programmi utente |
| 3 | Gestione I/O |
| 2 | Comunicazione processo-console |
| 1 | Gestione della memoria e del tamburo |
| 0 | Allocazione della CPU e multiprogrammazione |
Struttura a microkernel
Si sposta quanto possibile dal kernel allo spazio utente. Le comunicazioni avvengono tramite messaggi.
Vantaggi:
- Estendere un microkernel è più facile
- Maggiore portabilità del sistema operativo
- Più affidabilità (il codice critico nel kernel è minore)
- Più sicuro
Svantaggi:
- Vi è un overhead dovuto alle comunicazioni fra spazio utente e kernel
Virtual machine
In origine, il termine virtual machine veniva usato per indicare la creazione di una molteplicità di ambienti di esecuzione identici in un unico computer, ciascuno con il proprio sistema operativo. Lo scopo di questa tecnica era di dividere tra più utenti l'uso di un singolo computer dando ad ognuno l'impressione di esserne gli unici utilizzatori, oltre ad avere vantaggi che le macchine reali non hanno (poniamo il caso di dover riavviare la macchina ad esempio, con macchine virtuali questa operazione è più veloce anche perché c'è la possibilità di scegliere quali componenti attivare e quali no). Il software che rende possibile questa divisione viene chiamato virtual machine monitor o hypervisor.
Vi sono gli hypervisor di tipo 1 che sono quelli che vengono attivati al momento del boot (modalità kernel), la cui funzione è quella di attivare un certo numero di macchine virtuali, le quali possono eseguire anche sistemi operativi diversi. Gli hypervisor di tipo 2 sono invece quelli che vengono attivati in user mode e permettono l'utilizzo di una macchina virtuale. Vi è la possibilità di “passare” da un sistema all'altro e avere più macchine virtuali che lavorano contemporaneamente.
Vantaggi:
- Ogni parte è più semplice, più flessibile e più facile da mantenere;
- Una macchina virtuale permette una completa protezione delle risorse di sistema;
- Rende facile lo sviluppo di un sistema operativo (le normali operazioni non vengono bloccate).
Svantaggi:
- L'isolamento delle macchine virtuali rende complessa la condivisione di risorse;
- Il concetto di macchina virtuale è spesso difficile da realizzare.
Requisiti per la virtualizzazione
I requisiti per la virtualizzazione sono:
- Le istruzioni vengono divise in tre gruppi:
- Istruzioni privilegiate (generano una trap solo se si è in user mode)
- Istruzioni di controllo (modificano le risorse di sistema, p.e. I/O)
- Istruzioni il cui risultato dipende dalla configurazione del sistema.
- Devono essere verificate le condizioni sufficienti perché un'architettura possa essere virtualizzata (condizioni di Popek e Goldberg). Le istruzioni di controllo devono essere un sottoinsieme delle istruzioni privilegiate cioè: tutte le istruzioni che possono influenzare l’esecuzione del Virtual Machine Monitor devono generare una trap ed essere gestite dal VMM stesso e le istruzioni non privilegiate possono essere eseguite nativamente.
Tipologie di virtualizzazione
La virtualizzazione può essere di 3 tipologie:
- Emulazione: la macchina virtuale simula completamente l'hardware, utilizzando un sistema operativo reale che poi viene eseguito per la CPU virtuale; questa virtualizzazione è poco efficiente.
- Paravirtualizzazione: il sistema operativo ospite deve essere modificato. La macchina virtuale non simula un hardware ma offre speciali API che richiedono modifiche nel sistema operativo; Concettualmente simile al binary rewriting, ma il rewriting avviene a tempo di compilazione. Quando un’applicazione genera una system call, questa viene intercettata dal SO guest. Quando quest'ultimo prova ad eseguire istruzioni privilegiate, il VMM “intrappola” (traps) l’operazione e le esegue correttamente. Quindi i SO guest effettuano Hypercall per interagire con le risorse del sistema.
- Virtualizzazione piena: esegue copie del sistema operativo.
Binary Rewriting
Le istruzioni del flusso del programma vengono esaminate a tempo di esecuzione (nella paravirtualizzazione ciò avviene a tempo di compilazione). Le istruzioni privilegiate vengono individuate e riscritte con le versioni emulate. Permette la virtualizzazione in spazio utente che risulta essere più lento. Si deve usare il caching delle locazioni di memoria. Le prestazioni tipiche vanno dall’80% al 97% di una macchina non virtualizzata. Può essere implementato con i meccanismi dei debugger come i breakpoint. Un linguaggio moderno che fa uso della macchina virtuale è il Java: i programmi scritti in Java vengono infatti compilati (cioè tradotti) nel linguaggio bytecode, che gira sulla Java Virtual Machine.
Un ultimo modo di vedere macchine virtuali deriva dalla necessità di avere un alto grado di sicurezza in alcuni sistemi che contengono dati e informazioni segrete, per cui con la virtualizzazione si riesce ad ottenere un maggior grado di sicurezza (VMware Workstation). Il significato più comune è quello di un programma che emula un calcolatore. I programmi applicativi vengono scritti in un linguaggio che viene compilato per questo caso.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Riassunto esame Sistemi Operativi
-
Riassunto esame Sistemi Operativi, prof. Laface
-
Riassunto Sistemi operativi
-
Riassunto esame Tecniche di Creatività Pubblicitaria, prof. Lombardi, libro consigliato Il Dolce Tuono di Lombardi