|
Appunti informatica |
|
Visite: 1035 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Cronologia dei processori intelCronologia dei processori intel Non tutti sanno che uno dei primi processori, Uso di asimUso di ASIM 1.1 I WikipediaWikipedia 2.1 Le origini Wikipedia, la più grande enciclopedia |
Processi e Multiprocessing
Un algoritmo è una sequenza di passi finalizzata alla soluzione di un problema. Un programma è la descrizione di un algoritmo in un linguaggio che ne rende possibile l'esecuzione da parte di un processore. Un processo è un sequenza di istruzioni (eventi) eseguite da un processore nell'ambito dell'esecuzione di un programma. Più specificamente per processo si intende una istanza di un programma in esecuzione in modo sequenziale, ovvero un programma di cui ne sia stata eseguita almeno una istruzione e che non sia ancora terminato. Ricorsivamente, un processo può essere definito come una attività (svolta chiaramente da un processore) controllata da un programma, e può quindi identificare non solo un programma nella sua interezza ma anche una sua parte. A titolo di esempio si consideri il programma in codice pascal-like che effettua 3 operazioni in sequenza su ciascun elemento di tipo T di un array a cardinalità N
var buffer : T;
i : 1N;
begin
for i:=1 to N do begin
Lettura(buffer);
Elaborazione(buffer);
Scrittura(buffer);
end;
end.
Se le operazioni di Lettura, Elaborazione e Scrittura vanno eseguite in stretta sequenzialità allora processo è sinonimo di intero programma, viceversa se esse possono essere eseguite ad un qualche livello anche minimo di parallelismo allora ciascuna di esse può costituire un processo distinto che collabora con gli altri fino al raggiungimento del risultato finale: il programma che ne deriva implementa un algoritmo concorrente.
Un SO che supporta il Multitasking (o Multiprocessing) consente di eseguire più processi in modo parallelo: questo significa che (a maggior ragione su una macchina monoprocessore) non è detto che ad ogni colpo di clock la CPU esegua un'istruzione di uno specifico processo fino al suo completamente, ma anzi al contrario la sua esecuzione può essere interrotta in ogni momento e successivamente ripresa, in modo da garantire l'esecuzione parallela di più processi distinti. Le strategie messe in atto del SO per l'avvicendamento tra processi (in seguito definito cambio di contesto) vengono intraprese da un componente del SO detto Scheduler, che invia le sue decisioni ad un altro modulo del SO detto Dispatcher, vero artefice del cambio di contesto: a seconda dell'algoritmo di Scheduling utilizzato, lo Scheduler ripartisce il tempo della CPU tra tutti i processi attivi. Possiamo avere il Multitasking Cooperativo o Senza Prelazione in cui ogni processo mantiene il controllo della CPU finchè non termina o la rilascia spontaneamente, e il Multitasking Non Cooperativo o Con Prelazione in cui il SO ha facoltà di sospendere il processo per cedere la CPU ad altro processo. Un SO Monotasking (come l'MS-DOS) ha chiaramente la capacità di eseguire un singolo processo per volta.
Ogni volta che nel SO viene generato un nuovo processo, viene allocata un'area dati denominata descrittore del processo o Process Control Block (PCB), in pratica un record nei cui campi vengono salvati tutti i dati strettamente necessari al controllo del processo da parte del SO: PID (Process Identifier o Process Handle, l'identificatore univoco del processo), Puntatori al processo padre e ad eventuali processi figli, PC (Program Counter o Instruction Pointer, il puntatore alla prossima istruzione del processo da eseguire nel ciclo fetch-execute) e posizione del Segmento di Codice, Identificatore della CPU su cui il processo è in esecuzione e suoi Registri di Stato, Informazioni di Accounting del processo e sua Priorità, Informazioni per il Memory Management del processo (in particolare memoria virtuale), Informazioni per lo Scheduling del processo (in particolare tempo di esecuzione e attesa accumulato), Descrittori delle Risorse in uso (file, periferiche, ) e informazioni sullo Stato di I/O del processo, valori delle variabili globali del processo, dello stack e dei registri del processore accessibili dal processo stesso. Tutto il contenuto del PCB costituisce il cosiddetto Stato Puntuale del processo, che viene salvato nel PCB ad ogni interruzione e ripristinato dal PCB ad ogni ripresa di attività del singolo processo: si parla di Context Switch, ovvero di cambiamento di contesto, nel senso che con l'avvicendamento di un processo ad un altro cambia il contesto cui le informazioni memorizzate nei registri della CPU si riferiscono
Procedure Context_Switch;
begin
Salvataggio_Stato; Scheduling_CPU; Ripristino_Stato;
end;
Il cosiddetto Stato Globale del processo, che può essere anch'esso memorizzato esplicitamente nel PCB (ma più spesso è implicito come vedremo), è rappresentato invece dallo stato di avanzamento del processo legato alla sua capacità di evolvere, che può essere uno tra cinque: un processo di cui è stato appena creato il PCB, del quale non sia stata ancora eseguita alcuna istruzione e che sia in attesa che il SO gli assegni le risorse necessarie per poter iniziare l'esecuzione, si trova nello stato New; una volta che l'assegnazione delle risorse sia avvenuta il processo passa nello stato Ready, una cosiddetta attesa passiva nella quale il processo attende che la CPU esegua le sue istruzioni (tale condizione manca se ci sono tante CPU quanti processi attivi); quando lo Scheduler ha assegnato la CPU al processo lo stato diventa Running, ovvero va in esecuzione; dallo stato Running il processo transita direttamente nello stato Ready laddove perda forzatamente l'uso della CPU (si parla di prerilascio), tipicamente per eccesso di utilizzo continuativo, oppure può transitare nello stato Waiting, a seguito di una chiamata ad una primitiva del SO: vuole sincronizzarsi con altri processi e deve attendere, ha richiesto una risorsa al SO e questa non è ancora disponibile oppure ha lanciato un'operazione di I/O e deve aspettare che questa sia completata (quando ciascuno di questi 3 possibili eventi si è verificato il processo transita dallo stato Waiting allo stato Ready); l'ultima istruzione utile eseguita da un processo è la chiamata alla primitiva del SO di terminazione, con la quale il processo entra nello stato Terminated in attesa che le risorse sotto il suo controllo siano recuperate dal SO (terminato il processo, chiaramente anche il PCB viene rimosso).
L'allocazione del PCB è rigorosamente statica all'interno del Kernel, e quindi il numero di PCB massimo che è possibile allocare è limitato (viceversa, la primitiva del Kernel che si occupa di generare il processo e il suo PCB dovrebbe richiamare una primitiva di livello inferiore che allochi la memoria questo comporta, nei fatti, che il livello 6 stia sotto il livello 7 e benchè ciò sia teoricamente possibile nella pratica non accade mai); inoltre, i PCB sono elencati in una struttura chiamata Process Table e tipicamente linkati tra loro in code costituite da liste a puntatori, secondo il criterio per cui PCB caratterizzati dallo stesso Stato Globale appartengono alla stessa coda (più code distinte possono esistere per processi parimenti Waiting a seconda dell'evento/risorsa per cui sono in attesa, e implicitamente un PCB in coda segnala che quel processo non è Running).
Appunti su: |
|