Il sistema operativo Windows XP - Apogeo
Il sistema operativo Windows XP - Apogeo
Il sistema operativo Windows XP - Apogeo
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