Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACOLT DI INGEGNERIA
APPUNTI DI SISTEMI OPERATIVI
Prima versione:
Paolo Bellagente AA 2006/2007 gkerion@yahoo.it
Seconda versione:
Luca Seghetto AA 2014/2015
2 - Il Sistema Operativo
Come detto sopra in questo corso si parler di Sistemi operativi, ma
cosa vuol dire sistema operativo (SO da qui in poi)? Il nome in s non
dice molto; andando a leggere alcuni libri di informatici teorici molto famosi si nota che anche loro fanno fatica a definire un concetto cos astratto; mettiamoci allora d'accordo su cosa intendiamo quando parliamo di SO:
"Definizione": un SO un software che fa da intermediario tra l'hardware (HW di seguito) e il software (SW di seguito) il cui scopo rendere
possibile il passaggio da Programmi a Processi.
La differenza tra Programma e processo abbastanza immediata:
Programma: specifica di un algoritmo scritta in un determinato linguaggio, entit statica ed astratta.
Processo: Programma in esecuzione su un esecutore; un'entit
concreta, dinamica e collocata nel
tempo.
Diamo un'occhiata all'architettura
generale, essa presenta una struttura a livelli:
Le applicazioni utente vengono tradotte dai compilatori (interpreti etc..)
in un linguaggio pi vicino alla macchina tuttavia di solito solo SO ad avere il
controllo completo del HW e non l'applicazione utente.
Per fare ci il SO maschera parzialmente l'ISA
(insieme delle istruzioni tipiche di ogni
VIRTUALIZZATORE
REALT VIRTUALE
REALT "VERA"
Uomo
LSD
mondi fantastici
reazioni chimiche
(dannose) nel cervello
Uomo
Sistemi di realt
virtuale
scenari 3D
Uomo
SO
macchina dedicata
macchina condivisa
Processi
SO
CPU dedicata
CPU condivisa
Processi
SO
Spazio in memoria
continuo e dedicato
(memoria virtuale)
memoria allocata a
pezzi ed in parte
su disco
Processi
SO
File
dispositivi HW diversi
Lo stesso SO consente agli sviluppatori di realizzare le loro applicazioni secondo solo le specifiche del SO e non dei diversi HW su quale vengono realmente
eseguite.
Nome: SO.
Et: circa 50 anni.
Sesso: SW (ma molto vicino al HW).
Professione: virtualizzare. Pu essere a pi livelli dove la "realt
vera" una virtuale generata dal livello inferiore (es Java Virtual Ma chi
ne). Per separare utenti che condividono la stessa macchina pu creare di
verse realt separate nelle quali pu fare tutto.
Domicilio: sistemi di elaborazione.
2.2 - Classificazione
I SO possono essere suddivisi in categorie a seconda delle loro caratteristiche/piattaforme per cui sono progettati, ad esempio:
SO mono/multi-processore: Sono in base alla tipologia di CPU: Monocore (es Intel Pentium) o multi-core (es Intel Duo, I7, I3 ecc)
SO di rete: Possono connettersi ad una rete (es Internet)
SO distribuiti: S fruttando una rete di calcolatori, tramite la virtualizzazione, da l'impressione di avere un unico enorme calcolatore .
SO cluster: Virtualizza un enorme sistema, costituito da molti processori posto in una zona ben delimitata e circoscritta (Super-calcolatori, server di grandi dimensioni).
SO embedded: SO dedicati ed molto ottimizzati per sistemi con poche risorse di calcolo, generalmente dedicati ad applicazioni particolari (es lavatrici, PLC, automobili ecc...).
Generalmente gli SO comuni (es Windows o Ubuntu) sono a multiprocessore e di rete.
Es di vita di un calcolatore:
Durante un ciclo di vita (da quando viene acceso il calcolatore a quando viene spento) esso passa tre frasi principali: Boostrap (dove viene preparato il
sistema per l'utilizzo da parte dell'utente), si ha poi un funzionamento regolare e una fase di Shutdown al termine (si salvano i dati non salvati e si prepara il calcolatore alla prossima accensione).
2.3.1 - Bootstrap
Il bootstrap la sequenza di accensione di un calcolatore.
La CPU esegue solo le istruzioni che le vengono date, perci inizia dalla 0 che
si trova su una ROM (Read Only Memory). Tale frammento di codice, che chiamata BIOS (Basic Input Outpu System) serve per effettuare dei controlli HW
e preparare il sistema a caricare SO.
Esso si compone di diverse fasi; all'inzio viene effettuata una diagnostic,
rilevamento e configurazione dell'HW (verifica e certificazione della presenza di RAM, della scheda video, audio ecc...), una successiva inizializzazione dell'HW (lettura del SO del dispositivo, firmware) e la preparazione
delle routine di interrupt.
Fino ad adesso non stato ancora caricato e ne eseguito una singola riga del
SO.
Se questa fase fallisce, il dispositivo emette segnali audio o video e si blocca
in attesa di riparazioni (es mancanza della tastiera).
A questo punto viene identificato il dispositivo di Boot (es CD, DVD,
USB, HDD ecc) dal quale viene letta una locazione fissata dello stesso.
Questa locazione contiene un programmino d i boot (bootloader),il quale
consente all'utente di scegliere (se necessario) il SO da caricare e la posizione sul
disco fisica dove esso contenuto (l'indirizzo da cui partire per caricare SO).
Per fare ci deve quindi contenere anche informazioni sulle partizioni del disco.
Il caricamento del SO (compia del suo codice dal dispositivo di memorizzazione alla memoria centrale, RAM) detto a valanga, ed in questa fase
che verranno create tutte le strutture per il corrretto funzionamento dello
stesso (es struttura per la sessione utente con i permessi sui vari oggetti del
SO).
In questa fase verranno anche avviati i processi di sistema e quelli utente utili (es: login&password).
Se il processo di Boot si blocca in questa fase, SO parte in modalit provvisoria (un boot semplificato) che carica meno cose possibili (per es. invece
del driver di accelerazione grafica avvier il driver grafico base per tutte le
schede) sperando di escludere il programma che ha generato l'errore; si
consegner all'utente una macchina brutta ma funzionale, allo scopo di correggere gli errori.
2.3.2 - Shutdown
Procedura d i spegnimento, in cui SO salva le informazioni sul suo stato e
termina ordinatamente i processi per evitare la perdita di dati e salvaguardare l'integrit della macchina.
Il process switch salva tutto quello che riguarda P1, carica tutto c i
che riguarda P2 (Si ha sempre l'intervento del SO e quindi anche un
cambio di modo).
Un mode switch deve comunque avvenire ogni decina di microsecondi,
di conseguenza deve durare poco per non incidere eccessivamente sulle
prestazioni della macchina.
2.3.5 - Gestione degli interrupt
Si detto che sia i n un mode switch che i n un process switch avviene il salvataggio delle informazioni relative all'istruzione corrente, tuttavia nei calcolatori moderni il concetto di istruzione corrente potrebbe essere difficilmente determinabile d at o c he i l calcolatore non esegue
una sola istruzione alla volta, ma le esegue come in una catena di
montaggio (pipline).
Si hanno due tipi di microprocessori progettati per:
interrupt precisi: il microprocessore a risolvere tutte le istruzioni accavallate e ad individuare l'istruzione corrente.
interrupt imprecisi: il microprocessore passa tutto i l suo stato al
SO al quale resta l'onere dei calcoli per individuare l'istruzione corrente.
La seconda configurazione spesso non v a bene per applicazioni real
time (dove la durata del mode switch cruciale).
Solitamente il sistema in grado di gestire interrupt nidificati, ovvero interrupt durante la gestione d i un altro evento (il sistema gi in modo kernel).
Succcessivamnte si cercato di
implementare un modello a livelli, che per risultato impossibile da realizzare causa delle
troppe interazione fra le varie
parti.
Uno schema di principio potrebbe essere quello mostrato in figura.
Una delle parti pi critiche e complesse di un SO il livello kernel,
infatti esso si occupa principalmente della gestione tra i processi e
HW ed esso pu essere costruito
principalmente in tre modi:
kernel monolitico:Tutto il codice del kernel (cuore) del SO in unico
blocco. Le limitazioni pricipali di questo modello sono: tutto eseguito in
modalit Kernel, quindi c' un alto rischio che il sistema si blocchi in caso
di errore; l o sviluppo e l'estensione del progetto sono scarsamente facilitati dato che, per apportare anche una piccola modifica, si deve
mettere mano a migliaia di righe di codice; inoltre quando si accende
la macchina si carica sempre tutto anche quello che non serve con un
forte spreco d i tempo e risorse.
kernel modulari (Linux): Dove una parte resta monolitica ma la
maggior parte delle funzionalit racchiusa in moduli che possono
essere aggiunti o rimossi (anche a macchina accesa per es i driver).
Microkernel: Prevede un piccolissimo (micro) kernel che contiene le
funzioni d i controllo dell'HW e d i gestione degli interrupt, mentre tutto il resto (es gestione del disco ) si appoggiano sul microkernel come
processi eseguiti in modo utente.
Ponendo il caso che riparta lo stesso processo di prima, alla fine della lettura si avr
lo stesso procedimento in verso opposto.
Totale alla fine dell'operazione: 4 mode switch e 2 process switch contro i 2 mode switch
del caso in cui il SO gira in modo kernel monolitico/modulare.
2.4.1 - Esempio: Microsoft Windows NT
Partiamo con un po' d i storia, l'avventura Microsoft nei sistemi operativi
parte nel 1981 con MS-DOS, da quel momento in poi si vista la nascita di
una lunga serie d i S O Microsoft. Considerando la moderna teoria dei SO, l'
MS-DOS, win95, win98, winME non possono essere definiti SO a pieno titolo in
quanto (sopratutto per retrocompatibilit con DOS) non supportano a pieno il
dual mode e i meccanismi di virtualizzazione dell'HW. MS-DOS si lasciava scavalcare tranquillamente dalle applicazioni utente nel controllo dell'HW per
motivi di compatibilit con processori non dual mode.
La svolta si ebbe con i sistemi della serie Windows NT (New Tecnology) della
quale fanno parte tutti i si sistemi MS moderni (winNT, win2000, winXP, winVista).
NT nacque con l'obiettivo d i essere portabile su architetture diverse, venne introdotto HAL, l'Hardware Abstraction Layer, i l livello che si appoggia direttamente al HW ed perci scritto in assembly ed specifico della macchina(I/O,memorie, timer, gestione delle informazioni contenute nel BIOS...).
Il livello kernel corrisponderebbe al microkernel, infatti il progetto iniziale prevedeva una struttura di questo tipo ma le prestazioni misurate nei test spinsero per una struttura ibrida.
Lo schema rimasto a microkernel ma il funzionamento no, tutto il SO gira
comunque in modo kernel per aumentarne le prestazioni (vengono tolti i Process switch in eccesso).
Interessanti risultano alcune caratteristiche del livello executive che contiene i vari moduli del SO. Si pensato di applicare la filosofia ad oggetti
nel programmare il SO nonostante il linguaggio utilizzato non supporti la OOP
Per motivi di velocit i subsystem sono stati eliminati, per motivi economici
sono stati eliminati gli HAL multipiattaforma (il livello logico invece rimasto).
La compatibilit DOS stata invece eliminata per ragioni di sicurezza; stata
mantenuta un'emulazione DOS per i vecchi software scritti in modo migliore
rispetto agli standard dell'epoca.
Il simulatore in Windows crea un processo chiamato NTVDM-NT Virtual Dos
Machine che controlla il processo DOS. Finch il programma fa chiamate consentite esse vengono passate direttamente al SO, appena viene effettuata una chiamata privilegiata essa viene intercettata e inviata alla NTVDM
che, se possibile, traduce la chiamata privilegiata nella corretta Syscall di
Windows altrimenti genera un eccezione (trap) e termina il programma DOS.
3 - Input/Output
Passiamo ora ad analizzare come un SO gestisce le richieste di I/O.
Come si pu notare dalla figura esiste una chiara architettura a strati. Ogni
processo utente si appoggia ad un livello (I/O livello utente) che contiene le
funzioni di libreria per effettuare le syscall e l'implementazione di servizi di supporto come lo spooling (Simultaneous Periferical Operation On
Line):
ES: Eseguo la stampa d i un file d i 2 0 0 pagine, una volta dato i l comando di stampa esso termina prima della fine della stampa delle 200 pagine.
Un altro processo comunica con la stampante mentre l'utente pu continuare a fare altro.
Appena fuori dal modo utente, troviamo il
primo strato eseguito in modo kernel, del
SW indipendente dal dispositivo.
Questo livello implementa un'interfaccia
uniforme con i driver (SW fornito dal progettista del HW), permette la denominazione dei
dispositivi e ne gestisce la protezione (permessi), implementa le necessarie allocazioni
di memoria e permette l'allocazione dei dispositivi dedicati.
I dispositivi dedicati sono particolari periferiche che possono fare una cosa per volta
(la stampante, per esempio, bene che
stampi un documento alla volta), il sistema,
quindi, gestisce una tabella di stato dei dispositivi dove controlla se il determinato
dispositivo libero (quindi lo occupa e esegue l'operazione richiesta) o occupato
(quindi genera una coda delle richieste).
Il trasferimento dei dati da/per la periferica avviene in unit minime che possono essere caratteri nel caso della tastiera o blocchi nel caso
delle stampati o del HDD.
Esiste perci il problema di archiviare i dati in
transito e ci viene effettuato tramite il Bufering (implementato in questo livello).
Esso consiste in una memoria condivisa tra produttore e consumatore del dato.
Il produttore (es la scheda di rete o la tastiera), invece di inviare le informazioni immediatamente al programma utente le invia al sistema operativo i l
quale le memorizza i n un bufer aspettando che i l programma utente
sia pronto per processarle.
mentre il consumatore (l'applicazione che ne ha fatto richiesta) sta ancora leggendo i dati vecchi. Questo f a si che le operazioni d i lettura/scrittura possano essere molto ottimizzate come mostra il prossimo grafico:
In questo modo si slega produttore e consumatore e ci si traduce nel avanzamento dell'applicazione, dopo aver dato il comando di stampa, senza che essa sia
stata realmente effettuata.
3.1 I / O c o n l ' u t e n t e
Per I/O con l'utente si intendono quelle operazioni che la macchina svolge
per ricevere istruzioni dall'utente umano.
Usualmente si distinguono 2 contesti:
Tastiera con video alfanumerico (CLI)
Grafica (GUI)
3.1.1 Tastiera con video alfanumerico
Metodo di I/O con l'utente pi tradizionale. Prevede l'utilizzo della sola tastiera e di un'interfaccia alfanumerica (come il terminale di Linux o del MSDOS, senza finestre o altri artifici grafici).
Questo metodo pu essere collegato al software in due modi:
RAW (letteralmente Crudo): tutti i tasti premuti vengono passati, uno
alla volta, direttamente all'applicazione, la quale avr l'onere di tradurli nei rispettivi caratteri/comandi.
COOKED (letteralmente cotto, cucinato): viene demandato al SO il
compito di effettuare l'editing di linea (traduzione e formattazione) solo
dopo il SO invia la linea all'applicazione.
3.1.2 - Grafica
Questo metodo si basa sulla presenza di
oggetti grafici con i quali l'utente interagisce.
L'applicazione utente chiede al SO se avvenuto qualche evento (un click del mouse per
esempio), il SO, come risposta passa all'applicazione un messaggio che definisce l'azione
svolta dall'utente.
Con la chiamata l'applicazione
utente viene interrotta e riprender solo dopo che il SO abbia risposto con l'apposito messaggio.
C on la callback il SO invia il messaggio ma l'applicazione non riprende da dove era stata interrotta,
ma dove punta la callback, cio a
quella parte di codice scritto per gestire il determinato evento.
4 - Processi
Uno degli obiettivi di un S O fare i n modo che i programmi diventino processi, cio diventino un'entit ben definita e fisica che evolve in un calcolatore.
Ma come nascono i processi?
Tutti i processi attivi derivano da un processo padre, il quale li crea (il primo creato in fase di Boot a seguito del Bootstrap), tuttavia possibile distinguere due meccanismi che determinano la creazione di un nuovo processo:
Per un comando dell'utente (es: avvio un programma).
Generati direttamente dal SO (es: servizi di sistema).
In generale possibile descrivere la genealogia dei processi con una struttura
ad albero:
La situazione opposta, cio la morte di un processo, di solito avviene per suicidio, dove il processo comunica al S O: h o finito i l mio compito quindi eliminami".
Esistono, per, altri due casi in cui un processo pu morire:
per incidente a seguito di una trap
uccisi (kill) dall'operatore o dal SO (es nel caso di attesa infinita o
quando c' esigenza di liberare risorse) o per la morte del processo padre (non possono esistere senza il padre, quando si elimina un proces-
Ora se il processo viene eseguito completamente passa nello stato terminated e cos muore, se invece, deve effettuare un'operazione d i I / O o
aspettare un evento passer nello stato blocked, oppure, se semplicemente scade i l suo quanto d i tempo ritorna nello stato ready e
aspetta che g l i venga riassegnata la CPU.
Nello stato blocked il processo aspetta fino alla fine dell'operazione d i I/O
o fino al verificarsi d i un determinato evento ( es: click del mouse) dopodich si rimette nella coda dei processi pronti.
Seguendo un determinato algoritmo, detto d i scheduling a medio termine, viene deciso quale processo abbia o meno il diritto di restare in memoria centrale o quale debba essere momentaneamente spostato su disco per
far spazio in RAM ad altri (se necessario).
Quando un processo viene eletto per essere messo su disco (sospeso) si
passa dagli stati rispettivamente ready e blocked ai corrispettivi suspended ready e suspended blocked.
Immaginiamo un processo che mentre viene eseguito faccia una richiesta
Presenta gli stessi elementi fondamentali del ciclo di vita classico, la particolarit si trova nello sdoppiamento dello stato ready i n due code: una per
i processi utente ed una per i processi del super-utente con priorit
maggiore.
User data: area che contiene i dati del processo. Area modificabile quindi la sua dimensione potrebbe variare nel tempo.
4.3 - Thread
Ogni processo pu avere assegnati pi flussi di controllo, cio programmini
separati che condividono lo stesso codice eseguibile (sia tra di loro che
con il processo) e servono per una migliore gestione dello stesso.
Per capire meglio, iniziamo questo paragrafo, con due esempi di struttura
di un moderno programma:
Text Editor: Il codice di un applicazione di
text editing (MS- Word o OOWriter per esempio) in realt un insieme di funzionalit diverse a volte separate l'una dalle altre. Per
esempio il codice che gestisce l'interazione
con l'utente separato dall'impaginatore
che separato dal controllo automatico
dell'ortografia.
Sono
Nel caso che esiste un solo processo (tipico dei sistemi embedded) la vita di
un calcolatore potrebbe essere schematizzata come una sequenza alternata di CPU Burst e I/O Burst.
I n base a questo possibile suddividere i processi in due categorie:
Processi CPU Bound: Sono processi legati alla CPU, passano la maggior parte della loro vita a caricare di calcoli la CPU. Le operazioni di I/O
sono ridotte al minimo (es codice Matlab/Octave)
Processi I/O Bound: Sono processi interattivi, passano la maggior parte della loro vita ad aspettare operazioni di I/O. I calcoli richiesti alla CPU
sono minimi.
Come si pu notare la percentuale di uso della CPU non ottimale (ci sono
dei momenti in cui non fa nulla), inoltre P2 (principalmente I/O Bound) viene spesso scavalcato da P1 dando una sensazione di lentezza all'utente. In
generale il FIFO abbatte tutti i parametri presi in considerazione ed inoltre ha
il grosso svantaggio che se un programma si blocca, si incioda l'intero sistema senza possibilit di recupero (senza spegnerlo), tuttavia esiste un solo
caso i n cui l'algoritmo FIFO risulta ragionevole: quando tutti i processi
sono CPU Bound:
Migliora la percentuale di uso della CPU migliore rispetto al FIFO puro, inoltre i processi interattivi aspettano, in media, meno rispetto a prima, e i CPU
Bound non vengono penalizzati t r o p p o .
In questo caso diventa per fondamentale la durata del quanto di tempo:
se troppo lungo cado nel caso FIFO, se troppo corto la percentuale di
tempo usata per i Process switch ed i mode switch aumenta (tempo sprecato perch non faccio calcoli utili, ma solo spostamenti di registri).
Il problema nasce nel caso di processi molto interattivi (es servizio di messaggistica istantanea), dato che il tempo complessivo speso in coda sar
molto maggiore di quello in cui processo viene eseguito, quindi, per ristabilire
un po' di equit tra i processi, si sono introdotti meccanismi a priorit (sia
esterne, assegnate dall'utente, che interne).
Le priorit possono essere:
Non Preemptive ( senza prelazione). Il processo pi prioritario, quando torna pronto, viene messo in testa alla coda ma non interrompe il
processo in esecuzione.
Preeemptive: ( con Prelazione). Il processo pi prioritario ruba la
CPU a quello che sta girando.
Shortest Job First
Immaginiamo un bambino con un pacchetto di caramelle dietro a un signore
con il carrello pieno, entrambi in coda alla cassa di un negozio, usualmente,
Il problema interpretare la frase "ha meno da fare" visto che in un normale funzionamento impossibile stabilire a priori, a meno di conoscere il futuro, per quanto tempo i processi in coda devono usare la CPU singolarmente.
Nella realt si usa un algoritmo per stimare il tempo del prossimo CPU Burst
in base all'utilizzo attuale e pregresso della CPU:
HRRN=
W +S
S
Esistono diversi possibili criteri per costruire le code multiple, in base a vari
criteri (priorit, con o senza prelazione ecc...), inoltre sono stati ideati anche
algoritmi basati sull'estrazione a sorte ( Lottery Scheduling), dove ogni
processo ha un range d i numeri associati, e viene eseguito il processo che
possiede, nel suo range, il numero estratto dal SO.
Ci
Ti
T i 1
i=1
Una volta che l'analisi ha dato risultati positivi esistono vari algoritmi che vengono implementati per gestire problemi real time:
Rate Monolitic
La priorit maggiore viene data alla routine dell'evento con frequenza maggiore.
N
1
Ci
T n (2 n 1) ; inoltre possibile
i=1
i
sa.
Se arriva un interrupt real-time il SO usa i criteri ad essi assegnati, nel
caso opposto (per es. una lettura su disco) viene degradato a pi bassa
priorit al SO tradizionale (Linux/Win).
In questo modo possono funzionare alcune garanzie real-time anche su sistemi tradizionali.
COUNTER --
LOAD RX COUNTER
INC RX
STORE RX COUNTER
LOAD RY COUNTER
DEC RY
STORE RY COUNTER
Si prenda come esempio questo codice assembly, con valore iniziale di counter
pari a 3 (P1 indica valore della variabile counter nei registri della CPU; mem il
valore scritto in memoria RAM).
P1 LOAD RX COUNTER
P1 INC RX
interrupt
P2 LOAD RY COUNTER
P2 DEC RY
P2 STORE RY
P1 STORE RX
P1
while (turn!=1)
{no operazioni;}
Sezione critica
Turn=0;
Questo esempio viola il requisito di progresso; s e un processo utilizza la sezione critica deve per forza aspettare che l'altro finisca, e non importa in che
punto della coda di scheduling esso si trovi. Questo porta alla possibilit di
dover aspettare un tempo potenzialmente infinito per la conclusione dell'elaborazione.
Esempio 2:
Var condivisa (in memoria): Int critica[]=0; //Vettore
P0
critica[0]=1;
while (critica[1])
{no operazioni;}
Sezione critica
critica[0]=0;
P1
critica[1]=1;
while (critica[0])
{no operazioni;}
Sezione critica
critica[1]=0;
In questo caso la propriet di progresso garantita, ma se dovesse occorrere un interrupt tra la prima e a seconda istruzione:
critica[0]=1
interrupt
critica[1]=1
se critica[O]==1 allora non fare nulla
interrupt
(riprende PO) se critica[1]==1 allora non far nulla
In questo caso si ha una deadlock, dove P0 aspetta che P1 esca dalla sua
sezione critica mentre P1 aspetta P0. Se scambiamo l'ordine delle prime
due istruzioni risolviamo il problema della deadlock ma violiamo il principio di
mutua esclusione: superato il while P 1 entra nella sezione critica e P0
pure.
Esempio 3:
Var condivisa (in memoria): Int critica[]=0; //Vettore
P0
while (critica[1])
critica[0]=1;
{no operazioni;}
Sezione critica
critica[0]=0;
P1
critica[1]=1;
while (critica[0])
{no operazioni;}
Sezione critica
critica[1]=0;
Se avviene un interrupt come nel caso precedente (tra la prima e la seconda istruzione di P1) il "gioco" sembra funzionare, l'unico problema che si
pu riscontrare che, in questo caso, uno dei due processi viene trattato
con poca equit, c' il rischio di starvation.
Esiste una soluzione ottimale ed :
4.7.2 - L'algoritmo di Peterson
Var condivise (in memoria): Int turn=0; Int critica[]=0; //Vettore
P0
P1
critica[0]=1;
critica[1]=1;
turn=1;
turn=0;
while (critica[1] & turn==1)
while (critica[0] & turn==0)
{no operazioni;}
{no operazioni;}
Sezione critica
Sezione critica
critica[0]=0;
critica[1]=0;
Tutti i requisisti sono soddisfatti in quanto se esiste solo P0 il requisito di
progressione garantito.
Se esistono PO e P1 ed entrambi arrivano alla sezione critica, inizialmente
P0 resta in attesa, poi P1 si ferma, e solo allora P0 entra nella sezione,
quindi garantita la mutua esclusione, cosi come il requisito di attesa limitata (prima o poi verranno eseguiti tutti e due, non c' rischio di starvation).
Esiste comunque un limite: non estendibile a pi di due processi.
Il problema sembra non risolvibile a livello puramente software, quindi sono
state trovate delle soluzioni che sfruttano l'HW per aggirare il problema.
4.7.3 - Istruzioni HW ad atomicit estesa
Test and Set: legge e setta (mette a 1) la variabile indicata; ci elimina
una race condition molto frequente.
Esempio:
Int Lock=0; //Assumer solo due valori 0 e 1
while (T&S(Lock))
{no operazioni;}
Sezione critica
Lock=0;
La garanzia di atomicit ci viene data dal processore, quindi tale implementazione rende la soluzione valida per un numero indefinito di processi ma resta invariato il problema della mancanza di equit (starvation) in quanto
non possibile prenotare l'uso della sezione critica (meccanismo di code).
Tutti questi ultimi algoritmi, se pur funzionanti, hanno un piccolo difetto in comune: quando un processo aspetta che si liberi la risorsa, occupano la CPU,
P0
P1
wait (sync)
signal (sync)
...
In questo esempio ci sono due processi, in cui una parte del codice di P0 non
pu essere eseguita prima che P1 arrivi ad un punto stabilito (parte sopra il
signal).
In questo modo P0 si ferma se prima dell'istruzione wait P1 non ha eseguito
l'istruzione signal liberando il semaforo.
Semaforo inizializzato ad n (n=>2): serve per gestire n risorse equivalenti (per esempio viene utilizzato nel caso di pi produttori e consumatori
che accedono alla stessa memoria condivisa).
Esempio: Buffer circolare con i semafori
Int empty=n; full=0; mutex=1; //Semafori.
PRODUTTORE
CONSUMATORE
Produci dato();
wait(empty);
wait (mutex);
Sezione Critica (Buffer)
signal (mutex);
signal (full);
wait(full);
wait(mutex);
Sezione Critica (Buffer)
signal(mutex);
signal(empty);
wait(): fa si che un processo si "addormenti" dentro il monitor in attesa del verificarsi di una condizione liberando il monitor per l'accesso di
un altro processo
signal(): sveglia un processo "addormentato" nel monitor. Nel caso ci
fosse un altro processo mentre lo svegliato dormiva, uno dei due
deve essere "sbattuto fuori" immediatamente per non causare race
conditions. La precedenza dei processi questo caso non a priori.
un tipo di comunicazione simmetrica che pu coinvolgere solo due processi, in alternativa, la comunicazione asimmetrica, con primitive simili
a:
Il canale creato dal SO e deve essere per forza tra due processi (un
canale per ogni coppia processo/processo2).
La comunicazione diretta non permette la definizione di priorit (c' un solo
canale e non si pu sorpassare) inoltre non posso mandare messaggi a
qualcuno che deve ancora nascere (il destinatario deve essere conosciuto).
Per questi motivi i meccanismi pi usati si basano su una comunicazione indiretta.
Comunicazione indiretta
In questo caso esiste una struttura dati che fa da tramite per i messaggi
(una casella postale, mailbox che non c'entra nulla con la posta elettronica).
Le primitive diventano.
Send(casella, messaggio)
Recive(casella, messaggio)
Quindi esistono syscall per creare la casella, inoltre il rapporto tra utenti
deve essere n:n (n caselle per n utenti).
Con questo metodo possiamo incanalare un messaggio a priorit pi alta in
determinate caselle.
In questo caso si hanno tre tipologie di canali:
guiti
Hold & wait
No preemption (prelazione)
attesa circolare
lo utile. Cos per, oltre a buttare un sacco di tempo facendo passare tutti
gli spazi, s i creano dei rimasugli piccolissimi che non verranno mai usati.
5.2.2 - La Paginazione
In questo caso si suddivide sia la
memoria virtuale che quella fisica in pagine di uguale dimensione (con pagine chiamate frames). Qualunque pagina libera
pu essere utilizzata, inoltre la
dimensione della memoria fisica
svincolata da quella della
memoria virtuale; la memoria
virtuale pu essere anche maggiore di quella fisica.
Inoltre possono esistere processi in parte in memoria centrale e in parte sul disco.
L'unico prezzo da pagare per
una cos alta flessibilit la
necessit di tabelle che mappino in questo modo la memoria
virtuale in quella fisica.
Per ogni processo esiste in memoria una tabella detta tabella
delle pagine nelle cui righe
vengono memorizzate l'indirizzo
fisico di ogni pagina.
La traduzione dall'indirizzo virtuale a quello fisico, viene effettuato sommando l'indirizzo della pagina fisica (che corrisponde al primo byte della pagina)
all'indirizzo virtuale fornito (in questo modo modifico solo la parte pi significativa dell'indirizzo mentre il resto passa inalterato o quasi).
Questo metodo viene
chiamato indirizzamento per direct
mapping.
Il problema della
frammentazione non
completamente risolto perch allocare
solo spazi multipli
della dimensione della pagina, perci
molto probabile che
qualche pagina non
sar completamente
riempita ma l'entit
del fenomeno comunque minore rispetto al caso con allocazione contigua.
Inoltre sorgono anche
problemi di prestazioni dovuti alla serie di
calcoli necessari al mapping, ridotti attraverso un'opportuna circuiteria hardware, che scarica tale mansione dalla CPU.
Il problema risiede nel fatto che qualunque accesso in memoria necessita di
5.3 - Segmentazione
Ogni processo posto in memoria centrale costituito da diverse parti (vedi
capito 4.1) non omogenee tra di loro, a cui opportuno applicare dei permessi
di lettura/scrittura, cosa difficile da implementare se utilizzo un unico blocco di
memoria virtuale.
Consideriamo, per esempio, un blocco di memoria virtuale come quello della figura seguente, allocato con la tecnica della paginazione.
Quindi per risolvere l'indirizzo fisico si procede come gi visto: prima si controlla nel TLB se gi risolto questo indirizzo, in caso contrario il numero del
segmento mi permette di trovare, nella tabella dei segmenti, l'indirizzo della tabella delle pagine a lui relativa. Fatto ci, con il numero di pagina virtuale ottengo la relativa fisica che affiancato all'offset mi da l'indirizzo reale cercato.
Come detto prima, per limitare i page fault importante scegliere bene
chi spostare eventualmente sul disco.
Il criterio ottimale sarebbe quello di scegliere la pagina che verr usata pi
tardi nel futuro, ma ci implica una conoscenza del futuro da parte del SO, e
ci non possibile, tuttavia esistono degli algoritmi che permettono di approssimare tale criterio.
5.3.1 Algoritmi per la scelta della vittima
FIFO: Elimino la pagina pi vecchia nella memoria.
Non ha nessuna relazione con l'algoritmo ottimo, perch non detto che la
pagina caricata prima sia per forza quella pi inutile. Inoltre soffre anche
dell'anomalia di Belady, cio quel fenomeno che porta ad avere pi page
fault (in media) se si aumenta la capacit della RAM (Vedasi figura sottostante).
Nella prima tabella il numero totale di page fault pari a 9, a fronte di una capacit della RAM di tre pagine, tuttavia se si passa a 4 pagine i page fault dello stesso processo sono diventati 10 (sono addirittura aumentati).
Il fenomeno dovuto al fatto che l'algoritmo FIFO non gode della propriet
caratteristica degli algoritmi a pila, cio che il contenuto di una memoria di
dimensione d e distanza t incluso nel contenuto di una memoria di dimensione d+1 e distanza t [ M(Dim, i)M(Dim+1, i) ].
Quindi, come gi fatto, se non posso prevedere il futuro cerco di dedurlo dal
passato.
Least Recently Used (RLU): Scarto la pagina usata meno di recente.
Si utilizza una stringa delle distanze per sapere se la pagina utilizzata gi
stata utilizzata in passato e quantificare il tempo trascorso da allora.
Dalla stringa delle distanze si pu dedurre se utile o meno aggiungere RAM:
Distanza infinita: page fault inevitabile (primo accesso alla pagina).
vittima ideale
vittima papabile
Piuttosto che 11
vittima pessima
Allocazione Locale: Ogni processo che genera molti page faul penalizza solo se stesso perch le pagine swappate possono essere solo le
sue. Pu essere applicato sia in regime di allocazione statica (alla
nascita del processo gli viene assegnato un numero massimo di pagine che pu disporre in RAM; diverso dal concetto di working set)
e sia in regime di allocazione dinamica (alla nascita del processo gli
viene assegnato un numero massimo di pagine, tuttavia tale numero
pu essere riadatto a seconda delle esigenze). L'esperienza sottolinea
che questa la soluzione migliore.
Page Stealing: Il SO ogni tanto toglie delle pagine e osserva il comportamento del processo, se avvengono page fault, le restituisce, se invece non ci sono le assegna ad altri processi.
Il problema nasce sempre dalla limitazione delle risorse, quindi possibile
accontentare un numero limitato di processi altrimenti avviene il fenomeno del Trashing in cui, a causa dei troppi page fault, le prestazioni del sistema decadono vistosamente ( ad esempio il mouse va a scatti).
Il rischio di trashing aumenta proporzionalmente al grado di multiprogrammazione.
Uso
CPU
Grado di multiprogrammazione
5.4 - Principio di localit e dimensionamento delle pagine
Il principio di localit una affermazione empirica che si basa su due punti
di vista:
Spaziale: se si accede ad una cella di memoria probabilmente si acceder anche a quelle adiacenti.
tabella di bit: Assegno bit per pagina, il cui valore indica se la pagi-
na scritta o meno (es 0 vuota, 1 piena). Di facilissima implementazione e gestione lo svantaggio che lento a causa dell'elevato numero
di pagine normalmente presenti su un sistema (devo passare ogni volta
tutte le pagine per sapere quali sono quelle vuote).
lista concatenata: Una lista concatenata
di oggetti formati da: indicazione libero/occupato - cella inizio - n celle libere - riferimento
prox elemento. Esempio in figura, dalla cella 0
alla 5 celle libere; dalla 6 alla 4 occupate e
cos via. Struttura libera dalle limitazioni di
una grossa struttura unica e centralizzata,
ma che ha bisogno di calcoli di gestione
molto pi complessi.
Buddy System: Il sistema prevede l'allocazione della memoria a blocchi multipli di due. SI prende un blocco di memoria che divido met,
ogni met la divido in due met e reitero il procedimento fino ad ottenere un blocco di dimensione sufficiente per contenere il dato della richiesta. Tale metodo per sprecone, tuttavia tale svantaggio viene compensato dalla possibilit dell'applicazione di algoritmi per la gestione degli alberi, nei quali la ricerca molto veloce.
Propriet:
Nome: (Essenziale).
Dimensione: (Opzionale, quindi pu non esserci, ad esempio per la
tastiera non ha senso).
Data: (Opzionale)
Ultima modifica: (Opzionale)
Permessi: (Opzionale)
Proprietario: (Opzionale)
ecc ma sempre opzionali
Metodi/funzioni
Apri/Chiudi (opzionali, per es
vedi l'NFS: Netwok file system)
Lettura/Scrittura (opzionali, ma
almeno uno due due essenziale, ad esempio esempio un CD-R
gi scritto, tuttavia lo devo
poter leggere).
Un file quindi ha almeno un nome e
pu essere almeno o letto o scritto.
Esistono due sotto-moduli del SO fondamentali per la gestione dei file:
Files services
Directory services
In generale possiamo individuare anche qui un modello a livelli riportato
nella figura a fianco.
Analizzeremo l'argomento seguendo
questo schema partendo dal livello
pi fino ad arrivare alla gestione
dell'hardware.
Il nome di un file non altro che un riferimento logico che raggruppa una
struttura dati, la quale pu contenere qualsiasi cosa (come dati o dispositivi).
Ci che si abituati a distinguere come periferiche e file sono strutturalmente uguali a livello software.
Lo spazio dei nomi gestito dal directory services, il quale ha il compito di collegare ad ogni nome la sua corrispondente risorsa fisica. I nomi vengono organizzati con strutture ad albero, la cui radice (root) il punto di partenza per
analizzarlo (o costruirlo).
Dalla root partono i rami, che contengono le risorse e i dati.
Esistono due filosofie per organizzare i dati: ad unico albero (sistemi UNIX) e
a foresta (sistemi windows).
Nei sistemi ad unico albero (come quello
in figura) si ha sempre un unico punto da
cui partire (punto di mount, indicato con
/) e in si montano gli altri dispositivi (o
alberi) come rami di quello principale.
In questo modo possibile gestire infiniti
dispositivi diversi (in teoria), ma pone il
problema di riconoscere e montare i dispositivi esterni e di riconoscerne il diverso
Nei sistemi Windows la struttura a foresta (un insieme di alberi), dove ogni dispositivo viene contrassegnato con una lettera
(es C:/ o D:/) o una parola (di solito il
nome del dispositivo).
In passato, con la sola gestione a lettera
si poteva avere un numero massimo di dispositivi esterni (alcune lettere erano riservate a dispositivi specifici come i floppy disk).
Questo genere di organizzazione ha ragioni storiche pi che tecniche, dove i vari alberi sono in realt rami visti singolarmente.
La struttura prevede che si possano creare dei collegamenti (link) arbitrari tra elementi dello stesso albero (o tra alberi diversi). Con i link abbiamo
un oggetto che pu essere puntato da due nomi differenti. Un collegamento
pu essere di due tipi:
Hard link: i due nomi condividono la stessa struttura a basso livello;
Soft link: un solo nome punta alla struttura a basso livello, l'altro punta al primo nome.
Di quest'ultimo tipo sono i collegamenti pi frequenti.
La differenza principale fra i due tipi di collegamenti risiede nell'accessibilit del
dato, che sempre possibile con l'hard, non risulta pi possibile nel caso del soft
se cancello il primo riferimento (quello che contiene il riferimento a basso livello).
Il tipo del file (estensione) ha senso solo per le applicazioni, mentre, per il
SO sono solo sequenze di dati (riesce solo a distinguere se il file eseguibile o meno).
Il record (l'oggetto) l'unit d'accesso a livello di applicazione ed molto
diversa dall'unit d'accesso logica a livello di system call (usualmente il
byte).
I file a livello HW non sono altro che delle sequenze di bit, e spetta al SO riconoscere dove finisce un file e ne inizia uno nuovo.
Inoltre compito del SO tradurre gli indirizzi logici in locazioni sul disco ben specifiche (i bit sono raggruppati in blocchi logici per una migliore gestione del disco).
I file possono essere allocati in vari modi (strutture dati per l'allocazione
dei file):
Allocazione contigua: I dati di uno stesso file vengono posizionati in
blocchi contigui, in questo modo si riducono sia i movimenti del braccio
meccanico (estremamente lento se paragonato alla CPU), tuttavia si hanno problemi di frammentazione e di modifica del file nel caso che questo
aumenti le sue dimensioni nel tempo (come per la RAM). la soluzione
ideale per supporti read only, come i CD o i DVD (perch li scrivo una
volta sola) in cui ogni directory non altro che una tabella nelle cui righe
sono contenuti il nome del file e le relative informazioni.
Allocazione concatenata: I dati di uno stesso file possono essere anche in blocchi non contigui, infatti ogni blocco contiene, oltre ai dati, anche la posizione del successivo. Con questo metodo in ogni riga della tabella della directory vengono scritti solo il nome del file e il blocco iniziale. Il problema di questa gestione che se un blocco viene corrotto, per un
qualche motivo, non pi possibile accede ai successivi (con la contigua
questo non accade perch il SO copia le sue strutture in vari punti del disco, ma non fa lo stesso con i dati). Inoltre la lettura molto pi lenta perch la testina, in media, dovr fare molti spostamenti per leggere i vari
blocchi ( possibile che per motivi di spazio siano dispersi sulla superficie
del disco). Vedi FAT per la versione migliorata.
Allocazione indicizzata: Ogni file ha un blocco indice che lo descrive, il quale conterr informazioni sia sul file e sia sulle posizioni
dei vari blocchi. In questo caso possibile anche la lettura casuale
(leggo un blocco a caso) oltre che quella sequenziale (l'unica
permessa nei due metodi precedenti). Vedi Inode.
6.2.1 FAT (File allocation table)
Prevede un allocazione concatenata con
l'aggiunta di una tabella (chiamata FAT), che
contiene i riferimenti dei prossimi blocchi, in
modo da evitare di spargerli su tutto il disco.
Questo aumenta la robustezza del sistema e diminuisce gli spostamenti della testina; inoltre in
caso di accesso sequenziale sfrutta il principio di
localit.
Ogni elemento della directory formato da 8
campi:
Nome del File:
Estensione:
Flags: indicano se l'elemento una directory, o un eseguibile ecc.
Ora:
Data:
Primo Blocco:
Dimensione del File:
Una riga della MFT (record) contiene, in ordine: informazioni varie, il nome
del file, una sequenza di coppie che identifica il numero del blocco e la sua
dimensione in allocazione contigua.
Se il file grosso e le indicazioni sforano la dimensione massima di un record della MFT se ne utilizza un altro mettendo come ultimo parametro del
primo il riferimento al record successivo.
lo, tuttavia esistono altre strutture dati per la gestione delle partizioni.
Oltre a queste partizioni c' ne sono altre due di servizio, indicate nella figura
sottostante con i nomi MBR e Partition Table.
MBR un software di Windows per il caricamento iniziale del SO (in fase di boo tstrap), al pari del GRUB (sistemi GNU/Linux).
La Partition Table, contiene invece le informazioni varie sulle partizioni presenti
sul disco (nome, file system, dimensione ecc...).
Altre strutture dati che definiscono una partizione dipendono dal FS scelto,
per esempio in UNIX si ha la struttura rappresentata dalla figura sottostante.
tipo transazionali.
Tale memoria pu essere sia su RAM (in questo caso gestita dal SO) e si a livello
HW, integrata nel dispositivo stesso.
Esistono inoltre forme di chaching gestite dall'utente come i:
RAM disk: In cui utilizzo la RAM come disco fittizio (a tale scopo viene
creato un File System apparente in RAM ) sul quale mappo pi file.
File mapping: In cui tutto il file viene mappato in RAM e solo alla fine
verr salvato sul disco.
Esistono anche forme di chacing usate dal SO all'insaputa dell'utente, il quale pu sempre decidere di disabilitarle usando il SO in modalit
sincrona, usate per delle info di sistema poco critiche (metadati) e per i dati
utente.
6.3.2 Consistenza del file system
Una perdita dell'alimentazione quando una parte dei dati si trova in un qualunque livello di chache (che sono usualmente in RAM) pu causare gravi danni creando il problema della coerenza del file system (ridotto in quelli
transazionali perch tengono traccia delle operazioni svolte).
In caso di perdita dell'alimentazione in modo improvviso, il sistema in grado di accorgersene (non ho distrutto certe strutture dati, normalmente eliminte in fase di shutdown) e di avviare un controllo della coerenza del file system.
Un file system coerente quando un blocco o libero o occupato da un
solo file:
blocco li- blocco con
commenti
bero
file
1
coerente
coerente
>1
>0
>1
>1
L'unica operazione da fare nel caso che non sia coerente, quella di assegnare
il blocco ai liberi, con la conseguente perdita dei dati (in realt erano gi persi
perch non so pi a cosa si riferissero), tranne nel caso che ci sia il journal che
mi indica quale operazione stavo svolgendo su di essi prima di perdere l'alimentazione.
6.3.3 Struttura fisica del disco
Un hard disk in realt una pila di dischi a doppia faccia che girano solidalmente ad una certa velocit angolare indicata in RPM (Round Per Minute: giri
al minuto).
Ogni faccia ha una testina che lo legge, individuando cos delle superfici tridimensionali chiamate chiamate cilindri (vedi figura sottostante).
Ogni faccia divisa in tracce (serie di anelli concentrici), a loro volta divise in settori.
Tali strutture vengono di solito create o in fase di creazione del disco in fabbrica, o durante l'operazione di formattazione di basso livello, in cui si porta il
disco alle condizioni originali (si cancellano definitivamente tutti i dati).
L'operazione di seek corrisponde al posizionamento della testina sul cilindro
voluto, ed l'operazione pi lenta perch coinvolge diversi organi meccanici.
Oltre al tempo di posizionamento della testina, esistono altri fattori che allungano l'operazione di lettura (aumentano il tempo di accesso):
Latency time: tempo impiegato dalla testina a raggiungere il settore
voluto all'interno di una traccia.
Transmission time: tempo che occorre per leggere il settore voluto
(variabile perch dipende dalla posizione del disco dal momento che la testina in posizione sulla traccia, ed massimo se il settore cercato appena
passato, perch si deve aspettare un intero giro del disco per poter di nuovo
leggere le informazioni).
Per individuare la traccia cercata esistono sul disco informazioni che ne dichiarano la geometria. Queste informazioni sono generate dal costruttore
del disco o tramite l'operazione di formattazione a basso livello (si creano tracce e settori numerati).
Non detto che tutte le tracce abbiano lo stesso numero di settori (pi ci
sia allontana dal centro e pi aumenta il raggio della circonferenza che descrive la traccia) perch oggigiorno si preferisce avere settori tutti della
stessa capacit, inoltre non detto che i settori siano numerati in sequenza.
Ci viene fatto per aumentare le prestazioni del disco perch, nel caso che
sia stata letto il settore 1 e si abbia la richiesta di leggere anche il 2, se i
settori fossero numerati in modo sequenziale non si potrebbe avere abbastanza tempo per elaborare la richiesta e si dovrebbe aspettare che il disco
faccia un intero giro prima di potrebbe leggere il secondo settore (problema presente nei vecchi dischi senza buffer).
Numerando in modo non sequenziale invece si aspetta un tempo minore
perch il settore cercato un po pi in la dando al sistema il tempo per elaborare la richiesta (prende il nome di interleaving).
Nella figura sopra riportata, si evidenzia il fatto che nei vecchi dischi ogni
traccia aveva lo stesso numero di settori, con il problema che essi hanno
diversa capacit man mano che ci si sposta verso l'esterno (maggiori problemi nella scelta di dove posizionare il file).
Nonostante i raffinati processi di produzione moderni, resta comunque impossibile creare superfici perfette mentre si produce un hard disk (disco rigido o
HDD), i bad sector (settori danneggiati) sono praticamente inevitabili.
Per evitare che il sistema li impieghi per il salvataggio dei dati, vengono individuati durante la formattazione a basso livello e non vengono numerati.
Considerando i possibili danneggiamenti dovuti alla normale usura dei dispositivi, vengono creati dei blocchi in sovra numero, come "scorta", che verranno usati al posto dei danneggiati (la numerazione fissa vengono accodati), il SO in grado di individuare i blocchi danneggiati e ricordarli per evitare
di usarli e perdere cos i dati dei suoi utenti.
6.3.3 - Scheduling del disco
Dato che il tempo di accesso di un disco determinato in larga parte dal
tempo impiegato dalla testina per posizionarsi correttamente esistono degli algoritmi atti a ottimizzare al massimo lo spostamento della testina, in relazione alle richieste di lettura/scrittura.
FIFO: La testina legge i blocchi cos come gli arrivano dal sistema cen
7 - Protezione e Sicurezza
Un moderno SO deve garantire la protezione del sistema e la sua sicurezza.
Per protezione ci si riferisce alle regole e meccanismi per garantire la convivenza tra utenti (anche indesiderati) nel sistema (es utente A non pu eliminare per errore i dati di B), necessarie per evitare danni derivanti dalla distrazione (tento di far salvare i dati ad un programma dove non pu), male-
dual mode
protezione della memoria
protezione dei file
Spesso tali meccanismi non bastano ad impedire che un soggetto (a maggior ragione se fortemente motivato) possa eseguire operazioni non consentite. La politica basilare che si deve tenere presente quando si parla di protezione e sicurezza il principio del minimo privilegio, dove ad ogni entit ha accesso solo alle risorse a lui strettamente necessarie per svolgere le
sue attivit (non applicabile completamente sempre perch necessita della
conoscenza del futuro per stabilire quali risorse user l'utente nel tempo).
Inoltre esistono molteplici violazioni a questo principio, proprio a causa del
fatto che non si conosce con esattezza ci di cui l'utente avr bisogno in futuro (es utente Root nei sistemi UNIX, il quale pu svolgere qualsiasi operazione
sulla sua macchina).
Un metodo per attuare, almeno in parte questo principio quello di stabilire
delle regole che permettano o meno l'accesso alle risorse da parte dei soggetti.
Gli obbiettivi generali da seguire nell'implementare meccanismi di protezione
e sicurezza sono raggruppati nella CIA:
Confidentaly (C): Le informazioni devono essere disponibili solo a
utenti autorizzati (esempio il tema esame deve essere visto solo dal
professore prima della prova).
Integry (I): Le informazioni non vengono modificate da utenti non autorizzate (esempio lo studente che modifica il proprio voto nel sistema).
Avallability (A): Le informazioni devono essere sempre disponibili
quando serve (esempio i vecchi temi esami devono essere disponibili
agli studenti).
Si segue perci uno schema a tra fasi per autenticare il soggetto che vuole
usare la risorsa:
Identificazione: (fase di Login)
Autenticazione: Verifica dell'identit (ad esempio tramite password)
Autorizzazione: Racchiude sia le regole di accesso e sia le azioni vietate o permesse.
F1
D1
Read
F2
Stampante
print
D2
read
Write
execute
Tutto questo non solo un esercizio di geometria, ma i controlli dati dai due
metodi sono concettualmente diversi.
Un altro modo sono i bit mask: una maschera di bit che indicano se
l'oggetto ha, o meno, una certa lista di permessi. Alcuni di essi possono essere
uguali per qualunque oggetto, altri variano a seconda del tipo dell'oggetto.
7.6 L'autenticazione
Serve alla macchina per conoscere e verificare l'autenticit del soggetto
che vuole accedervi. Di solito un processo reciproco per evitare che
qualche malintenzionato possa rubare le credenziali di accesso attraverso
macchine civetta.
Gli strumenti di verifica sono di tre tipi, indicati con SY- (Something You):
SYHAVE (Own): hai o possiedi, come una chiavetta, un sigillo o
una carta
SYKNOW: qualcosa che tu conosci, come una password
SYKARE: Indica le caratteristiche biomediche di un soggetto (come
l'impronta digitale).
Nessuno di questi metodi da la certezza assoluta di non subire i furti di