31.05.2013 Views

Il sistema operativo Windows XP - Apogeo

Il sistema operativo Windows XP - Apogeo

Il sistema operativo Windows XP - Apogeo

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

sincronizzazione, gestione del timer, interrupt software (chiamate asincrone e chiamate di procedura<br />

rinviae) e la spedizione di eccezioni.<br />

3.2.2 Thread e schedulazione<br />

Come in molti sistemi operativi moderni, <strong>Windows</strong> <strong>XP</strong> usa i concetti di processi e thread per il<br />

codice eseguibile. <strong>Il</strong> processo ha uno spazio di indirizzamento di memoria virtuale e informazioni<br />

usate per inizializzare ogni thread, quali una priorità di base ed un'affinità per uno o più processori.<br />

Ogni processo ha uno o più thread, ognuno dei quali è un'unità eseguibile gestita dal kernel. Ogni<br />

thread ha un proprio stato di schedulazione, compresa la priorità attuale, l'affinità del processore e<br />

le informazioni sull’uso della CPU.<br />

I sei possibili stati del thread sono: pronto, standby, funzionante, in attesa, in transizione e<br />

terminato. Pronto (ready) indica che è in attesa di funzionare. <strong>Il</strong> thread pronto con priorità più alta<br />

viene spostato verso la condizione standby, che significa che sarà il thread successivo ad entrare<br />

in funzione. In un <strong>sistema</strong> multiprocessore, ogni processo mantiene un thread in condizione di standby.<br />

Un thread è funzionante (running) quando opera su di un processore e funziona fino a che non è<br />

interrotto da un thread a priorità più alta che lo fa terminare: ossia, finisce il proprio tempo di<br />

esecuzione (quantum), o si blocca su di un oggetto del dispatcher, quale un evento che segnala il<br />

completamento di un’operazione di I/O. Un thread è in condizione di attesa (waiting) quando sta<br />

aspettando un segnale di un oggetto del dispatcher. Un nuovo thread è in condizione di<br />

transizione (transition) quando aspetta risorse necessarie per l'esecuzione. Un thread è nella<br />

condizione terminato (terminated) quando finisce l'esecuzione.<br />

<strong>Il</strong> dispatcher usa uno schema di priorità a 32 livelli per stabilire l'ordine di esecuzione dei<br />

thread. Le priorità sono divise in due classi: classe variabile e classe in tempo reale. La classe<br />

variabile contiene i thread con priorità da 0 a 15, la classe in tempo reale contiene i thread con<br />

priorità da 16 a 31. <strong>Il</strong> dispatcher usa una coda per ogni priorità di schedulazione ed attraversa l'insieme<br />

delle code dalla più alta alla più bassa finché non trova un thread pronto a funzionare. Se un thread ha<br />

una particolare affinità di processore, ma quel processore non è disponibile, il dispatcher passa oltre e<br />

continua a cercare un thread pronto che può funzionare su di un processore disponibile. Se non trova<br />

alcun thread pronto, il dispatcher esegue un thread speciale chiamato thread inattivo (idle thread).<br />

Quando il quantum di tempo del thread si esaurisce, l'interrupt dell'orologio mette in coda un<br />

quantum di fine DPC al processore per rischedulare il processore stesso. Se il thread interrotto è<br />

nella classe a priorità variabile, la sua priorità viene abbassata, mai sotto quella base.<br />

L'abbassamento della priorità del thread serve a limitare il consumo della CPU dei thread con<br />

prevalente attività computazionale (compute bound). Quando un thread a priorità variabile viene<br />

rilasciato da un’operazione di wait, il dispatcher amplifica la priorità. La quantità di amplificazione<br />

dipende dal dispositivo che il thread stava attendendo; per esempio, un thread in attesa di<br />

un’operazione di I/O da tastiera avrebbe un grande incremento di priorità, mentre un thread in<br />

attesa di un’operazione su disco avrebbe un incremento modesto. Questa strategia tende a dare buoni<br />

tempi di risposta ai thread interattivi che usano il mouse e le finestre, e permette a thread collegati ad<br />

attività di I/O di tenere i dispositivi I/O occupati, mentre consente ai thread collegati ad attività di<br />

elaborazione di utilizzare cicli sparsi di CPU in background. Questa strategia è usata da parecchi<br />

sistemi operativi in time-sharing, compreso UNIX; inoltre il thread associato con la finestra attiva<br />

GUI dell'utente riceve un’amplificazione della priorità per migliorare il proprio tempo di risposta.<br />

8

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!