SISTEMA OPERATIVO
SISTEMA OPERATIVO
Il sistema operativo è un software costituito da un insieme di programmi che:
➡ Gestiscono in modo efficiente le risorse hardware e software, ovvero, permette una gestione ottimizzata dell' hard disk, della CPU, della memoria principale, e delle periferiche quali floppy disk, stampante, schede di espansione, etc...
➡ Offrono un'interfaccia tra le applicazioni utente e le risorse (tramite chiamate del sistema, non occorre conoscere ai programmatori i dettagli hardware), ovvero un immagine astratta di tutte le risorse disponibili, indipendentemente da come esse funzionano.
➡ Offrono un'interfaccia utente (a finestre o caratteri) così da rendere agevole il dialogo con la macchina.
➡ Nascondono l'hardware non solo all'utente, ma anche ai programmi.
➡ Rendono possibile il collegamento in rete.
All'accensione del computer il Sistema Operativo viene caricato in RAM attraverso l'operazione di Bootstrap.
COMPITI DEL SISTEMA OPERATIVO
Un Sistema Operativo deve:
➡ Permettere all'utilizzatore di usare in modo semplice e immediato tutte le risorse che il sistema di elaborazione mette a disposizione.
➡ Ottimizzare l'uso delle risorse a disposizione, attuando opportune politiche di gestione.
➡ Fornire un'immagine astratta di tutte le risorse disponibili.
RISORSE HARDWARE E SOFTWARE
Per sistema di elaborazione di intende il sistema formato dal connubio:
➡ Hardware: dispositivi fisici che forniscono risorse elaborative (processore, ram, etc...)
➡ Sistema Operativo.
➡Software applicativo: questo si divide in due categorie:
➤ Applicativi utente o Software applicativo in senso stretto, cioè i programmi usati dall'utente.
➤Software di sistema: applicativi usati dai programmatori per la realizzazione del software o dbms.
CLASSI DI UTENTI
Diverse tipologie di utenti possono utilizzare il sistema di elaborazione:
➡ L'utente finale: è l'esecutore delle applicazioni. Utilizza il sistema operativo semplicemente come interfaccia. Può accedere al più ai comandi messi a disposizione della shell.
➡ I programmatori di applicazioni: interagiscono col sistema operativo tramite chiamate di sistema messe a disposizione dal linguaggio di programmazione. Ad esempio: READ (dato), WRITE (dato).
➡ I programmatori si sistema interagiscono direttamente col sistema operativo in quanto invocano direttamente le system call [le chiamate di sistema API].
OSSERVAZIONI
Il processore può funzionare in due modalità:
➡ Modalità utente: per motivi di sicurezza il processore può eseguire solo una parte del suo set di istruzioni.
➡ Modalità riservata: il processore è abilitato ad eseguire tutto il set di istruzioni.
SHELL
La shell è la parte del sistema operativo che permette l'interazione con l'utente. Essa consente la gestione del computer (dischi, file, configurazione, esecuzione programmi, etc...)
La shell può essere:
➡ A caratteri: l'utente deve conoscere i vari comandi per poter interagire col pc. Ad esempio in DOS i comandi: DIR, CD, COPY, etc...
➡ Grafica (GUI - Graphics User Interface): l'utente interagisce in modo User Friendly attraverso icone e finestre.
TIPI DI SISTEMI OPERATIVI
I Sistemi Operativi possono essere inquadrati in tre grandi categorie:
➡ Mono User (single task): sono Sistemi operativi che permettono l'esecuzione di un programma alla volta. Esempio: l'MS DOS.
➡ Multitasking (o multiprogrammazione): permettono ad un solo utente di avviare più applicazioni in contemporanea. Esempio: Windows, Mac.
➡ Multiuser: permettono a più utenti di usare lo stesso sistema di elaborazione contemporaneamente. In questo caso al Server sono collegati diversi terminali che sono gestiti centralmente dal Sistema Operativo. Esempio: Linux, Unix, etc...
EVOLUZIONE DEI SISTEMI OPERATIVI
I primi Sistemi Operativi furono creati alla fine degli anni '40 con l'idea di facilitare la vita dei programmatori che programmavano direttamente i dispositivi di Input/Output e di velocizzare operazioni tipo il caricamento in input delle informazioni, assemblaggio dei programmi, etc...
L'evoluzione dei Sistemi Operativi avveniva parallelamente all'evoluzione hardware.
Dagli anni '40 ad oggi si sono parecchio evoluti passando dai sistemi dedicati alla gestione di reti di computer.
SISTEMI DEDICATI
I primi calcolatori non avevano Sistemi Operativi ed erano monotasking: al programma in esecuzione veniva assegnata tutta la memoria e tutte le risorse a disposizione.
Dal resto i computer erano costruiti con relay e valvole => poco affidabili, progettista, programmatore e utente erano la stessa persona e la programmazione avveniva in linguaggio macchina e la memorizzazione dei programmi avveniva dapprima tramite interruttori, successivamente tramite schede perforate. Successivamente, per aumentare la produttività del programmatore furono introdotti dei linguaggi macchina simbolici detti linguaggi assembler o assemblativi.
ELABORAZIONE A LOTTI (Batch)
Alla fine degli anni '50 con la nascita dei transistor, i computer diventarono sempre più veloci e affidabili e i progettisti, programmatori ed operatori divennero figure diverse.
Fu adottata una nuova organizzazione di lavoro, detta elaborazione Batch ( o a lotti).
Nei sistemi operativi batch l'operatore raccoglie i job (lavori) presentati dai vari utenti e li esegue in rapida successione, eliminando così i tempi morti del caricamento manuale.
I programmi degli utenti (programmi) devono essere autonomi ed essere eseguiti fino alla fine senza intervento di alcun operatore.
Il programmatore quindi doveva:
➡ Sviluppare il proprio programma
➡ Costruire una sequenza di comandi espressi con un preciso linguaggio di controllo ( Job Control Language) in modo da specificare le fasi che doveva fare attraversare al programma
➡ Caricare il tutto su un supporto di memoria (ad esempio: nastro magnetico)
➡ Consegnare i lavori all'operatore per l'esecuzione
➡ Tornare più tardi per prendere i risultati
L'operatore trasferisce dunque i lavori dei programmatori nel sistema batch utilizzando un supporto come il nastro magnetico o le schede perforate e restituisce i risultati agli stessi programmatori i quali perdono "il contatto" con l'elaboratore.
Il funzionamento dei sistemi Batch è simile ai primi Sistemi Operativi in cui inseriscono a mano pacchi di schede del lettore e dal perforatore di schede, però le operazioni non sono più fatte dall'utente, ma dal Sistema Operativo. Per dirigere tali azioni il Sistema Operativo usa un linguaggio di controllo del job (JCL: Job Control Language).
Un vantaggio dei sistemi batch è la riduzione del tempo di setup del sistema che porta ad un miglioramento del tempo di sfruttamento della CPU.
Un limite dei sistemi batch erano i lunghi tempi "sprecati" per le operazioni di I/O (Input/Output) rispetto ai brevi periodi di elaborazione della CPU.
SISTEMI TIME SHARING (A PARTIZIONE DI TEMPO)
Nei primi anni '60 si cercò di sopperire ai tempi morti della CPU dei sistemi batch creando i sistemi Time Sharing: nel momento in cui un lavoro doveva essere fermato in attesa di completare un'operazione di I/O la CPU veniva assegnato ad un altro job.
Prima del Time Sharing ogni processo occupava dunque il processore anche nei periodi di inattività in quanto l'esecuzione dei programmi era sequenziale, cioè solo dopo che finiva il primo programma poteva essere eseguito il secondo programma.
Vantaggio: con il Time Sharing il processore viene assegnato a più processi avendo una sorta di parallelismo nell'esecuzione dei programmi da parte della CPU.
L'utente ha così l'illusione di avere tutto il sistema sempre a disposizione, proprio perché non deve attendere i lunghi tempi morti durante le operazioni di I/O.
Svantaggio: le operazioni di CONTEXT SWICHT appesantiscono il sistema. Infatti:
➡ Prima di caricare il nuovo programma da eseguire, il processore deve salvare "lo stato" di quello in esecuzione
➡ Inoltre, prima di eseguire il nuovo programma deve essere eseguito lo stesso sistema operativo per eseguire i programmi utente o per la gestione dei vari dispositivi.
Altro svantaggio: nel tempo i Sistemi Operativi sono sempre più complessi per cui si rischia di "perdere" più tempo CPU per eseguire il Sistema Operativo stesso che i programmi
Ne consegue che per valutare l'efficienza di un Sistema Operativo viene usato come parametri l'Overhead di CPU, cioè la percentuale d'uso della CPU da parte del Sistema Operativo rispetto al tempo totale.
Sistemi Multitasking
Per ridurre al minimo i tempi di caricamento del nuovo programma da eseguire occorreva diminuire i tempi legati alla gestione dei dispositivi di I/O. La soluzione fu quella di far risiedere più programmi contemporaneamente in memoria, in aree distinte.
Ovviamente le cose si complicano e sorgono nuovi problemi:
➡ Problemi di protezione: occorre proteggere i programmi degli utenti da intrusioni oltre quelli del Sistema Operativo dagli stessi utenti
➡ Problemi di condivisione delle risorse tra i diversi programmi in memoria
Nel tempo le dimensioni del Sistema Operativo aumentarono al punto che non era più possibile mantenerlo completamente in memoria => fu diviso in più parti e solo una parte, il Kernel (Nucleo),
sarebbe rimasto sempre in memoria. Le rimanenti parti sarebbero state caricate in memoria all'occorrenza.
SISTEMI IN REAL-TIME
Sono sistemi in cui l'esecuzione di un'attività deve essere eseguita istantaneamente senza essere "rallentata" da eventi esterni e sono utilizzati soprattutto per il controllo di processi industriali. Fondamentale è il tempo di risposta che deve garantire rapidità di risposta; può variare a seconda del tipo di processo eseguito, ne consegue che potrà "sprecare" qualche millisecondo per eseguire programmi di gestione per il controllo di reti elettriche a qualche secondo per programmi di gestione di sistemi informativi.
Requisito fondamentale per i Sistemi Operativi real-time è il determinismo: le attività devono avvenire in istanti precisi o impiegare intervalli di tempo predeterminati. Per garantire la velocità di risposta non sono presenti alcune caratteristiche avanzate presenti in altre tipologie di Sistemi Operativi, come ad esempio la memoria virtuale, la gestione del disco (in questo caso i programmi sono residenti in ROM).
Un sistema real-time dovrà essere usato in sistemi in cui non sono tollerati ritardi di risposta (es. gestione controllo aereo) mentre il time-sharing è conveniente in sistemi in cui si deve interagire con I/O (es. esercitazione laboratorio scuola).
SISTEMI INTERATTIVI
Con i sistemi batch l'utente non può interagire con il sistema e i tempi di risposta sono lunghi e imprevedibili (in basse alla durata di ogni job).
I sistemi interattivi sono pesanti per permettere all'utente di interagire con il sistema senza lunghe attese. Si basa dunque sulla tecnica del Time-Sharing.
Oggi i Sistemi Operativi evoluti fondono molte di queste tecniche consentendo la gestione dei lavori in un centro di calcolo, riservando una percentuale di tempo CPU ai lotti e il rimanente per gestire i lavori interattivi.
SISTEMI DISTRIBUITI
La tendenza è quella di distribuire il calcolo tra diversi processori.
Ci sono due tipi di schemi:
➡ Strettamente accoppiati: in cui i processori condividono il clock si sistema e memoria, per cui la comunicazione tra i processori avviene condividendo i dati nella memoria stessa
➡ Debolmente accoppiati: in cui ogni processore dispone di propria memoria locale e i singoli processore comunicano tramite bus ad alta velocità o linee telefoniche (reti). Questi sono cosiddetti sistemi distribuiti. Questi ultimi presentano vantaggi quali la condivisione di risorse, accelerazione di calcolo, affidabilità e comunicazione.
LA RISORSA
Per risorsa si intende qualsiasi elemento hardware o software che serve ad un processo per evolversi o per essere eseguito.
In un Sistema Operativo multitasking più processi possono richiedere la stessa risorsa (le risorse sono limitate) => il Sistema Operativo deve gestirne la competizione attraverso opportune politiche di schedulazione. Si rischierebbe il Deadlock, ossia si bloccherebbero i processi in attesa della risorsa in possesso dell'altro processo.
Una corretta politica di schedulazione deve garantire:
➡ Che tutti i processi, prima o poi, ottengano la risorsa richiesta
➡ Che siano limitati i tempi di inattività della stessa risorsa
➡ Che siano minimizzati i tempi medi di attesa dei singoli processi
Per la corretta gestione delle risorse il Sistema Operativo deve disporre di apposite strutture dati e di programmi per i seguenti compiti:
➡ Aggiornare lo stato di ogni risorsa, per sapere se è libera o se è già stata assegnata ad un processo (e quale)
➡ Interpretare le richieste dei singoli processi
➡ Assegnare la singola risorsa ad un processo in base alla politica di schedulazione
➡ Riprende il controllo della risorsa quando è stata liberata
Le principali risorse che il Sistema Operativo deve gestire sono:
➡ Il Processore: Il Sistema Operativo deve assegnarlo ad un determinato processo in base ad opportune politiche. Il modulo del Sistema Operativo che si occupa dell'assegnazione del processore ai singoli processo è il gestore dei processo che compie le seguenti operazioni:
➤ Creare e cancellare processi (utente e di sistema)
➤ Mantenere aggiornato lo stato del processore e lo stato di ogni processo
➤ Decidere in ogni instante a quale processo assegnare il processore (tramite politiche di scheduling)
➤ Assegnare il processore al processo prescelto
➤ Riprendere il controllo del processore quando termina il processo o scade il tempo di uso del processore concessogli
➡ La Memoria Centrale (RAM): Ogni processo deve stare in memoria => Il Sistema Operativo deve poter allocare porzioni di memoria ai vari processi. Il gestore della memoria è il modulo del Sistema Operativo che gestisce la memoria centrale quindi deve:
➤ Tenere aggiornato lo stato della memoria, in particolare:
⇥ Le aree libere
⇥ Le aree occupate
⇥ Quali processi stanno usando le aree occupate
➤ Quanta memoria assegnare ad ogni processo e in quale zona
➤ Assegnare aree di memoria ai processo da eseguire
➤ Riprendere il controllo della memoria liberata da un processo
⇥ Le aree libere
⇥ Le aree occupate
⇥ Quali processi stanno usando le aree occupate
➤ Quanta memoria assegnare ad ogni processo e in quale zona
➤ Assegnare aree di memoria ai processo da eseguire
➤ Riprendere il controllo della memoria liberata da un processo
➡ I Dispositivi I/O: le informazioni sono conservate nei file => il Sistema Operativo deve fornire servizi per la gestione dei file. Il modulo che se ne occupa è il gestore delle periferiche che deve:
➤ Mantenere aggiornato lo stato di tutte le periferiche
➤ Decidere a quale processo assegnare il controllo della periferica
➤ Assegnare la periferica ed inizializzare l'operazione di I/O
➤ Riprendere il controllo della periferica a operazione terminata
➡ Le Informazioni: il Sistema Operativo deve gestire il trasferimento dei dati da e verso i dispositivi di I/O. Il gestore delle informazioni si occupa della memorizzazione e del recupero delle informazioni salvate in memoria di massa. In generale si occupa di:
➤ Annotare in una tabella i riferimenti a tutti i file memorizzati dalla memoria di massa, la loro posizione, e tutte quelle informazioni per poter accedere alle informazioni contenute nei file
➤ Determinare che può usare certe informazioni, chi può accedere in un file, e il tipo di operazioni per cui è abilitato ( lettura, scrittura)
➤ Assegnare la risorsa al processo che la deve utilizzare
➤ Rilasciare la risorsa
➤ Creare o cancellare File e Directory
➡ La Shell dei Comandi: per permettere la gestione degli utenti e a questi ultimi di poter interagire con il Sistema Operativo
Quando un processo viene creato ed entra nello stato di New il Sistema Operativo assegna un'area di memoria detta immagine del processo che contiene:
➡ Il codice eseguibile
➡ I dati
➡ Lo stack
➡ Il Process control block (PCB) che tiene conto del suo stato di esecuzione e delle risorse ad esso assegnate e a sua volta il PCB contiene:
➤ Puntatori: ossia un indirizzo del prossimo processo nella coda (che stanno nello stesso stato: Ready, ecc..) oppure per collegare processo in relazione padre-figlio
➤ Identificatori: un numero PID (process identifier) che identifica il processo
➤ Contesto del processo: contiene informazioni per fare ripartire un processo interrotto, ovvero le informazioni contenute nei registri del processore (program counter, registri utente, ecc...)
➤ Stato del processo: ready, running, ecc..., la priorità, il quantum di tempo e altre informazioni sulle risorse collegate al processo (file aperti, memoria assegnata, ecc...)
➤ Mantenere aggiornato lo stato di tutte le periferiche
➤ Decidere a quale processo assegnare il controllo della periferica
➤ Assegnare la periferica ed inizializzare l'operazione di I/O
➤ Riprendere il controllo della periferica a operazione terminata
➡ Le Informazioni: il Sistema Operativo deve gestire il trasferimento dei dati da e verso i dispositivi di I/O. Il gestore delle informazioni si occupa della memorizzazione e del recupero delle informazioni salvate in memoria di massa. In generale si occupa di:
➤ Annotare in una tabella i riferimenti a tutti i file memorizzati dalla memoria di massa, la loro posizione, e tutte quelle informazioni per poter accedere alle informazioni contenute nei file
➤ Determinare che può usare certe informazioni, chi può accedere in un file, e il tipo di operazioni per cui è abilitato ( lettura, scrittura)
➤ Assegnare la risorsa al processo che la deve utilizzare
➤ Rilasciare la risorsa
➤ Creare o cancellare File e Directory
➡ La Shell dei Comandi: per permettere la gestione degli utenti e a questi ultimi di poter interagire con il Sistema Operativo
MODELLO CONCORRENTE
Il Modello concorrente gestisce l'esecuzione concorrente di più processi:
➡ Se il sistema è multiprocessore le istruzioni di due distinti processi posso essere eseguite contemporaneamente (parallelismo reale)
➡ Se c'è un unico processore le istruzioni vengono eseguite in modo alterno (interleaving)
STRUTTURA DI UN SISTEMA OPERATIVO
In qualsiasi Sistema Operativo il nucleo implementa la gestione del processore e dei processi nell'acquisizione delle risorse.
La gestione delle risorse (che non siano il processore) sono gestite diversamente in base all'architettura del Sistema Operativo:
➡ Modello Monolitico: anche la gestione delle risorse è affidata al nucleo e l'intero Sistema Operativo si identifica nel nucleo
➡ Modello a Microkernel: il nucleo si limita alla gestione di processi e processore mentre le risorse sono gestite da altri moduli
MODELLO MONOLITICO
Questo tipo di kernel è più complesso da progettare, ma è anche più veloce ed efficiente.
Esempi di kernel monolitici:
➡ I tradizionali kernel UNIX, quali ad esempio i kernel BSD
➡ Il kernel Linux
MODELLO A STRATI
I questo modello di Sistema Operativo monolitico, per semplificarne la gestione, si è immaginato di implementare i moduli di gestione delle risorse in livelli. In questo modo l'utente non interagisce direttamente con l'hardware ma con una macchina virtuale. Anzi ogni livello viene visto come una macchina virtuale che fornisce servizi al livello superiore e che utilizza servizi da quello inferiore.
IL SISTEMA OPERATIVO COME GESTORE DEI PROCESSI
Gli stati di avanzamento di un processo sono:
➡ New: il nome del programma viene inserito nell'elenco di quelli in attesa di esecuzione e il Sistema Operativo crea la struttura dati (PCB) del processo, ma non gli viene assegnata nessuna risorsa, vengono solo esplicitate le necessità del processo
➡ Ready: il processo ha a disposizione tutte le risorse richieste, ma deve aspettare il proprio turno per essere eseguito
➡ Run: il Sistema Operativo gli concede la CPU e quindi il processo è in esecuzione sul processore
➡ Wait: il processo on può avanzare in quanto non ha a disposizione tutte le risorse necessarie, ad esempio perché ha fatto una richiesta di operazione di I/O e ne deve attendere il completamento
➡ Terminated: il processo ha terminato e rilascia tutte le risorse utilizzate
Le possibili transazioni da uno stato all'altro da parte di un processo sono:
➡ Ammissione: è provocata dall'utente o da un altro processo ed è gestita dallo Schedulatore dei Lavori; comporta la creazione del PCB vuoto per il processo con la lista delle risorsa richieste
➡ Assegnazione: il processore è assegnato al processo in base alla politica di schedulazione adottata nell'implementazione dello Schedulatore dei Processi
➡ Interruzione: l'esecuzione del processo viene interrotto da una interruzione esterna al processo
➡ Attesa evento: causata dallo stesso processo che per eseguire un'operazione di I/O chiama una routine di sistema che provoca l'intervento del Sistema Operativo
➡ Avviene evento: fine operazione di I/O o verificarsi di evento esterno
LE STRUTTURE PER GESTIRE I PROCESSI
➡ Il codice eseguibile
➡ I dati
➡ Lo stack
➡ Il Process control block (PCB) che tiene conto del suo stato di esecuzione e delle risorse ad esso assegnate e a sua volta il PCB contiene:
➤ Puntatori: ossia un indirizzo del prossimo processo nella coda (che stanno nello stesso stato: Ready, ecc..) oppure per collegare processo in relazione padre-figlio
➤ Identificatori: un numero PID (process identifier) che identifica il processo
➤ Contesto del processo: contiene informazioni per fare ripartire un processo interrotto, ovvero le informazioni contenute nei registri del processore (program counter, registri utente, ecc...)
➤ Stato del processo: ready, running, ecc..., la priorità, il quantum di tempo e altre informazioni sulle risorse collegate al processo (file aperti, memoria assegnata, ecc...)
CONTEXT SWITCH
Il context switch avviene quando da un processo P1 in esecuzione il processore deve essere assegnato ad un altro processo P2, il passaggio no avviene direttamente in quanto deve essere caricato lo scheduler del Sistema Operativo che deve decidere il processo da eseguire (P2 in ogni caso). In ogni caso avviene un cambio di contesto: dal contesto P1 al contesto P2.
L' Overhead è il tempo che si perde quando avviene un cambio di processo
OBIETTIVI DI OGNI POLITICA DI SCHEDULAZIONE
1. Massimizzare la percentuale di utilizzo della CPU. Ne vale l'efficienza del sistema.
2. Massimizzare il Throughput (portata) del sistema. E' inteso come il numero di processi completati nell'unità di tempo.
3. Minimizzare l'overhead: occorre massimizzare l'uso della CPU per cose utili (processi utente).
4. Minimizzare il tempo di turnaround, cioè la quantità di tempo che passa dalla creazione del processo alla terminazione. Per l'utente è la durata del job.
5. Minimizzare il tempo di attesa, cioè la quantità di tempo che un processo attende nella cosa dei processi pronti.
6. Minimizzare il tempo di risposta, cioè la quantità di tempo che intercorre da quando una richiesta è sottomessa a quando viene prodotta la prima risposta.
7. Prevenire la starvation. Rischio che corre un processo di non essere mai eseguito.
Commenti
Posta un commento