CAPITOLO 8 - Modelli di Processo SISTEMI MULTIPROGRAMMATI La Progettazione di un sistema operativo multiprogrammato, sia che ci si riferisca ad una macchina a singolo utente, come Windows 95, Windows 98 o 2000 oppure Professional come Windows XP, sia che ci si riferisca ad un sistema per main frame come OS/390, ruota intorno al concetto base di Processo. SINTESI STATI dei processi STRUTTURE DATI dei processi In questa slide sono riportati i due aspetti fondamentali di un processo affrontati e discussi in questo capitolo, sono gli stati dei processi e le strutture dati di processi. SCOPI DELLA PROGETTAZIONE DI UN S.O. Interallacciare l’esecuzione dei processi - massimizzando l’uso del processore Allocare le risorse ai processi - consentendo l’uso efficiente delle stesse Supportare la comunicazione fra processi consentendo: - lo scambio di informazioni - la creazione / terminazione evitando: - lo stallo Gli scopi fondamentali della progettazione di un sistema operativo sono quelli di interallacciare l’esecuzione dei processi al fine di massimizzare l’uso del processore, di allocare le diverse risorse, di consentire la comunicazione tra processi consentendo lo scambio di informazioni nonché ovviamente la creazione e la terminazione dei processi. DESCRIZIONE E CONTROLLO DEI PROCESSI Vediamo ora la descrizione e il controllo dei processi. Nella prossima slide si presenta prima il concetto di processo, quindi cosa è una traccia e subito dopo in cosa consiste l’interallacciamento di più tracce. DESCRIZIONE DEI PROCESSI Un PROCESSO O TASK è: l’esecuzione di una sequenza di istruzioni all’interno di un programma. Una TRACCIA è: la sequenza di istruzioni eseguite in un programma Una TRACCIA INTERALLACCIATA è l’insieme delle varie tracce concatenate Un Processo è una sequenza di istruzioni eseguite all’interno di un programma. La descrizione delle istruzioni così come vengono eseguite dalla macchina costituiscono la traccia di un processo, mentre la concatenazione di più tracce relative a processi distinti danno luogo ad una traccia interallacciata. ESEMPIO DI MULTITASKING (TIMESHARING) Questa slide rappresenta la memoria principale (main memory) ed il solo program counter (PC) di un computer. In memoria principale sono memorizzati tre programmi A, B e C con qualcosa in più (sono le strutture dati associate ai tre programmi) che trasformano questi programmi in processi. Il programma A è memorizzato a partire dalla locazione a (alfa), il programma B dalla locazione b (beta) ed il programma C a partire dalla locazione g (gamma). Il PC punta alla prima istruzione del programma B, e ciò segnala che è in running quel processo. Sempre in memoria principale è allocato, all’inizio della memoria a partire dalla locazione d (delta), un programma denominato dispatcher, è quello che si occupa di mandare a turno in running i tre processi A, B e C. Invero il dispatcher che è una parte del sistema operativo è così allocato e richiama l’attenzione che solitamente la prima parte della memoria è riservata al contenimento del sistema operativo o almeno una parete di esso atteso che non è conveniente tenere tutto il sistema operativo in memoria principale. Per meglio spiegare il funzionamento del sistema, nelle prossime slides saranno presentate tre esemplificazioni dei processi A, B e C con l’interallacciamento delle rispettive tracce. TRACCE DI PROCESSI Si può notare che il processo A ha una traccia di 12 istruzioni, il processo B una traccia di 4 istruzioni ed il processo C una traccia di 12 istruzioni. Le tracce sono relative alle esecuzioni delle istruzioni contenute nelle locazioni con indirizzo ottenuto dalla somma del valore dell’indirizzo di base di ciascun programma con l’aggiunta dell’indirizzo relativo all’interno del programma. (DAL PUNTO DI VISTA DEL PROCESSORE RISULTA:) TRACCE COMBINATE DEI PROCESSI Supponendo che il dispatcher esegua l’operazione di selezione e messa in running del prossimo processo in soli 6 cicli di macchina, questa slide mostra le tracce concatenate dei processi A, B e C con quella del dispatcher ogni qual volta che lo stesso viene riavviato. Verosimilmente questa è una rappresentazione estremamente semplificata poiché normalmente la traccia del dispatcher è molto più lunga ed anche il quanto di tempo di assegnazione del processore ad un processo in un sistema time sharing ( quale appunto quello a cui ci si sta riferendo ) è molto più grande, dell’ordine di qualche centinaio di microsecondi e quindi la traccia relativa a ciascun processo includerà alcune centinaia di istruzioni. Va anche precisato che la semplificazione della figura attiene anche al numero di processi concatenati presenti nel sistema atteso che molto spesso si ha a che fare con centinaia se non migliaia di processi e non con tre processi come in questo esempio. Nella slide è notevole la circostanza che il processo B, per la circostanza che l’ultima istruzione, la quarta, è relativa ad una operazione lunga ( vedasi ad esempio un I/O), si blocca prima che sia estinto il quanto di tempo assegnato. La slide mostra che invero successivamente andranno in running i processi C ed A ed ovviamente il dispatcher nulla dice del processo B che potrebbe stare ancora ad eseguire il trasferimento in DMA relativo alla istruzione 4. QUALCHE CONSIDERAZIONE SUL DISPATCHER L’interallacciamento della slide precedente solleva immediatamente alcuni problemi: come fa il processore a sospendere un processo e a riprenderne successivamente l’esecuzione esattamente dal punto della sospensione come se nulla fosse accaduto? La risposta è che da qualche parte deve essere memorizzato lo stato della sospensione per poi poter riavviare l’esecuzione esattamente dal punto in cui il processo è stato sospeso e con le stesse condizioni all’atto della sospensione, a questo servono le tabelle descrittive del processo, note come strutture dati del processo. MODELLO DI PROCESSO A DUE STATI Prima di descrivere le strutture dati di un processo, che costituisce la seconda parte del capitolo, osserviamo che una volta entrati nel sistema, alternativamente i processi in avanzamento passano dallo stato di non running allo stato di running e viceversa fino ad uscire dal sistema, così come presentato nella slide. MODELLO DI PROCESSO A DUE STATI Il meccanismo che il sistema adotta allo scopo, è presentato in questa slide. Come si vede i processi ammessi nel sistema vengono inseriti in una coda da cui escono per andare in running e nella quale (se non completati) si riaccodano per tornare ad essere eseguiti nel successivo slice, dopo che tutti gli altri processi nella coda hanno avuto la possibilità di avanzare anch’essi per il rispettivo quanto di tempo. E’ spontanea la domanda: cosa viene inserita nella coda? La cosa più semplice potrebbe essere di accodare il nome del processo e l’indirizzo della sospensione ma è facile capire che non basta ed invero quello che viene accodato è il nome del processo ed il puntatore ad una tabella che contiene la storia della sospensione, o, all’inizio il modo con cui il processo deve essere avviato. Questa ultima considerazione fa capire la necessità di una struttura dati che deve accompagnare il processo. CREAZIONE DEI PROCESSI CREARE UN PROCESSO SIGNIFICA: Pertanto creare un processo significa creare la struttura dati utile a gestirlo oltre ad allocarlo in uno spazio di costruire le strutture dati utili a gestirlo allocare lo spazio di indirizzamento necessario per indirizzamento atto a contenerlo con tutti i suoi dati. contenerlo CREAZIONE DEI PROCESSI In questa slide sono riportati i principali meccanismi con cui vengono creati i processi. In un sistema batch sono le istruzioni iniziali del job control language che passano le informazioni al sistema per controllare il processo e per allocare le risorse. Inserendo le stesse, come ad esempio il nome del processo, il nome del proprietario, l’estensione della memoria richiesta, il tempo di uso massimo del processore e così via, nella struttura dati di descrizione del processo. Nei sistemi interattivi invece è l’azione di logon che avvia la creazione del processo facendosi carico, il sistema, di definire tutte le strutture dati e le risorse di cui il processo avrà bisogno. In questo caso è lo stesso sistema operativo che si occupa della creazione su richiesta utente. Ma il sistema operativo può anche creare un processo per necessità di modularità o per avviare in parallelo più processi. Un processo infine può essere creato come figlio di un altro processo in una gerarchia di discendenza come in una struttura ad albero. TERMINAZIONE DEI PROCESSI MODELLO A 5 STATI Il modello a due stati presentato innanzi non è però sufficiente a descrivere il funzionamento dei un New sistema. Per avvicinarci ad una descrizione più prossima a quella di un sistema reale consideriamo Ready invece il modello a cinque qui descritti. Running Blocked Exit DIAGRAMMA TRANSIZIONI MODELLO A 5 STATI (commentare new, exit e blocked) Questa slide riporta il diagramma delle transizioni di un sistema, a cinque stati. TRANSIZIONI NEL MODELLO A 5 STATI Le transizioni del diagramma degli stati del modello nella precedente slide vengono ora descritti in questa slide. Molte delle transizioni si commentano da sole poiché seguono la stessa logica introdotta innanzi, tuttavia ce ne sono alcune che potrebbero destare sorpresa. In particolare la transizione Null > New sembrerebbe non trovare fondamento in quanto detto fino ad ora, a meno che non si pensi che lo stato di Null viene assegnato ad un processo in creazione e che può essere più semplice, per inserirlo nel sistema, usare gli stessi meccanismi di transizione usati per gli altri cambiamenti di stato. Ci saremmo magari aspettati che il nuovo processo fosse inserito subito nella coda dei Ready ma molto spesso, per non degradare il sistema, perché ad esempio troppi sono i processi in stato di Ready, o al processo non sono assegnabili le risorse necessarie , può essere opportuno metterlo in uno stato precedente, appunto Null, da dove transiterà per la coda dei Ready. Sorprendente è anche la transizione Running>Blocked che si verifica in presenza di un evento bloccante (vedi wait) ad esempio generato dalla mancanza di occorrenza di un particolare evento richiesto, che dovrebbe essersi verificato in precedenza o che, di natura diversa da quella del wait si presenta ora (vedi interrupt). Se la transizione Blocked>Ready si commenta da sola perché è possibile non appena si è verificata la condizione che ha portato il processo nello stato bloccato, inaspettata è la transizione Blocked>Exit che invece si verifica quando un padre, decide di far terminare un figlio, o termina egli stesso, oppure quando qualche altro evento, per esempio l’operatore esterno che teme uno stallo, fa terminare quel processo. Sono esattamente le stesse condizioni che fanno realizzare la transizione Ready>Exit. ESEMPIO DI TRANSIZIONE DI STATI Alla luce dei commenti sin qui fatti possiamo analizzare le transizioni di stato dell’esempi o dei tre processi A,B e C dell’esempi o introdotto in precedenza. Sono quelle gabellate in questa slide. MODELLI DI ACCODAMENTO Dovrebbe essere abbastanza semplice comprendere che di eventi bloccanti ce ne possono essere di diversa natura e se tutti i processi bloccati fossero inseriti in un'unica coda ci vorrebbe una disciplina abbastanza complicata per andare a ripescare dalla coda dei bloccati quelli che si sono bloccati, si può più semplicemente creare una coda per ogni tipo di evento bloccante come è rappresentato nella fig.2 di questa slide. Il flusso dei processi si spiega poi automaticamente. EVOLUZIONE DEL MODELLO A 5 STATI Molto facilmente tutti i processi in memoria restano in attesa di operazioni di I/O Soluzioni - espandere la memoria - poco efficiente - effettuare lo swapping - introduzione nuovo stato - stato suspend Come abbiamo già detto nel capitolo precedente, nel 1983 con il nuovo pc XT (IBM) fu introdotto l’hard disk è subito dopo nel 1984 con il pc AT fu introdotto lo swapping. Cerchiamo ora di chiarire meglio in cosa consiste. Essendo la cpu molto più veloce degli altri componenti, si verificò subito che molto spesso tutti i processi nel sistema rimanevano in attesa di operazioni di I/O. La soluzione di espandere la main memory non era praticabile, le tecnologie disponibili infatti per la costruzione della main memory erano, e restano tutt’ora, e molto costose. Risultò più economico e funzionale spostare la allocazione dei processi dalla main memory al disco e viceversa, questa azione va sotto il nome di swapping. Un processo trasferito su disco (swoppato) è però un processo sospeso ed è opportuno introdurre un nuovo stato, appunto lo stato sospeso. Questi è presentato nella fig.a) della slide successiva. DIAGRAMMA TRANSIZIONI CON STATO SUSPEND Questo diagramma include lo stato sospeso. Esso si è aggiunto ai cinque stati che abbiamo commentato nel precedente diagramma degli stati. Tuttavia cercando di comprendere come funzioni, non è chiaro ad esempio come si arrivi a questo stato. Una possibile risposta è che quando un processo viene creato viene inserito nello stato sospeso e poi da questo transita allo stato ready o bloccato. Ma non è semplice continuare a immaginarsi il successivo ed è facile intuire che il diagramma è incompleto. Invero quello giusto è quello della fig. b) ( diagramma a sette stati) nel quale sono stati inseriti i due stati; ready suspended e blocked suspend. Il diagramma descrive poi le possibili transizioni tra questi sette stati che saranno meglio dettagliati tra poco. E’ però evidente che un processo sospeso, cioè che sta in memoria secondaria ( cioè sul disco) non è immediatamente disponibile per l’esecuzione. STATI DEL MODELLO CON STATI SUSPENDED …. Blocked suspended Ready suspended …. PROCESSO SOSPESO Un processo è sospeso se: Non è immediatamente disponibile per l’esecuzione Non dispone del processore (bloccato e sospeso sono concetti indipendenti) È stato sospeso da un agente Risulta sospeso fino a quando l’agente non lo rimuove da questa condizione Sebbene alcune considerazioni sulla sospensione saranno fatte nella successiva slide per adesso possiamo dire che qualche agente deve aver sospeso quel processo, che pertanto non può disporre del processore e che resta sospeso fino a quando l’agente non lo rimuove da quella condizione. MODELLO CON STATI SUSPENDED: TRANSIZIONI Lasciando che ognuno eserciti la propria mente nella ricerca del significato delle transizioni tra molti stati del diagramma delle transizioni a sette stati , cosa abbastanza semplice essendo molte già state descritte nel diagramma a cinque stati, fermiamo la nostra attenzione su quelle transizioni che sono collegate direttamente allo swapping. Se il sistema ha bisogno di memoria principale, qualcosa deve essere trasferito in memoria secondaria, potrebbe essere un processo in stato di ready, se non si può fare diversamente, anche se sarebbe meglio trasferire quelli in stato bloccato tenuto conto che gli stessi devono aspettare che si verifichi un evento e non possono andare in esecuzione. Ed infatti facile intuire che se per necessità occorre liberare spazio in memoria principale è più conveniente che sia trasferito in memoria secondaria un processo bloccato. La transizione da ready suspended a ready corrisponde ad uno swap invece la transizione da blocked suspended a ready suspended fa cambiare la fila di accodamento del processo ma lo lascia nella memoria secondaria. Un processo a più alta priorità da ready suspended può passare a ready se un agente lo sblocca. Per un processo appena creato può essere più conveniente adottare la filosofia just in time preferendo di inserirlo nella coda dei ready, come accade nel caso del diagramma a cinque stati, o nella coda dei ready suspended per non congestionare il sistema nel caso in cui quelli in coda di ready sono tanti. Un’altra transizione interessante è quella da Blocked suspended a blocked, essa sembra inverosimile dato che non si capisce perché se un processo deve rimanere bloccato viene trasferito in memoria principale. La risposta è che è presumibile che si sblocchi presto. Molto più inattesa è la transizione Running > Ready Suspended ma invero ci potrebbe essere la necessità di far avanzare un processo a più alta priorità, o che sia un operatore esterno a sospendere quello in running. Nel caso del timore di uno stallo o di malfunzionamento potrebbe essere che un operatore esterno metta tutti in stato di exit. CAUSE DI SOSPENSIONE In questa slide sono riassunte le principali cause della sospensione. Infatti può essere richiesta memoria non disponibile per l’esecuzione del processo pronto ed allora è il sistema che provvede a fare uno swap out. Ma ci possono essere altre cause come ad esempio quella da parte del sistema di un processo sospettato di dare qualche problema o un processo in background che sarà ripreso successivamente. Potrebbe essere una richiesta da parte di un utente per effettuare un debug. O anche una richiesta di utilizzazione di una risorsa. Ancora per una necessità di sistema per monitoraggio o per redigere le contabilità, come pure può essere un processo genitore che sospende un figlio per coordinare le azioni dei discendenti.