Gestione dei Processi. I processi Un processo è unistanza di esecuzione di un programma. Consiste...

Post on 01-May-2015

213 views 0 download

Transcript of Gestione dei Processi. I processi Un processo è unistanza di esecuzione di un programma. Consiste...

Gestione dei Processi

I processi

• Un processo è un’istanza di esecuzione di un programma. Consiste di – Un identificatore univoco (PID)– La handle table del processo

• tabella di riferimenti (HANDLE) a risorse di cui il processo può disporre (file, socket, eventi, …)

– Uno spazio d’indirizzamento privato di 4GB– Almeno un thread d’esecuzione

PID

• PID = process ID– Identificatore univoco dei processi– (visibile per esempio quando i processi sono

mostrati in task manager)

Thread

• Un thread rappresenta un contesto di esecuzione– Valori dei registri, stack, codice eseguito, …

• Un processo ha almeno un thread associato e può averne più di uno (esecuzione concorrente)

• Il primo thread viene creato all’avvio di un processo automaticamente dal SO– Il primo thread esegue il codice dell’entry point del

processo (funzione main)

Creazione di un processo da programma

BOOL CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation

);

Parametri di CreateProcess i/ii• LPCTSTR lpApplicationName

– Nome dell’applicazione (stringa)• LPTSTR lpCommandLine

– Linea di comando con evetuali parametri (stringa)• LPSECURITY_ATTRIBUTES lpProcessAttributes• LPSECURITY_ATTRIBUTES lpThreadAttributes

– Attributi di sicurezza del processo e del suo primo thread• BOOL bInheritHandles

– ereditarietà delgli handle del padre• DWORD dwCreationFlags

– Modalità di creazione del processo• CREATE_SUSPENDED (processo creato nello stato sospeso)• CREATE_NEW_CONSOLE (processo creato in una nuova console)• 0 (nessuna modalità particolare)

Parametri di CreateProcess ii/ii• LPVOID lpEnvironment

– Trasferisce al processo le variabili d’ambiente– Date sotto forma di tabella di stringhe– Ogni riga è nella forma “nome=valore”– Se il parametro è NULL, il nuovo processo acquisisce una tabella

identica a quella del processo che lo crea• LPCTSTR lpCurrentDirectory

– Directoru di lavoro del nuovo processo• LPSTARTUPINFO lpStartupInfo

– Informazioni per la finestra principale del nuovo processo• LPPROCESS_INFORMATION lpProcessInformation

– È un parametro di ritorno per ricevere informazioni sul processo appena creato

• Handle del processo• Handle del primo thread• PID del nuovo processo

Struttura PROCESS_INFORMATION

typedef struct _PROCESS_INFORMATION { // pi HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId;

} PROCESS_INFORMATION;

• hProcess: handle del processo creato• hThread: handle del thread primario del processo creato• dwProcessId: PID del processo creato• dwThreadId: identificatore del thread primario

Creazione di un thread

HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags, LPDWORD lpThreadId);

Parametri di Create Thread• LPSECURITY_ATTRIBUTES lpThreadAttributes

– Attributi di sicurezza del thread• DWORD dwStackSize

– Dimensione dello stack (0 = default)• LPTHREAD_START_ROUTINE lpStartAddress

– Funzione da eseguire nel thread• LPVOID lpParameter

– Parametri passati alla funzione eseguita• DWORD dwCreationFlags

– Stato del thread al momento della creazione• 0 = running• CREATE_SUSPENDED = sospeso

• LPDWORD lpThreadId– Identificatore del thread restituito come risultato

Funzioni passate ai thread

• Le funzioni passate ai thread devono essere dichiarate seguendo la seguente sintassi– DWORD WINAPI ThreadFunctionName (LPVOID lpParam);

• DWORD: tipo del valore di ritorno• WINAPI: convenzione di chiamata • ThreadFunctionName: nome della funzione (a piacere)• LPVOID: puntatore a void

– utilizzato come strumento generico per il passaggio dei parametri

– mediante un’operazione di cast è possibile ricostruire il formato corretto dei parametri dentro la funzione

Funzioni di utilità

• int GetCurrentThreadId()– Restituisce l’Id del thread corrispondente al contesto

di esecuzione corrente

• DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMillisecs)– Aspetta la terminazione di un thread per il tempo

stabilito – (si può usare il valore INFINITE per aspettare la

terminazione del thread in ogni caso)

Riferimenti

• Pinardi, Aruanno, Bisiani. “Windows & .NET 2000 in Action” – Capitolo 1