200 likes | 336 Views
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
E N D
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.
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)
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.
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.
Gestione dei processi e thread Il sistema operativo deve gestire: • Creazione dei processi e thread • Sincronizzazione fra thread (cosa accade quando più thread tentano di accedere alla stessa risorsa ?) • Comunicazione fra processi (ci può essere necessità di scambio di dati fra processi, anche su computer diversi) • Scheduling dei thread (se più thread devono essere eseguiti, quale sarà il primo ad essere eseguito ?)
API gestione Job, Process, Thread & Fiber. Alcune Win32 API per processi, thread e fibre
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.
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 );
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
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
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.
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);
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);
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(………);
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(…….);
Comunicazione fra processi Un processo può comunicare con un altro processo in 5 modi: • File condivisi • Pipe • Mailslot • Socket • RPC (Remote Procedure Call
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.
Socket • Funzionano come le pipe, ma sono più pesanti. • Si usano per connettere processi su computer differenti. • I messaggi arrivano sempre a destinazione.
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.
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.