Il sistema operativo Windows XP - Apogeo
Il sistema operativo Windows XP - Apogeo
Il sistema operativo Windows XP - Apogeo
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Handle b_semaphore;<br />
DuplicateHandle(process_a,a_semaphore,<br />
GetCurrentProcess(),&b_semaphore,<br />
0, FALSE,DUPLICATE_SAME_ACCESS);<br />
//usa b_ semaphore per accedere al semaforo<br />
…<br />
Figura 13. Codice per la condivisione di un oggetto mediante il passaggio di un handle.<br />
7.3 Gestione del processo<br />
In <strong>Windows</strong> <strong>XP</strong>, un processo è una richiesta di esecuzione di un'applicazione e un thread è<br />
un'unità del codice che può essere schedulata dal <strong>sistema</strong> <strong>operativo</strong>; pertanto, un processo contiene uno<br />
o più thread. Un processo si inizia quando un qualche altro processo chiama la procedura<br />
CreateProcess.<br />
Questa procedura carica tutte le librerie di collegamento dinamico usate dal processo e crea un<br />
thread primario (primary thread);.thread supplementari possono venire creati dalla funzione<br />
CreateThread. Ogni thread è creato con il proprio stack, che usualmente è di 1 MB a meno<br />
che non sia specificato diversamente in un argomento di CreateThread. Siccome le funzioni<br />
run-time del C mantengono lo stato in variabili statiche, quali errno, un'applicazione<br />
multithread deve salvaguardarsi contro accessi non sincronizzati. La funzione avvolgente<br />
(wrapper) beginthreadex fornisce la sincronizzazione adatta.<br />
7.3.1 Handle di richiesta<br />
Ogni libreria di collegamento dinamico o ogni file eseguibile, caricato nello spazio di indirizzo di<br />
un processo, è identificata da un handle di istanza (instance handle). <strong>Il</strong> valore dell’handle di<br />
istanza è attualmente l'indirizzo virtuale dove è caricato il file. Un'applicazione può ottenere un<br />
handle per un modulo nel proprio spazio di indirizzi passando il nome del modulo a<br />
GetModuleHandle; se viene passato come nome NULL, viene restituito l'indirizzo<br />
base del processo. I 64 KB inferiori dello spazio degli indirizzi non vengono usati, in modo che un<br />
programma difettoso, che tenti di dereferenziare un puntatore NULL, ottenga una violazione di<br />
accesso.<br />
Le priorità nell’ambiente di Win32 sono basate sul modello di schedulazione di <strong>Windows</strong> <strong>XP</strong>,<br />
ma non si possono scegliere tutti i valori di priorità. Win32 usi quattro classi di priorità:<br />
IDLE_PRIORITY_CLASS (livello di priorità 4), NORMAL_PRIORITY_CLASS (livello di<br />
priorità 8), HIGH_PRIORITY_CLASS (livello di priorità 13) e REALTIME_PRIORITY_CLASS<br />
(livello di priorità 24). I processi sono tipicamente membri della NORMAL_PRIORITY_CLASS a<br />
meno che il padre non fosse nella IDLE_PRIORITY_CLASS, o che un’altra classe non fosse stata<br />
specificata al momento della chiamata di CreateProcess. La classe di priorità di un processo<br />
può essere cambiata con la funzione SetPriorityClass, o tramite un argomento passato al<br />
comando START. Per esempio, il comando START/REALTIME cbserver.exe farà<br />
funzionare il programma cbserver in REALTIME_PRIORITY_CLASS. Solo gli utenti con il<br />
54