vuoi
o PayPal
tutte le volte che vuoi
(N.B.
quando c’è stata una richiesta di input/output e il processo attende la
∼ Attesa, risposta della periferica
quando il processo ha completato le operazioni e può essere
∼ Terminazione, rimosso dalla RAM
Il passaggio da uno stato ad un altro avviene attraverso l’invio di un segnale elettrico
alla CPU (segnale di interrupt); un particolare processo (interrupt si occupa
handler)
della gestione di queste interruzioni salvando lo stato corrente del processo che era
in esecuzione, sulla memoria RAM e indicando alla CPU quale sarà il prossimo.
Le interruzioni possono essere:
Asincrone
Sono generate solo dall’hardware e segnalano alla CPU eventi non correlati al
suo orologio interno (clock di sistema) (es. fine di una stampa, fine di una
scrittura su disco) Enrico Siboni 5
Sincrone
Generate dall’hardware: segnalano eventi accaduti in relazione all’orologio
interno, ma non previste dalle istruzioni del processo (es. fine del tempo
massimo di permanenza in esecuzione del processo)
Generate dal software: sono interruzioni previste dal processo per accedere a
funzioni particolari (es. richiesta di I/O)
Nell’ambito della multiprogrammazione il tempo della CPU deve essere suddiviso tra i
processi da eseguire, in modo da far credere all’utente che le proprie applicazioni
siano eseguite tutte contemporaneamente. Si dice quindi che il processore è gestito
dal SO in cioè suddividendo il tempo CPU in fette (time da
time sharing, slices)
assegnare ad ogni processo, che non può restare in esecuzione per più di quel tempo
prestabilito.
Quando il programmatore di SO decide la durata del time slice, non deve assegnarne
né una troppo lunga, perché l’utente vedrebbe le proprie applicazioni procedere a
scatti, né una troppo corta, perché si sprecherebbe troppo tempo CPU a causa dei
continui riassegnamenti dei processi; inoltre deve anche essere considerata la
velocità del processore dei dispositivi su cui il SO sarà installato.
Il processo che si occupa di assegnare gli altri processi da eseguire alla CPU
(scheduler) mette in atto le cosiddette “politiche di scheduling”, cioè politiche di
scelta. Fra esse la più semplice è il round robin, che consiste nel mettere in una coda
FIFO i processi pronti all’esecuzione. Raffinando questa tecnica si può implementare
la possibilità di distinguere i processi con differenti priorità di esecuzione (alta,
normale, bassa).
I processi a priorità più elevata possono essere favoriti in diversi modi:
Assegnando loro time slices più lunghi
∼ Scegliendoli più spesso dalla coda
∼
Un altro metodo per favorire la priorità elevata è utilizzare il meccanismo della
(prelazione): quando un processo a bassa priorità è in esecuzione e un
preemption
processo a priorità più alta torna da un’operazione di I/O, il primo processo viene
interrotto per lasciare immediatamente il posto al secondo.
Per ottimizzare l’utilizzo del tempo CPU si può ricorrere all’esecuzione parallela di
parti di processi suddividendoli quindi in più che sono una sequenza di
thread,
istruzioni in corso di esecuzione. In un ambiente multithread, mentre uno o più
thread sono in attesa di una risorsa, gli altri possono continuare nella loro esecuzione
in modo da accorciare il tempo finale di esecuzione dell’intero processo; inoltre un
altro vantaggio è che i thread che ne fanno parte possono condividere le informazioni
riservate, cosa che non è possibile tra processi diversi.
Enrico Siboni 6
Il SO deve anche gestire le interferenze tra i processi, evitando perdite di dati e
garantendo la protezione delle rispettive aree di lavoro. Se quindi abbiamo un
processo che sta eseguendo operazioni su un file, il SO lo renderà non disponibile per
altri processi, fino a che l’operazione del primo non è terminata: si dice che agisce
come un “semaforo”.
Altre situazioni che il SO deve evitare sono:
Starvation (inedia): quando uno o più processi non riescono ad accedere a una
risorsa da molto tempo (ad es. lo scheduler non li sceglie perché ci sono sempre
processi con priorità più alta), il SO deve intervenire concedendo l’accesso
Deadlock (punto morto): quando si crea una situazione nella quale i processi
sono in attesa di una condizione che non si verificherà mai.
V. Gestione RAM
(memoria volatile) è il componente hardware che contiene il SO, caricatovi in
La RAM
fase di avvio, e tutti i processi che sono stati lanciati dall’utente durante l’utilizzo del
dispositivo e ancora non terminati.
Il SO viene caricato in RAM dalla ROM (Read Only Memory), che è una memoria non
volatile, attraverso il procedimento di che consiste nell’esecuzione dell’IPL
bootstrap,
(Initial Program Loader), il quale ha il compito di assumere il controllo della CPU e di
caricare il resto del SO.
La gestione della memoria può avvenire con diversi criteri:
Considerando di caricare interamente il processo in RAM
Metodo a partizioni fisse: la memoria viene suddivisa in blocchi fissi (limitando
quindi anche il numero di applicazioni che si possono lanciare) e i processi
occupano tutto un blocco, anche se sarebbe sufficiente uno spazio inferiore;
questo genera ovviamente molti sprechi
Metodo a partizioni variabili: i processi sono caricati in memoria per la
dimensione effettiva che occupano, fino a saturazione della RAM; questo
metodo è migliore del precedente, però c’è il problema che quando un
processo è scaricato dalla memoria lascia uno spazio che varia ogni volta in
base alla sua dimensione e quindi i processi che potranno andare ad occupare
quello spazio, dovranno essere di dimensioni minori o uguali a quella; ne
consegue che si creeranno a lungo andare piccoli spazi inutilizzati, i quali
porteranno ad una saturazione più veloce rispetto alle reali capacità della RAM
Considerando di caricare in RAM solo la parte di processo utilizzata
Metodo della Paginazione: ogni processo viene considerato suddiviso in
pagine logiche di uguali dimensioni e la memoria viene suddivisa in pagine
fisiche sempre delle stesse dimensioni. Quando deve essere eseguita una
Enrico Siboni 7
istruzione si controlla se la pagina logica che la contiene è già in memoria,
altrimenti viene caricata, mentre quando la memoria è satura, il SO scarica la
pagina logica usata meno di recente e carica quella richiesta. Il difetto di
questo metodo è che la suddivisione in pagine logiche avviene in modo
arbitrario dal SO (quindi senza considerare se ad esempio una istruzione inizia
alla fine di una pagina e finisce all’inizio di un’altra, comportando la
compresenza di quelle pagine in memoria, quando la suddetta funzione viene
richiamata)
Metodo della segmentazione: con questo metodo viene risolto il problema
principale della paginazione, in quanto la suddivisione di ogni processo ora
avviene in segmenti di lunghezza variabile stabilita dal programmatore; con
questo metodo si ripresenta il problema della frammentazione della memoria,
che può però essere risolto mediante l’introduzione di routine che compattino
le aree di memoria libere (garbage collection)
VI. Gestione Memoria di Massa e Files
Le memorie di massa sono i dispositivi hardware che consentono la memorizzazione
di qualsiasi tipo di dato.
Tutto ciò che viene registrato su memoria di massa prende il nome di (es. testo,
file
applicazione, immagine, filmato, suono, ecc.).
Il è un meccanismo con il quale i file sono posizionati e organizzati sulla
file system
memoria di massa. Questo consente all’utente, e in particolare al programmatore, di
riferirsi ai file attraverso nomi simbolici di identificazione, senza preoccuparsi degli
aspetti riguardanti la gestione del supporto di memoria di massa, o della
registrazione fisica dei dati sul supporto.
La struttura del file system, nei SO più diffusi come Windows e Linux, è ad albero;
abbiamo una directory (cartella) di livello più elevato di tutte le altre, chiamata root
(radice), che è da considerarsi la cartella delle cartelle, in quanto le contiene tutte; la
struttura ad albero risulta poi composta da nodi non terminali (directory) e da nodi
terminali (foglie) che sono i file veri e propri.
Per individuare un file in modo assoluto all’interno della memoria di massa si deve
indicare il suo che consiste nel cammino che si deve fare partendo dalla
pathname,
root fino ad arrivare al file.
VII. Interprete dei comandi
L’interprete dei comandi (o è la parte del sistema operativo più vicina
shell)
all’utente, ed è quel programma che rende possibile l’interazione tra l’utilizzatore,
molto spesso non esperto di informatica, e il dispositivo.
Enrico Siboni 8
Le prime shell erano testuali, e quindi non proprio semplici da utilizzare, ma con
molto più
l’introduzione di icone, finestre e puntatori si è passati alle shell grafiche,
intuitive per i principianti.
Ancora più recentemente, con la tecnologia touch, si sono potuti sostituire i
puntatori con le dita, portando un’ulteriore semplificazione nell’uso e una maggiore
intuitività.
4 – Differenze tra i principali SO mobili
Con le potenzialità offerte dall’hardware dei dispositivi sul mercato, la scelta di un
sistema operativo rispetto ad un altro può comportare differenze significative. Per
questo motivo, nella decisione dell’acquisto, gli utenti cominciano sempre più a
considerare non solo l’estetica e il budget a disposizione, ma anche il sistema
operativo più congeniale, a seconda dell’uso che pensano di doverne fare.
I principali sistemi operativi mobili sono:
Apple iOS
Android
BlackBerry OS
Windows Phone
Symbian OS
Apple iOS
iOS è il sistema operativo sviluppato da Apple per iPhone, iPad e iPod touch. Grazie
allo schermo interamente touch screen, il successo sul mercato è stato immediato. Si
tratta di un sistema veloce, stabile e facile da utilizzare. L’unico “svantaggio” si trova
nei limiti di personalizzazione, in quanto si tratta di un sistema operativo piuttosto
chiuso: la prima versione, infatti, non supportava l’installazione di applicazione di
terze parti, a favore però di una maggiore sicurezza. Questa lacuna fu colmata nella
versione successiva con la creazione dell’App Store, un “negozio virtuale” di
applicazioni realizzate da sviluppatori indipendenti da Apple. Con più di 500.000 app
di ogni