Sei sulla pagina 1di 10

I Compendi OpenSource

di Giacomo Marciani

Teoria, Formulario e Suggerimenti Pratici

Sistemi Operativi

Processi

Un processo1 un'astrazione costruita dal sistema operativo per rappresentare un'istanza di programma2 in esecuzione : un programma diventa un processo quando il le eseguibile che lo contiene viene caricato in memoria3 . Il processo l'unit elementare di lavoro dei sistemi time-sharing, nei quali infatti le risorse sono concorrentemente commutate tra i vari processi. Un processo risiede in una zona di memoria strutturata come segue:

codice e dati heap

: sezione di testo e variabili globali.

: strutture di dati dinamiche.

librerie dinamiche

: variabili automatiche, indirizzi di rientro e dati temporanei del compilatore.


stack stack KM

In ogni istante ciascuna CPU esegue solo un processo: se nessun processo intende impegnarla, essa esegue idle task4 . Un generico processo alterna fasi UM e fasi KM 5 . Un job6 un insieme di processi che cooperano per svolgere un determinato compito. Un file eseguibile internamente organizzato in sezioni 7 e segmenti 8 , di modo da ottimizzare l'organizzazione della memoria associata al processo. 9 Executable and linkable format (ELF) il pi diuso formato di le eseguibile.
quindi pi processi possono eseguire uno stesso programma come sequenze di esecuzione distinte. 3 il processo un'entit attiva, mentre il programma un'entit passiva. 4 idle task un processo di sistema che impegna la CPU quando essa non impiegata da nessun altro processo. 5 ovvero User Mode e Kernel Mode. Solo i kernel threads vengono eseguiti esclusivamente in KM; non invece possibile creare processi eseguiti esclusivamente in UM. 6 termine derivato dai sistemi batch, nei quali il job era l'unit di lavoro. Nei sistemi operativi Unix il termine job viene utilizzato per indicare un gruppo di processi lanciati con lo stesso comando. 7 le sezioni sono porzioni di codice omogenee per contenuto. 8 i segmenti sono gruppi di sezioni che possono essere trattata identicamente in fase di caricamento. 9 le principali sezioni ELF sono: .text: .data: .bss: .rodata:
1 anche detto processo di elaborazione, o anche task. 2 istanza di programma perch di uno stesso programma possono essere eseguite pi istanze,

Caratterizzazione dei processi Un processo pu essere caratterizzato, in funzione del tipo di computazione : CPU-bound: processo a prevalenza di elaborazione, con poche operazioni di I/O.

: processo con prevalenza di I/O, con poche elaborazioni. Essendo dicile caratterizzare a priori un programma in questo modo, spesso un processo pu essere caratterizzato in base al tipo di interazione con l'utente : interactive process: interagisce costantemente con l'utente, e deve pertanto minimizzare i tempi di risposta.

I/O-bound

: job o processi lanciati in background, non necessit di un terminale di controllo.


batch process real-time process

: ha scadenze temporali stringenti e richiede estrema predicibilit di comportamento. L'esecuzione di un processo consiste in un ciclo in cui, no alla terminazione del processo, si alternano CPU burst10 e I/O burst11 , il quale comprende i tempi dovuti all'attesa del completamento delle operazioni di I/O. Il diagramma della durata del CPU burts descrive la curva di frequenza del CPU burst: una curva esponenziale o iperesponenziale, con poche lunghe sequenze e molte brevi sequenze. In generale, un programma CPU bound produce poche sequenze di elaborazione molto lunghe, mentre un programma I/O bound produce molte sequenze di elaborazione molto brevi.
PCB di un processo Il process control block (PCB)12 la struttura dati con cui ogni processo viene rappresentato nel kernel. Un processo necessita infatti di un insieme di strutture dati che ne descrivano lo stato di avanzamento, che contengano informazioni per la gestione della multiprogrammazione e che lo leghino ad un job e ad un proprietario. Il PCB contiene le seguenti informazioni: stato del processo13 : durante la sua esecuzione un processo soggetto a transizioni di stato, denite in parte dall'attivit corrente dello stesso, e sono:
10 ovvero uno stato di elaborazione in cui avvengono rache di operazioni di elaborazione svolte dalla CPU. 11 ovvero uno stato di elaborazione in cui avvengono rache di operazioni di I/O. 12 ovvero blocco di controllo del processo, anche detto task control block (TCB). In Linux l'header le include/linux/sched.h contiene la denizione della struttura struct task_struct del PCB. Nel kernel di Linux un generico processo identicato dal puntatore alla struttura task_struct., e il processo attualmente in esecuzione su ogni CPU individuato dal puntatore current. 13 anche detto stato di elaborazione, o anche stato di esecuzione. Le denizioni degli stati del processo variano in base al sistema operativo. il kernel di Linux, ad esempio, denisce i seguenti stati:  task_running: il processo eseguibile.  task_interruptible: in attesa di un evento di I/O, e pu essere interrotto.

: il processo stato creato, questo stato ne indica l'inizializzazione. esecuzione: un'unit di elaborazione esegue le istruzioni del processo.  attesa: il processo in attesa di un evento esterno.  pronto: il processo eseguibile, ma attualmente non in esecuzione.  terminato: il processo stato terminato, o in fase di cancellazione.
 
nuovo

Il diagramma di transizione degli stati mostra i possibili ussi di transizione di un processo da uno stato all'altro.

contatore di programma

eguire per il processo.


registri di CPU

: indirizzo della successiva istruzione da es-

: contenuto dei registri. : parametri di scheduling come la priorit del pro: valori dei registri di base e registri di limite,

scheduling di CPU

cesso e i puntatori alle code di scheduling. page table o segment table.


stato I/O:

gestione della memoria

lista dei dispositivi I/O assegnati al processo, e dei le aperti.

contabilizzazione delle risorse

Code di scheduling Una coda di scheduling una struttura dati dinamica del kernel, che elenca tutti i processi del sistema, e consiste generalmente in una lista concatenata di PCB. Ne esistono diverse: ready queue14 : contiene tutti i processi pronti, ovvero ogni processo, nuovo o gi esistente, presente in memoria centrale in attesa di di acquisire nuovamente la CPU. Generalmente realizzata da una lista concatenata con un'intestazione che punta al primo e all'ultimo PCB della coda.

ciascun dispositivo associato ad una coda di processi in attesa che si completino operazioni di I/O.
I/O queue

15 :

contenente i processi in attesa che la risorsa diventi disponibile. La terminazione di un processo porta al suo allontanamento da tutte le cose di scheduling, alla rimozione del suo PCB e alla restituzione delle risorse.
   

: coda realizzata da una primitiva di sincronizzazione ; ad esempio, un semaforo associato con una coda
coda primitiva di sincronizzazione

task_uninterruptible: in attesa di un evento di I/O, e non pu essere interrotto. task_stopped: il processo stato bloccato da un utente o dalla shell. exit_zombie: il processo stato terminato, e i suoi dati sono stati conservati per il
processo genitore genitore. exit_dead: il processo stato terminato, o in fase di cancellazione. detta coda dei processi pronti. detta coda del dispositivo.

14 anche 15 anche

Scheduler Lo scheduler dei processi il componente del sistema operativo che seleziona in ogni istante il processo da eseguire fra quelli disponibili nelle code di scheduling. Vi sono tre tipologie di scheduler, che si dierenziano principalmente per frequenza di invocazione ed obiettivi dello scheduling :

seleziona i programmi eseguibili tra quelli in memoria secondaria e li carica in memoria primaria17 , determinando cos il grado di multiprogrammazione del sistema, e ottimizzando la combinazione di CPU-bound e I/O-bound. Ha origine nei sistemi batch.
scheduler a lungo termine scheduler a breve termine

16 :

seleziona il processo da eseguire tra quelli caricati in memoria e presenti nella ready queue. Ha origine nei sistemi a partizione di tempo.
scheduler a medio termine

18 :

: si occupa del processo di swapping 19 , ovvero di processi dalla memoria primaria per ridurre il livello di multiprogrammazione, ottimizzare la combinazione dei processi e liberare pagine di memoria primaria per i processi restanti. E' tipicamente presente nei sistemi a partizione di tempo. eliminare20

Il diagramma di accodamento descrive lo scheduling dei processi, ovvero il loro intercalamento all'interno delle code di scheduling. Un nuovo processo si colloca inizialmente nella ready queue, dove attende di essere selezionato21 dallo scheduler. Posto nello stato di esecuzione, il processo esegue una delle seguenti operazioni no alla sua terminazione:
emettere una richiesta di I/O, quindi essere immesso in una I/O queue. creare un nuovo processo e attenderne la terminazione. essere terminato a causa di una interruzione, e posto nella ready queue.

Context e context switch Il context22 di un processo l'insieme delle informazioni che devono essere salvate in memoria dal sistema operativo all'occorrenza di un cambio di processo. Esso rappresentato all'interno del PCB del processo, ed denito dallo stato del processo, dal contenuto dei registri della CPU
degli eseguibili tra memoria secondaria e memoria primaria detto spooling. 18 anche detto scheduler di CPU, o pi semplicemente scheduler. 19 anche detto processo di avvicendamento dei processi in memoria, o pi semplicemente avvicendamento. 20 in alcuni sistemi operativi lo scheduler a medio termine elimina un intero processo dalla memoria primaria salvandolo in quella secondaria. Nei sistemi operativi moderni con paging della memoria possibile eliminare una frazione di un processo, ovvero quelle le pagine non immediatamente necessarie per l'esecuzione. 21 un processo selezionato dalla ready queue viene detto dispatched process. 22 ovvero il contesto.
16 anche detto job scheduler. 17 la procedura di trasferimento

e dall'indirizzo della page table del processo. Il contesto di un processo viene solitamente salvato nello stack KM 23 e/o in opportuni campi del PCB 24 . Il context switch25 la procedura che permette la commutazione della CPU da un processo all'altro attraverso il salvataggio di stato ed un eventuale successivo ripristino di stato, per poter riprendere l'elaborazione al punto in cui era stata interrotta. Generalmente questa procedura provoca un calo prestazionale 26 , in quanto il sistema esegue solo operazioni volte alla corretta gestione dei processi e non alla computazione. 1. Il processo A in esecuzione su una CPU. 2. Si verica una IRQ. 3. Il gestore dell'interruzione salva il contenuto di alcuni registri della CPU nello stack KM del processo A. 4. Viene eseguita la ISR (Interrupt Service Routine) dell'interruzione. 5. Prima di ripristinare l'esecuzione del processo A interrotto si controlla se A deve essere sostituito. 6. In questo caso, si invoca lo scheduler a breve termine per scegliere un nuovo processo B da eseguire sulla CPU. 7. Si salva la porzione del contesto del processo A che non era stata salvata sullo stack (tipicamente nel PCB). 8. Si ripristina la stessa porzione di contesto dal PCB del processo B. 9. Si ripristina il contenuto dei registri della CPU salvati sullo stack KM del processo B. 10. Si conclude l'esecuzione del gestore dell'interruzione. 11. Si riprende l'esecuzione del processo B.
Creazione di un processo Durante la propria esecuzione un processo pu creare nuovi processi: il processo creante si chiama processo padre27 , mentre ogni nuovo processo detto processo figlio; tra il primo e questi sussiste una relazione gerarchica. Queste creazioni formano l'albero dei processi. Ogni processo identicato univocamente dal proprio PID 28 , e se glio memorizza
23 ovvero lo stack Kernel Mode. 24 quindi il contesto di un processo 25 ovvero il cambio di contesto. 26 l'intensit del calo prestazionale

non coincide con il suo PCB.

dipende dall'architettura: per esempio, alcune CPU offrono pi gruppi di registri, quindi il context switch consiste nella semplice modica di un puntatore al gruppo di registri corrente (naturalmente se il numero di processi eccede il numero di gruppi di registri il sistema si appoggia alla memoria). 27 anche detto processo genitore. 28 ovvero process identier.

anche il PPID, ovvero il PID del padre. Un processo glio pu ottenere le proprie risorse direttamente dal sistema operativo, oppure essere vincolato ad un sottoinsieme di risorse del processo genitore, il quale pu decidere di spartirle tutte tra i processi gli oppure condividerne solo alcune29 . Quando un processo ne crea uno nuovo, pu continuare l'esecuzione concorrentemente con i propri gli, oppure attenderne la terminazione30 . Il processo glio pu essere un duplicato del processo genitore, oppure eseguire un nuovo programma. Esistono dunque due tipologie di creazione di un processo, realizzate dalle seguenti chiamate di sistema:
fork(): crea un nuovo processo duplicando lo spazio privato del processo

genitore31 .

execve()32 : crea un nuovo processo eseguendo il programma indicato,

quasi tutte le informazioni relative al processo chiamante vengono perse33 .

Terminazione di un processo Un processo termina spontaneamente quando ha nito la sua esecuzione e inoltrato al sistema operativo la richiesta di essere cancellato tramite la chiamata di sistema exit(); pu anche terminare per mano di un antenato, se questi ne ha inoltrato la richiesta. Un glio che termini pu trasmettere alcuni dati al padre, se questi lo ha richiesto tramite la chiamata di sistema wait(). Se un processo termina, tutti i suoi gli possono essere adottati dal processo init, che antenato di tutti i processi, oppure terminati per mano del sistema operativo tramite la terminazione a cascata. Comunicazione tra processi Un processo indipendente non inuisce su altri processi, n ne subisce l'inusso. Un processo cooperante pu inuenzare altri processi, o esserne inuenzato. L'interprocess communication
ad esempio: PID e PPID dierenti, statistiche d'utilizzo azzerate, il glio non eredita i meccanismi di noticazione asincrona. 32 i sistemi operativi Unix deniscono diverse API per caricare in memoria ed eseguire un nuovo programma. Queste API dieriscono per:  modalit di ricerca del le eseguibile.  modalit di codica degli argomenti.  modalit di impostazione dell'ambiente di esecuzione. execve() path vettore esplicito execle() path lista esplicito execlp() nome+path lista implicito execvp() nome+path vettore implicito execv() path vettore implicito execl() path lista implicito 33 fanno eccezione i le aperti e i segnali ignorati.
29 evitando cos che un processo sovraccarichi il sistema creando troppi 30 di alcuni o tutti i suoi processi gli 31 il processo glio si distingue dal processo padre per alcuni dettagli,

sottoprocessi.

API

ricerca

argomenti ambiente

il meccanismo che permette a processi cooperanti di scambiarsi dati e informazioni. Esistono due modelli di comunicazione tra processi:
(IPC)

34

memoria condivisa: i processi cooperanti allocano una zona di memoria condivisa, di solito residente nello spazio di indirizzamento del processo che la alloca; gli altri processi dovranno annetterla al loro spazio di indirizzamento. Normalmente il sistema operativo impedisce ad un processo di accedere alla memoria di altri processi, per questo i processi cooperanti devono raggiungere un accordo di sincronizzazione degli accessi, tale da superare questo limite. I processi sono responsabili del tipo di dati, della loro collocazione e di non scrivere simultaneamente nella stessa locazione, necessaria dunque una qualche forma di sincronizzazione tra processi. Il problema del produttore/consumatore 35 rappresenta per antonomasia l'IPC a memoria condivisa.

: i processi cooperanti comunicano scambiandosi messaggi di lunghezza ssa o variabile, senza bisogno di condividere lo stesso spazio di indirizzamento36 , ma semplicemente stabilendo un communication link, della cui natura logica esaminiamo ora tre aspetti:
scambio di messaggi

: per comunicare, i processi devono poter fare riferimenti nominali di invio e ricezione. comunicazione diretta: due processi comunicano direttamente conoscendo la reciproca identit. Ogni processo che intenda comunicare deve dunque nominare esplicitamente il ricevente o il trasmittente della comunicazione. Esistono due varianti di questo modello: simmetria dell'indirizzamento: il trasmittente e il ricevente devono nominarsi reciprocamente. asimmetria dell'indirizzamento: soltanto il trasmittente nomina il ricevente, mentre il ricevente non deve nominare il trasmittente.
nominazione

consiste in un processo produttore che produce informazioni consumate da un processo consumatore. Esso evidenzia il meccanismo di cooperazione concorrente : l'esecuzione concorrente di due processi cooperanti produttore/consumatore, prevede la presenza di un buffer condiviso all'interno della memoria condivisa. Esso pu essere di due tipi a seconda dei limiti alla dimensione: buer illimitato o buer limitato. Esso realizzato come un array circolare con due puntatori logici: inserisci, che indica la successiva posizione libera nel buer, e preleva, che indica la prima posizione piena nel buer. Quindi il buer condiviso vuoto se inserisci == preleva, pieno se ((inserisci + 1). I due processi saranno cos sincronizzati di modo che il processo consumatore non tenti di consumare un'unit non ancora prodotta dal processo produttore. Il codice per la realizzazione e la gestione della memoria condivisa deve essere scritto esplicitamente dal programmatore dell'applicazione. 36 questo aspetto rende utile questa IPC nel caso di sistemi distribuiti, dove i processi possono risiedere su macchine dierenti connesse da una rete.

34 ovvero comunicazione tra processi. 35 il problema del produttore/consumatore

Questo modello presenta una bassa modularit, e generalmente a tali cablature di informazioni nel codice37 sono preferite soluzioni indirette o parametriche. comunicazione indiretta: i processi comunicano attraverso delle porte38 , ovvero oggetti astratti univocamente identicati, in cui i processi possono introdurre e prelevare messaggi. Due processi possono comunicare solo se condividono una stessa porta. Una porta pu essere associata a due o pi processi, e tra ogni coppia di processi comunicanti possono esserci pi canali dierenti, ciascuno corrispondente ad una porta. Quando pi processi sono in ricezione su una stessa porta, si pu fare in modo che la ricezione sia consentita ad un solo processo alla volta, o si pu demandare al sistema operativo la selezione del ricevente39 . Una porta pu appartenere al processo o al sistema. Se si tratta di una porta appartenente al processo, risiede nel suo spazio di indirizzamento e il processo pu soltanto ricevere da quella porta. La terminazione del processo proprietario induce la terminazione della porta, e i processi trasmettenti devono esserne informati. Se si tratta di una porta appartenente al sistema, essa indipendente e non legata ad alcun processo particolare: il processo che crei la porta inizialmente l'unico a poter ricevere tramite di essa, ma i privilegi di ricezione/trasmissione possono essere modicati tramite opportune chiamate di sistema.  sincronizzazione: i processi possono attendere o meno l'esito della comunicazione. comunicazione sincrona40 : il processo trasmittente si blocca nell'attesa che il processo ricevente, o la porta, riceva il messaggio (invio sincrono ), e/o il processo ricevente si blocca nell'attesa dell'arrivo di un messaggio (ricezione sincrona). In caso di invio e ricezione bloccante si parla di rendez-vous. comunicazione asincrona41 : il processo trasmittente invia il messaggio e prosegue la propria esecuzione (invio asincrono ), e/o il processo ricevente riceve un messaggio valido oppure un valore nullo (ricezione asincrona).  code di messaggi: i messaggi scambiati tra processi comunicanti risiedono in code temporanee. Vi sono due possibili realizzazioni di queste code: no-buffering queue42 : il canale non pu avere messaggi in
denire un algoritmo di selezione e comunicare l'identit del ricevente al trasmittente. 40 anche detta comunicazione bloccante. 41 anche detta comunicazione non bloccante. 42 parliamo in questo caso di scambio di messaggi senza memorizzazione transitoria, o pi semplicemente code a capacit zero.
37 anche dette hard coding. 38 anche dette mail boxes. 39 il sistema operativo pu

attesa al suo interno, il trasmittente deve dunque fermarsi nch il ricevente prenda in consegna il messaggio. automatic buffering queue43 : il canale pu avere un numero limitato44 o illimitato45 di messaggi in coda, dei quali mantiene una copia oppure un puntatore al messaggio.

accessibili tramite comuni le descriptor; si pu dunque operarvi tramite le chiamate di sistema read() e write().

pipe nominale

canale di comunicazione process persistent unidirezionale half-duplex byte-oriented di tipo produttore-consumatore realizzabile tra padre e glio, le cui estremit read-end e write-end sono
pipe convenzionale

46 :

: variante della pipe convenzionale, kernel persistent bidirezionale realizzabile tra qualsiasi processo.

in questo caso di scambio di messaggi con memorizzazione transitoria automatica, o pi semplicemente code a capacit limitata/illimitata. 44 parliamo in questo caso di coda di messaggi a capacit limitata. 45 parliamo in questo caso di coda di messaggi a capacit illimitata. 46 anche dette pipe anonima.

43 parliamo

10