Processi e Thread
 Job: Insieme di processi che condividono quote e limiti.
Processo: Contenitore di risorse (una lista di thread, una lista
di handle e un access token).
Thread: entita schedulate dal kernel, possono accedere a tutti gli
oggetti del processo, possiedono uno stato, due stack, un contesto
dove salvare i propri registri e un’area privata per le variabili locali.
Fiber: thread leggero gestito solo nello spazio utente.
1
Cos’e’ un Processo
• Programma eseguibile, composto da codice e dati
• Ha uno spazio di indirizzamento privato
• Ha accesso a un insieme di risorse (porte, semafori, ecc)
• Ha almeno un thread di esecuzione (porzione di processo
che il kernel tratta atomicamente per l’esecuzione)
2
Cos’e’ un Thread
•
•
•
•
unita’ di esecuzione indipendente all’interno di un processo
utilizza lo spazio di indirizzamento del processo
ha un identificatore unico
ha un contesto, composto da registri, due stack e un’area di
memorizzazione privata
• lo scheduler di Windows 2000 tratta threads, non processi
• Può vedere tutte le variabili del processo che lo ha creato.
3
Caratteristiche del Processo
• Ogni processo ha uno spazio di indirizzamento in memoria
virtuale di al massimo 4GB
• Ogni processo ha a disposizione diverse risorse, tra cui
– un Access Token
– un insieme di strutture, create dal Virtual Memory manager, che
mantengono traccia degli indirizzi virtuali degli oggetti che il
processo sta usando
– una Object Table, che contiene gli handle ai threads, ai file aperti, a
porzioni di memoria condivisa, e ad ogni altro oggetto in uso.
4
Gestione dei processi e thread
Il sistema operativo deve gestire:
1.
Creazione dei processi e thread
2.
Sincronizzazione fra thread (cosa accade quando più
thread tentano di accedere alla stessa risorsa ?)
3.
Comunicazione fra processi (ci può essere necessità di
scambio di dati fra processi, anche su computer diversi)
4.
Scheduling dei thread (se più thread devono essere
eseguiti, quale sarà il primo ad essere eseguito ?)
5
API gestione Job, Process, Thread & Fiber.
Alcune Win32 API per processi, thread e fibre
6
API gestione Job, Process, Thread & Fiber.
Studieremo solo alcune delle API (sono migliaia).
Tutte le informazioni sulle API (sintassi e argomenti li potete
trovare al sito:
http://msdn.microsoft.com/library/default.asp
Cliccando su Win32 API e poi sull’argomento specifico.
Oppure trovate altre informazioni con esempi
http://phoenix.liunet.edu/~mdevi/index.html
In inglese, purtroppo.
7
Creazione processi, thread & fiber
Si usano le API: CreateProcess, CreateThread, CreateFiber,
ExitProcess, ExitThread, ExitFiber, Sleep.
CreateProcess richiede 10 parametri (fra cui il nome dell’eseguibile).
CreateThread (6 parametri, come segue).
hThread=CreateThread (NULL, // sicurezza di default
1000, // dimensione dello stack in byte (0 = default)
(LPTHREAD_START_ROUTINE)provaThread,
// routine che il thread eseguirà
NULL, // parametro definito dall'utente
0, // stato iniziale del thread
&ThreadID // identificativo del thread
);
8
La sincronizzazione
• Un thread si sincronizza con un altro mettendosi in stato di
Wait (attesa) e attendendo un evento (la variazione di flag,
il termine di un thread, la disponibilità di Input, il
passaggio di stato di un oggetto.
• L’evento viene avvertito dal Kernel, che risveglia il thread
in attesa
9
• Esempi di meccanismi per l’attesa (OGGETTI
DISPATCHER)
– mutex: forniscono l’accesso in mutua esclusione alla
risorsa che controllano
– semafori: forniscono l’accesso ad un numero massimo
di thread alla risorsa che controllano
– eventi: consentono la segnalazione del raggiungimento
di una condizione
– timer: consente l’accesso alla risorsa quando e’ passato
un delta di tempo.
– Thread: un thread puo’ attendere che un secondo
thread sia terminato prima di riprendere l’elaborazione
10
Sincronizzazione tramite Dispatcher
Objects
• Utilizzati per sincronizzare thread su eventi oltre che
sull’accesso a dato condivisi
• Un thread si mette in attesa su un Dispatcher O. tramite una
delle seguenti chiamate:
– WaitForSingleObject(HANDLE hObject, DWORD dwTimeout);
(INFINITE sta per timeout infinito.
– WaitForMultipleObject(……………);
• Assumono sempre uno dei due stati: Segnalato e Non
Segnalato. Si esce dalla wait quando l’oggetto diventa
segnalato.
11
Mutex
• Utilizzati per sincronizzare, garantendo accesso esclusivo
alle risorse, thread di processi diversi che debbano
utilizzare gli stessi dati.
• E’ l’unico oggetto di sincronizzazione che puo’ appartenere
al thread che l’ha creato
• Oltre agli stati Segnalato e Non Segnalato, un Mutex puo’
essere in stato Abbandonato
• Chiamata di creazione :
CreateMutex(NULL, false, NULL);
• Chiamata di rilascio:
ReleaseMutex(hmutex);
12
Semafori
• Utilizzati per il conteggio delle risorse disponibili (Es.:
Utilizzo di porte seriali)
• Un semaforo e’ in stato segnalato quando il numero delle
risorse disponibili e’ maggiore di 0.
• Chiamata di creazione Semaforo:
CreateSemaphore (NULL,2,5,NULL );
• Chiamata di rilascio:
ReleaseSemaphore(hSem,1,NULL);
13
Eventi
• Utilizzati per segnalare uno stato (termine di un task: p.es.
completamento della procedura di inizializzazione)
• Possono essere Auto-Reset (segnalazione a un solo thread)
o Manual-Reset (segnalazione a tutti i thread in attesa)
• Chiamata di creazione Evento:
CreateEvent(………);
• Chiamata di settaggio Evento:
SetEvent(………);
14
Waitable Timer
• Oggetti che passano in stato segnalato a certe ore o a
intervalli regolari
• Possono essere Auto-Reset (segnalazione a un solo thread)
o Manual-Reset (segnalazione a tutti i thread in attesa)
• Chiamata di creazione Timer:
CreateWaitableTimer(…..);
• Chiamata di IMPOSTAZIONE Timer:
SetWaitableTimer(…….);
15
Comunicazione fra processi
Un processo può comunicare con un altro processo in 5 modi:
1)
2)
3)
4)
5)
File condivisi
Pipe
Mailslot
Socket
RPC (Remote Procedure Call
16
Pipe
La pipe è un canale di comunicazione fra due processi.
Uno scrive sulla pipe e l’altro legge dalla pipe.
In genere si usano per processi sulla stessa macchina.
Usano le API:
•
CreatePipe (….) ritorna due handle, uno per leggere e
l’altro per scrivere.
•
WriteFile(..) e ReadFile(…) sono bloccanti se la pipe è
piena (per la write) o vuota (per la read).
Le pipe con nome, diversamente da quelle anonime,
permettono comunicazioni fra processi su macchine
differenti.
17
Socket

Funzionano come le pipe, ma sono più pesanti.

Si usano per connettere processi su computer differenti.

I messaggi arrivano sempre a destinazione.
18
Mailslot

Un processo A crea l’oggetto Mailslot.

Un altro processo, B, anche su un altro computer può
mandare un messaggio alla MailSlot del processo A.

Si può mandare lo stesso messaggio in broadcast a una
serie di MailSlot.

Non è detto che i messaggi arrivino a destinazione.
19
Remote Procedure Call

Un processo A chiede al processo B di chiamare una procedura
nel suo spazio di memoria (quello di B), con i parametri passati
da A.

B esegue la funzione e restituisce il risultato ad A.


In pratica, A mette in un messaggio i parametri e li invia a B.
B riceve il messaggio, chiama la procedura e inserisce il
risultato in un messaggio che invierà ad A.
20
Scarica

Processi e thread in Windows 2000 - ICAR-CNR