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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

SuspendThread opera in modo opposto. Queste funzioni regolano un contatore, in modo che<br />

se un thread è sospeso per due volte, deve essere ripreso per due volte prima di poter funzionare.<br />

Per sincronizzare l'accesso concorrente agli oggetti condivisi dai thread, il kernel fornisce oggetti<br />

di sincronizzazione, quali semafori e mutex.<br />

Inoltre, la sincronizzazione dei thread può essere ottenuta usando le funzioni<br />

WaitForSingleObject o WaitForMultipleObjects. Un altro metodo di<br />

sincronizzazione nelle API di Win32 è la sezione critica. Una sezione critica è una regione<br />

sincronizzata del codice che può essere eseguita solo da un thread alla volta. Un thread stabilisce<br />

una sezione critica chiamando InitializeCriticalSection. L'applicazione deve<br />

chiamare EnterCriticalSection prima di entrare nella sezione critica e<br />

LeaveCriticalSection dopo l’uscita dalla sezione critica. Queste due procedure<br />

garantiscono che, se thread multipli tentano di entrare in modo concorrente nella sezione critica, è<br />

consentita la prosecuzione solo ad un thread alla volta, e gli altri aspettano la procedura<br />

EnterCriticalSection. <strong>Il</strong> meccanismo della sezione critica è più veloce dell’uso di oggetti<br />

di sincronizzazione del kernel, poiché evita l’allocazione degli oggetti del kernel finché non<br />

incontra per la prima volta una disputa per la sezione critica.<br />

7.3.5 Fibre<br />

Una fibra (fiber) è un codice in modalità utente che viene schedulato secondo un algoritmo di<br />

schedulazione definito dall’utente. Un processo può avere al suo interno fibre multiple, proprio<br />

come può avere thread multipli. La principale differenza fra i thread e le fibre è che i thread<br />

possono essere eseguiti in modo concorrente, ma è consentita l’esecuzione di solo una fibra alla<br />

volta, anche nell’hardware multiprocessore. Questo meccanismo è incluso in <strong>Windows</strong> <strong>XP</strong> per<br />

facilitare la portabilità delle applicazioni ereditate da UNIX e che sono state scritte per un<br />

modello di esecuzione della fibra.<br />

<strong>Il</strong> <strong>sistema</strong> crea una fibra chiamando o ConvertThreadToFiber o CreateFiber; la<br />

differenza principale fra queste funzioni è che CreateFiber non inizia l’esecuzione della fibra<br />

creata. Per iniziare l'esecuzione, l'applicazione deve chiamare SwitchToFiber. L'applicazione<br />

può terminare una fibra chiamando DeleteFiber.<br />

Creazioni/cancellazioni ripetute di thread possono essere costose per le applicazioni e per i<br />

servizi che svolgono singolarmente piccole quantità di lavoro. <strong>Il</strong> gruppo di thread fornisce<br />

programmi in modalità utente mediante tre servizi: una coda in cui le richieste di lavoro possono<br />

essere sottoposte (tramite l’API: QueueUserWorkItem), una API<br />

(RegisterWaitForSingleObject) che può essere usata per collegare chiamate ripetute<br />

agli handle in attesa, e una API per collegare le chiamate ripetute alle interruzioni<br />

(CreateTimerQueue e CreateTimerQueueTimer).<br />

L'obiettivo del pool di thread è di incrementare le prestazioni; i thread sono relativamente<br />

costosi e un processore può eseguire solo una cosa alla volta indipendentemente da quanti thread<br />

si usano. <strong>Il</strong> pool di thread cerca di ridurre il numero di thread in un processo, ritardando un poco<br />

le richieste di lavoro (riutilizzando ogni thread per più richieste), mentre fornisce abbastanza<br />

thread per utilizzare efficacemente la CPU della macchina.<br />

Le API di attesa e i richiami del temporizzatore permettono al pool di thread di ridurre il<br />

numero di thread in un processo, usandone molto meno di quanti non sarebbero necessari se un<br />

processo dovesse dedicare un thread per servire ogni handle o interruzione.<br />

56

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

Saved successfully!

Ooh no, something went wrong!