cos`e` un sistema operativo le chiamate di sistema

Transcript

cos`e` un sistema operativo le chiamate di sistema
COS'E' UN SISTEMA OPERATIVO
Il Sistema Operativo come macchina estesa
Guardando le cose dall'alto (utente) al basso (macchina), la funzionalità del S.O. è quella di mettere a disposizione
dell'utente una comoda interfaccia, cioè presentare all'utente una macchina estesa o una macchina virtuale, che sia più
facile da programmare dell'hardware sottostante.
In questo senso il S.O. fornisce una varietà di servizi, di cui i programmi possono usufruire attraverso istruzioni speciali
dette chiamate di sistema come vedremo più avanti.
Il Sistema Operativo come gestore delle risorse
Guardando le cose dal basso verso l'alto, il compito del S.O. è quello di gestire un'allocazione ordinata delle risorse
hardware ai vari programmi che competono tra loro nell 'usarle. La gestione delle risorse comporta la loro condivisione
sotto due aspetti: rispetto al tempo e rispetto allo spazio.
Quando una risorsa è condivisa rispetto al tempo, programmi e utenti diversi fanno a turno nell’usarla.
Per esempio con un solo processore e più programmi che devono essere eseguiti su di esso, il S.O. prima alloca il
processore ad un programma e, quando questo è stato in esecuzione per un tempo sufficiente, un altro programma
prende in uso il processore e così via. Determinare come la risorsa sia condivisa nel tempo è compito del S.O.
Un altro esempio di condivisione nel tempo è la condivisione della stampante.
L 'altro tipo di condivisione è rispetto allo spazio: invece di alternarsi, ad ognuno viene assegnata parte della
risorsa.
Per esempio, la memoria centrale è normalmente ripartita fra diversi programmi in esecuzione, così che possono
stare in memoria contemporaneamente. Supponendo che ci sia abbastanza memoria per più programmi, è più
efficiente mantenerli in memoria tutti insieme, piuttosto che assegnare tutta la memoria ad uno di essi.
Indubbiamente questo crea problemi di equità, protezione e altri ed è dovere del S.O. risolverli.
Un'altra risorsa che è condivisa rispetto allo spazio è il disco.
LE CHIAMATE DI SISTEMA
La maggior parte delle CPU hanno due modalità: modalità kernel e modalità utente. Generalmente un flag nel Registro
di Stato (PSW) controlla la modalità e quando è in esecuzione in modalità kernel la CPU può eseguire qualunque
istruzione nel suo set di istruzioni ed usare ogni caratteristica dell 'hardware.
Il Sistema Operativo viene eseguito in modalità kernel e questo gli permette l' accesso completo all'hardware.
I programmi utente invece vengono eseguiti in modalità utente e questo permette di eseguire solo una parte del set di
istruzioni e di accedere solo ad una parte delle risorse hardware.
Per ottenere servizi dal S.O. un programma deve eseguire una chiamata di sistema o system call che esegue una trap al
kernel ed invoca il S.O.: l'istruzione TRAP cambia da modalità utente a modalità kernel ed avvia il S.O.
Il S.O. riesce a capire cosa vuole il processo chiamante esaminando i parametri, dopodiche esegue la chiamata di
sistema e restituisce il controllo all'istruzione seguente alla chiamata di sistema. In un certo senso, eseguire una
chiamata di sistema è come eseguire una chiamata di procedura speciale, solo che le chiamate di sistema entrano a far
parte del kernel, mentre le chiamate di procedura no.
Per rendere più chiaro il meccanismo della chiamata di sistema, esaminiamo la chiamata di sistema read che, come
viene gestita da UNIX , chiede tre parametri:
il descrittore di file (fd) che individua il file,
l' indirizzo del buffer cioè l' area di memoria temporanea
il numero di byte da leggere.
Dato che i meccanismi per eseguire una chiamata di sistema sono fortemente dipendenti dalla macchina, e spesso
devono essere espressi in codice assembler, viene fornita una procedura di libreria con lo stesso nome della chiamata di
sistema read per rendere possibile l' esecuzione di chiamate di sistema da programmi scritti in C.
La chiamata di read da un programma in C potrebbe essere:
cont = read (fd, &buffer, nbyte)
e restituire in cont il numero di byte letti.
Le chiamate di sistema vengono eseguite in una sequenza di passi che esaminiamo seguendo l' esecuzione della read.
Prima di chiamare la procedura read che effettivamente esegue la chiamata di sistema read, il programma
chiamante mette i parametri sullo stack. (passi 1,2,3 nella figura)
Poi viene la chiamata alla procedura di libreria read che è la normale istruzione di chiamata di procedura usata per
richiamare tutte le procedure (passo 4).
http://guidepc.altervista.org
La procedura di libreria generalmente mette il numero di chiamata di sistema in un posto noto al S.O. ad esempio
in un registro (passo 5).
Successivamente esegue una istruzione TRAP per passare dalla modalità utente a modalità kernel ed inizia
l'esecuzione ad un indirizzo fisso all'interno del kernel (passo 6).
Il codice del kernel comincia ad esaminare il numero di chiamata di sistema, quindi la smista al corretto gestore
della chiamata di sistema, generalmente attraverso una tabella di puntatori a gestori delle chiamate di sistema
(passo 7).
A questo punto viene eseguito il
gestore della chiamata (passo 8).
Una volta che il gestore ha
completato il suo lavoro, il
controllo può essere restituito alla
procedura di libreria nello spazio
utente, all'istruzione che segue la
TRAP (passo 9).
Si ritorna poi al programma utente
nel solito modo delle procedure
(passo 10).
Per completare il lavoro il
programma utente libera lo stack
come fa per ogni chiamata di
procedura aumentando il valore
dello SP di quanto basta per
rimuovere i parametri posti sullo
stack prima della chiamata a read
(passo 11 ).
Al passo 9 abbiamo detto "il controllo
può essere restituito alla procedura di
libreria" perche la chiamata di sistema può bloccare il programma chiamante impedendogli di continuare, ad esempio
se il programma chiamante sta provando a leggere da tastiera e non è ancora stato scritto nulla. In questo caso il S.O.
cerca se qualche altro processo può essere eseguito e solo quando l'input da tastiera è disponibile viene ripresa l'
esecuzione dei passi 9-11.
Vedere “Il processo”
Principali chiamate di sistema
Un gruppo di chiamate si occupa della gestione dei processi.
In particolare per creare un nuovo processo il processo "padre" tramite una chiamata di sistema crea un duplicato di se
e per attendere la terminazione del processo "figlio" utilizza un'altra chiamata di Isistema.
Molte chiamate di sistema sono collegate al file system.
In particolare le chiamate per leggere e scrivere un file precedute dalle chiamate per aprire e chiudere il file stesso.
Ci sono poi le chiamate relative alla gestione delle directory come mkdir e rmdir e le chiamate, utilizzate solo in UNIX
per fondere due file system in uno solo.
In UNIX ci sono un centinaio di chiamate di.sistema.e, per ogni chiamata di sistema, c'è approssimativamente una
procedura di libreria che viene chiamata per attivarla.
Con Windows, la situazione è diversa: le chiamate di libreria e le vere chiamate di sistema sono spaiate. Microsoft ha
definito un insieme di procedure le Win32 API (Application Program Interface: Interfaccia tra applicazioni e
programmi). Il numero di queste API è estremamente ampio, dell'ordine delle migliaia: molte invocano chiamate di
sistema ma un considerevole numero viene eseguito nello spazio utente.
In UNIX la GUI viene completamente eseguita nello spazio utente, mentre Win32 API ha un ampio numero di
chiamate per la gestione delle finestre che, se il sottosistema grafico viene eseguito nel kernel, sono vere chiamate di
sistema.
STRUTTURA DI UN SISTEMA OPERATIVO
Sistemi a livelli vedi pag 179-181 di Garavaglia Petracchi.
Macchine virtuali
L 'idea utilizzata nel sistema VM/370, è quella di separare nettamente le due funzioni del S.O. quella di fornire la
multiprogrammazione e quella di fornire una macchina estesa.
http://guidepc.altervista.org
Il cuore del sistema, detto monitor della macchina virtuale gira direttamente sull 'hardware e si occupa della
multiprogrammazione, fornendo al livello superiore più macchine virtuali.
Queste macchine virtuali non sono macchine estese ma copie esatte del semplice hardware, incluse le modalità
kernel/utente, l'input/output, le interruzioni e tutto ciò che possiede una vera macchina.
poiche ogni macchina virtuale è identica al vero hardware, ciascuna può far girare qualunque S.O. in particolare alcune
macchine virtuali possono eseguire un S.O. a singolo utente detto CMS (Conversational Monitor System).
Quando un programma CMS esegue una chiamata di sistema, la chiamata viene passata al S.O. nella sua macchina
virtuale con una TRAP e non al VM/370, proprio come se il S.O. girasse su una macchina reale e non su una macchina
virtuale. Il CMS eseguirà le istruzioni per eseguire la chiamata e queste istruzioni vengono catturate con una TRAP dal
VM/370 che le esegue come una parte della sua simulazione.
Operando una separazione completa delle funzioni di multiprogrammazione e di presentazione di una macchina estesa,
ciascuno dei due pezzi può essere più flessibile e più facile da mantenere.
L 'idea di macchina virtuale è usata quando viene eseguito un programma MS-DOS su un Pentium. Intel ha fornito sul
Pentium una modalità virtuale 8086: in questo modo la macchina si comporta come un 8086 e questa modalità è
utilizzata da Windows per eseguire programmi MS-DOS che vengono lanciati in modalità 8086 virtuale. Finchè
eseguono normali istruzioni, vengono eseguiti direttamente sull'hardware, mentre quando un programma prova a fare
una TRAP al sistema operativo per eseguire una chiamata di sistema, si verifica una TRAP al monitor della macchina
virtuale. Notiamo che questo approccio non corrisponde perfettamente a quello del VM/370 perche in questo caso non
viene emulato un Pentium ma solo l'8086.
Un'altra area dove vengono utilizzate le macchine virtuali è per eseguire programmi Java. Quando fu creato il
linguaggio di programmazione Java, fu creata anche una macchina virtuale la JVM (Java Virtual Machine). Il
compilatore Java produce codice per la JVM che viene eseguito da un interprete JVM software. Il vantaggio di questo
approccio è che il codice JVM può essere inviato via Internet ad un altro calcolatore che abbia un interprete e qui
eseguito.
Ovvero, mentre compilando normali exe con un compilatore come C, si sceglie con che set di istruzioni compilarlo
(Win32, Unix…), un programma Java viene sempre compilato con un linguaggio specifico, chiamato ByteCode,
trasformato dalla JVM a seconda del S.O. in uso.
Exokernel
Andando un passo avanti i ricercatori del MIT hanno costruito un sistema che dà ad ogni utente un clone del calcolatore
reale ma con un sottoinsieme delle risorse. A livello più basso, in esecuzione in modalità kernel, c'è un programma
chiamato exokernel, il cui compito è allocare risorse alle macchine virtuali e controllarne i tentativi di utilizzo delle
risorse per essere sicuri che nessuna macchina stia tentando di utilizzare le risorse di un'altra.
Il vantaggio di questo sistema è che risparmia un livello di mapping: negli altri sistemi ogni macchina virtuale pensa di
avere il proprio disco con i blocchi che vanno da 0 a qualche massimo, per cui il monitor della macchina virtuale deve
mantenere delle tabelle per convertire gli indirizzi del disco, mentre con l' exokernel questa conversione non è
necessaria perche deve solo tener traccia di quale macchina è stata assegnata a quale risorsa.
Modello client-server
Il sistema VM/370 guadagna molto in semplicità perche sposta la parte di codice che implementa la macchina estesa ad
un livello più alto, il CMS. Tuttavia il programma VM/370 è ancora un programma complesso perche la simulazione di
molte 370 virtuali non è semplice.
Una tendenza dei moderni S.O. è quella di sviluppare ulteriormente l'idea di spostare il codice verso livelli superiori
lasciando un minimo microkernel.
Si implementano la maggior parte delle funzioni del S.O. attraverso processi utente e per richiedere un servizio, come
la lettura di un blocco di un file un processo utente (detto processo client) spedisce la richiesta ad un processo server
che esegue il servizio e restituisce la risposta.
Il kernel si occupa solo della gestione della comunicazione tra client e server, dividendo il S.O. in parti, ciascuna delle
quali gestisce solo un aspetto del sistema, come ad esempio la gestione dei file, quella dei processi o della memoria,
ogni parte diventa piccola e maneggevole.
Un vantaggio del modello client-server è la sua adattabilità ad essere utilizzato su un sistema di elaboratori collegati in
rete.
http://guidepc.altervista.org