Upload
jorge-caldas-cipriano
View
233
Download
0
Embed Size (px)
Citation preview
Processos, Threads e Sincronização em Windows NT
Alisson Felipe Coelho GarciaLucas Mateus Malaquias
Rogerio Junio Leachenski
Criando um processo
• BOOL CreateProcess (LPCSTR IpszName, LPCSTR lpszComLine, LPSECURITY_ATTRIBUTES lpProcAttr, LPSECURITY_ATTRIBUTES lpThreadAttr, BOOL InheritAttr, DWORD How, LPVOID lpEnv, LPSTR lpszDir, LPSTARTUPINFO lpStartInfo, LPPROCESS_INFORMATION lpPInfo);
Criando um processo
Parâmetros do CreateProcess():• lpszName• lpszComLine• lpProcAttr e IpThreadAttr• InheritAttr• How• IpEnv• IpszDir
Criando um processo
• IpStartInfotypedef struct _STARTUPINFO {
DWORD cb; //tamanho de STARTUPINFOLPTSTR lpReserved;LPTSTR lpDesktop; //nome da área de trabalhoLPTSTR lpTitle; //título do console (apenas para consoles)DWORD dwX; //canto superior esquerdo (x)DWORD dwY; //canto superior esquerdo (y)DWORD dwXSize; //tamanho da nova janela (x)DWORD dwYSize; //tamanho da nova janela (y)DWORD dwXCountChars; //tamanho do buffer do console (x)DWORD dwYCountChars; //tamanho do buffer do console (y)DWORD dwFillAttribute; //cor inicial do textoDWORD dwFlags; //determina quais campos estão ativosWORD dwShowWindow; //como a janela é mostradaWORD cbReserved2;LPBYTE lpReserved2;HANDLE hStdInput; //handles padrõesHANDLE hStdOutput;HANDLE hStdError;
} STARTUPINFO;
Criando um processo
Valores para dwFlags:
• STARTF_USEHOWWINDOW -> Ativa dwShowWindow
• STARTF_USESIZE -> Ativa dwXSize e dwYSize• STARTF_USEPOSITION -> Ativa dwX e dwY• STARTF_USECOUNTCHARS -> Ativa dwXCountChars
e dwYCountChars• STARTF_FILLATTRIBUTE -> Ativa dwFillAttribute
Criando um processo
• lpPInfo
typedef struct _PROCESS_INFORMATION {HANDLE hProcess; //handle do novo processoHANDLE hThread; //handle do thread principalDWORD dwProcessId; //ID do novo processoDWORD dwThreadId; //ID da nova thread
} PROCESS_INFORMATION;
Encerramento de um processo filho
BOOL TerminateProcess(HANDLE hProcess, UINT status);
Threads
• Windows NT• Processos Pesados• Processos Leves(Threads)
Criando uma Thread
HANDLE CreateThread ( NULL, /* nenhum atributo de segurança */ 0, /* use o tamanho default do stack */ (LPTHREAD_START_ROUTINE) ThreadFunc, /* o procedimento a ser lançado */ &dwThrdParam, /* argumento da função */ 0, /* usar flags default de criação */ &dwThreadId); /* devole o id da thread */
ThreadCada thread possui sua própria pilha de execução, seu próprio contexto (registradores da CPU) e prioridade.
Uma tabela de threads deve então ser mantida também. Os itens por thread são normalmente:
• o contador de programa.• o endereço da pilha.• o conjunto de registradores associados.• endereços das threads filhas.• estado.
Tipos de threads
Threads síncronas• Executam até que elas mesmas decidam
terminar a execução.
Threads assíncronas• Podem executar juntamente com outros
threads (não bloqueados).
Single-Thread vs Multithreads
Execução mais eficiente
Estados assumidos por uma Thread
Escalonamento de ThreadsEscalonador utiliza múltiplas filas, processos interativos (I/O bound) possuem prioridade sobre os CPU bound.
Classe Tempo Real• Possuem prioridade fixa de 16
a 31.
Classe Variável(Normal)• Possuem prioridade de 0 a 15.
Zero Thread• Zera as paginas livres no
sistema.
Idle• Mais baixa prioridade.
Processamento Preemptivo
Cooperativo• Os processos esperam que o
processo em execução libere o processador voluntariamente.
• Uma aplicação mal desenvolvida pode monopolizar o processador.
Preemptivo(Prioridade)• Implica em uma sobre carga
devido ao chaveamento de contexto frequente.
Chaveamento Involuntário• Sleep, Bloqueio e preempção.
Escalonamento em máquinas SMP• Durante a instalação do Kernel, se é detectada a
presença de mais de um processador, é carregado o suporte para o multiprocessamento.
• Independente do número de processadores existira apenas uma fila de processos aptos.
• Porém, a existência de multiprocessadores irá permitir o paralelismo físico na execução das threads.
• Se existirem N processadores, o escalonador garante que as N threads de mais alta prioridade estejam em execução nesses processadores.
Escalonamento em máquinas SMP
O Windows 2000 implementa o conceito de afinidade, que define em qual processador a thread deve executar. A afinidade pode ser:
• Hard – Dependência que obriga a thread a executar sempre no mesmo processador.
• Soft – O sistema tenta executar a thread no processador que ela havia executado anteriormente, para aproveitamento de dados da execução anterio.
Finalizando uma Thread
BOOL TerminateThread(HANDLE hThread, DWORD dwStatus)
if(TerminateThread(hThread, dwStatus) == 0){ printf("Erro ao Finalizar a Thread\n"); }else{ printf("Thread Finalizada!\n"); }
Sincronização
CRIANDO UM SEMÁFORO• HANDLE
CreateSemaphore(LPSECURITY_ATRIBUTES lpAttr, LONG InitialCount, LONG MaxCount, LPSTR lpszName);
• lpAttr: Ponteiro para os atributos de segurança, NULL;
Sincronização
• InitialCount: Contador;• MaxCount: Número de tarefas que podem
acessar um recurso, 1 = Mutex;• lpszName: Nome do semáforo, objeto global;• Retorna um HANDLE para o semáforo, NULL =
erro;• DWORD WaitForSingleObject(HANDLE
hObject, DWORD dwHowLong);
Sincronização
• hObject: HANDLE do semáforo;• dwHowLong: Tempo de espera em
milissegundos;• Retorna WAIT_TIMEOUT ou 0(decrementa
contador);• BOOL ReleaseSemaphore(HANLDE hSema,
LONG Count, LPLONG lpPrevCount);• hSema: HANDLE do semáforo;
Sincronização
• Count: Valor a ser acrescentado ao contador;• lpPrevCount: Contador do semáforo anterior,
NULL;CRIANDO UM OBJETO DE EVENTO
• HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpAttr, BOOL Manual, BOOL Inicial, LPSTR lpszName);
Sincronização
• lpAttr: Ponteiro para os atributos de segurança, NULL;
• Manual: Comportamento após o evento;• Inicial: Estado inicial do objeto• lpszName: Nome do objeto de evento, objeto
global;• Retorna um HANDLE para o objeto de evento,
NULL = erro;
Sincronização
• BOOL SetEvent(HANDLE hEventObject);• hEventObject: HANDLE de um objeto de
evento;