Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
User Running
Un altro esempio è quello dell'esaurimento del quanto di tempo.
Il grafico sopra sta indicare il tipo di algoritmo che viene ad essere usato, nel caso in esame abbiamo che si usa un algoritmo del tipo Round Robin dove abbiamo un quanto di tempo e possiamo osservare che quando termina il quanto di tempo deve essere gestita la ISR ad ogni clock, si ha necessità di fare questa cosa in quanto di default abbiamo un dispositivo fisico all'interno della nostra macchina che è il timer, questo timer ci occorre ad interrompere ogni tot un processo poiché il Kernel esegue attraverso la CPU e quindi il timer è necessario per fare questa interruzione costante in modo da vedere se la CPU tra un processo e l'altro deve eseguire altri processi; non ci basta il timeslice in quanto durante il timeslice si possono avere degli interrupt che ci dicono di eseguire qualche processo che ha priorità maggiore, chi ci dice poi che un processo.
è a priorità maggiore rispetto ad un altro è il SO ed il SO esegue sempre sullastessa CPU che stiamo utilizzando e quindi per mettere il codice dello scheduler ad eseguire è necessarioquesto timer in quanto è in questi istanti di tempo che viene ad essere eseguito lo scheduler che altrimentinon consentirebbe di riuscire a decidere quale processo eseguire. Ricapitolando possiamo dire che siccomeil codice del Kernel deve eseguire anche lui sulla CPU e quindi è in contesa con i task che vengono ad essere280eseguiti in User Space o altri task e siccome sul processore deve eseguire anche lo scheduler che è quelloche sceglie chi ha priorità maggiore, chi deve passare dalla coda dei processi pronti alla coda dei processi inesecuzione, risulta necessario avere un meccanismo come il timer che interrompe per capire se c’ènecessità di fare qualcosa. Il timer è quindi un dispositivo fisico che inoltra un interrupt
fisico verso il processore e questo interrupt deve essere eseguito dal codice del kernel che poi invocherà l'operazione di schedule per capire se esiste un task ad alta priorità, ci stanno interrupt ecc perché altrimenti finché non finisce la timeslice non verrà interrotto quello che sta facendo un task. Quando esaurisce un task deve essere eseguito qualche altro task ed in questo caso lo scheduler avrà il compito di schedulare il prossimo processo dalla coda dei processi pronti.
Vediamo ora il descrittore del processo che abbiamo già visto per un processo standard e che racchiude tutte quelle informazioni che sono necessarie per poter gestire il processo stesso. La Process Structure che contiene tutte le informazioni necessarie per gestire il processo anche se si trova nello stato di Swapped si trova in memoria secondaria. In Unix abbiamo questa tabella dei processi che è indicizzata dal PID dei processi e all'interno di
In questa entry abbiamo il riferimento alla Process Structure. Anche la U-Area può passare dalla memoria centrale alla memoria secondaria (swap out). 281
Nella relazione che intercorre tra la Process Structure e la U-Area abbiamo che si ha tutta una serie di informazioni e poi il puntatore alla U-Area che ha invece informazioni relative al processo in esecuzione come ad esempio l'utente proprietario del processo, quali file sono aperti ecc.
Come visto sopra possiamo accedere allo stato con 282. Quello che si ottiene non è tutto il Process Control Block ma sono tutte le info che vedevamo sotto la directory con il PID del processo.
In Unix abbiamo anche una differenza tra Text Structure e Text Table. La Tabella di Testo in realtà ha un elemento per ogni segmento di codice che viene ad essere utilizzato dal processo e quindi siccome il codice dei processi è rientrante e quindi più processi possono condividere lo stesso codice e quindi la stessa area testo.
Abbiamo che in questo modo è possibile far puntare processi diversi alla stessa Text Strutture in modo che possono puntare alla stessa area e quindi allo stesso codice da poter utilizzare. Per questo motivo il kernel gestisce questa tabella e per questo ogni Entry di questa tabella ha un puntatore all'area di memoria che contiene l'area testo per un certo processo. Viene considerato in realtà anche il numero di processi che condividono quella area testo. In generale abbiamo un'istantanea del tipo mostrato sotto che prende il nome di Immagine di un processo Unix ed indica tutto quello che è necessario in memoria principale per eseguire un certo processo con un, è possibile osservare sotto come si hanno vari riferimenti alle diverse aree e quindi nella Process Table PID ici sarà una entry per ogni processo, qui ci sarà un riferimento alla Text Table che ha a sua volta un riferimento all'area di codice condivisa tra più processi.
Ovviamente c'è un riferimento all'immagine vera e propria di cui parliamo che è relativa allo stack, all'heap e all'area dati globale e poi ci sono i riferimenti allo stack del kernel che vedremo meglio più avanti e all'U-Area. Sotto possiamo osservare diverse aree di memoria che sono accedibili in modalità User ed in modalità Kernel ed abbiamo diverse aree di memoria che sono swappabili o no e quindi residenti. Un processo interattivo è un processo tipicamente I/O Bound che interagisce principalmente con l'utente e quindi una volta lanciato sta fino a terminazione. Utilizzando l'algoritmo di feedback a multilivello si evita quel fenomeno di starvation. Per starvation si intende quel fenomeno per il quale un processo a minore priorità non verrà mai ad essere eseguito in quanto sopraggiungeranno processi a priorità sempre più elevata. Starvation deriva dal verbo to starv chesignifica morire di fame.Possiamo osservare la presenza di code multiple, ogni coda ha una priorità diversa e prima o poi ogni processo che partirà con una priorità elevata arriverà con una priorità più bassa e in questo modo si evita di privilegiare i processi con priorità più alta. Il calcolo della priorità è fatto con le formule indicate sotto.
Il concetto di base è quello che si vuole andare ad abbassare la priorità al processo che per più tempo sta utilizzando la CPU. Quindi più tempo passa il processo ad utilizzare la CPU più a quel processo si abbassa la priorità.
Per il calcolo si utilizza la misura dell’utilizzo del processore da parte del processo che indica la sua storia precedente e poi si calcola la priorità del processo in base a quello che sta utilizzando adesso ed in base a diversi fattori correttivi come il fattore di Nice che indica una sorta di
priorità e poi la priorità di base del processo. In Unix abbiamo che minore è il valore numerico della priorità e migliore sarà il trattamento dello scheduler e quindi in questo caso si calcolano le priorità in modo da considerare quanto tempo effettivamente il processo ha speso nell'istante P nell'intervallo di tempo i precedente a quello corrente. Questo concetto verrà ad essere utilizzato anche nello scheduler di Linux.
Una delle problematiche del feedback multilivello è che bisogna andare a scorrere tutte le code e quindi lo scheduler abbiamo che dovrà andare a fare una scelta e quindi l'efficienza dipende da quanto tempo servirà allo scheduler per fare la scelta e si parlerà allora di overhead. In realtà per schedulare un processo se ci mettiamo 10s rispetto ad uno che ce ne mette 1s ovviamente abbiamo che il secondo scheduler sarà più efficiente rispetto al primo, bisogna
però tenere conto anche del numero dei processi infatti dovendogestire sistemi multi programmati all'aumentare dei processi lo scheduling non scala e quindi all'aumentaredei processi che devono essere scelti per poter essere eseguiti l'overhead cresce in modo quadratico.Uno dei problemi che va a risolvere Linux è quello di avere un algoritmo di scheduling con un overheadcostante che è quello che uno auspica e quindi con Linux si ha che all'aumentare dei processi il tempo discheduling (scelta) resta costante.In questo caso abbiamo che non viene fatta distinzione tra thread e processo. Avevamo visto negli esempipratici che quando veniva ad essere invocato il programma top li veniva ad essere riportato il numero ditask ed infatti abbiamo il concetto di task che è l'unità fondamentale di schedulazione per il kernel e quindinon distingue se il processo ha uno o più thread ma individua il flusso di esecuzione. Il threadin particolare abbiamo che è inteso come un task che condivide le strutture con altri task. L'unità fondamentale quindi in questo tipo di scheduling è il task. Anche in questo tipo di scheduling abbiamo il concetto di priorità ed abbiamo che ad ogni task viene ad essere attribuita una priorità che ovviamente va ad impattare su quando il task verrà ad essere schedulato dallo scheduling ed impatta anche sul quanto di tempo che gli viene assegnato. Dall'immagine sotto possiamo intuire come il timeslice non risulta essere fisso per tutti i processi in Linux. In Linux abbiamo due categorie di task:
- Convenzionali -> da 100 a 139 viene ad essere indicata la priorità dei task convenzionali che viene ad essere indicata con il nice value e viene impostata dall'utente
- Real Time -> questi task hanno una priorità che viene impostata dal kernel
Il nice value è in relazione con il livello di priorità con una
essere gestito attraverso quest’unica politica dischedulazione dal kernel per i processi convenzionali 288
Possiamo allora dire che in Linux il PRIORITY va da 0 a 139 però per i processi convenzionali viene ad esseresfruttato anche questo NICE