Processes, Threads and Jobs Processo:possui 2/3 gb de espaço de endereçamento virtual, a segurança é feito pelo token de acesso. criado apartir do modo de user pelo win32 APIs CreateProcess, CreateProcessAsUser. È terminado quando todos as threads que fazem parte dexe processo terminam, uma das theards do processo chamada a ExitProcess (win32) e o processo é terminado com TerminateProcess (win32).
Criação de um processo: Fluxo de criação de um processo: ->ficheiro de imagem aberto ->Criar kernel Executive Process object ->criar inicial da thread ->Notifique CSRSS (cliente / servidor Correr-tempo Subsistema) do novo processo e thread ->processo completo e inicializaçao da thread ->requer as dlls e inicializa -> inicio da Execução da main(inicio) (main,WinMain)
Token de acesso Uma estrutura de dado que contém informações sobre autorização(segurança) para um grupo ou usuário. Um sistema utiliza um token de acesso para controlar o acesso a objetos protegidos e para controlar a capacidade de um usuário realizar operações relacionadas ao sistema em um computador local. O processo corre abaixo do token de acesso com opções de segurança determinadas pelo user. Thread: instancia da execução de uma funçao: • Possui: Contexto (registros, etc.), 2 pilhas(user mode e kernel mode) -> Opcionalmente, fila de mensagem e Windows -> opcional- segurança de token • Programar estado -> Prioridade (0 -31) ao mais baixo IRQL -> Estado (pronto, espere, correndo) -> Modo de acesso (user e kernel mode) • Criou usando CreateThread (Win32) • Destruiu quando -> função thread retorna (Win32 só) -> thread chamadas ExitThread (Win32) -> Terminou com TerminateThread (Win32)
Prioridades das threads: • •
Win32 modo:: os processos têm uma classe de prioridades: idel(4), abaixo do normal(6), normal(8), acima do normal(10), high(13), realtime(24); Por outro lado a prioridade de theard é feita por um offset (-2,-1,0,1,2 + 2 niveis especiais) Kernel modo: a prioridade da threah é um valor absoluto (0-31)
Programação da thread: • Prioridade, preventivo, tempo-slice -> thread de prioridade mais alta corre primeiro . ->Se tempo slice (quantum) decorre, e há outra thread com a mesma prioridade no estado Pronto corre. Caso contrário, a mesma thraed corre novamente ->Se a thread A corre, e a thread B (com uma prioridade mais alta) recebe algo esperou em (mensagem, kernel object sinalizado, etc.),a thread A troca com a thread B,correndo entao a B. • switch voluntário ->Uma thread A espera no estado (WaitForSingleObject, GetMessage, etc.) é retirado da lista activa de escalonamento • tipico time slice ->20msec (Profissional), 120msec (Servidores) • Em um sistema de PARLAMENTAR com n CPUs, n thread simultâneas podem ser corridas O escalonador: rotinas de escalonamento são chamadas quando um evento de escalonamento ocorre: interrupção de hardware para i/o finalizar; entrando em “sleep”; entrando em espera um ou mais objectos…. The quantum ->Cada thread começa com um número de quantum -> 6 em Home/Profissional, 36 em Servidores ->programar o relógio tick, é tipicamente 10 msec ->Quantum da thread é decrementado de 3 on clock tickrelógio ->Isto significa que o quantum é tipicamente 20msec em Home/profissional e 120msec em servidores -> Quantum da thread é decremented de 1 quando espera para completar ->Para thread com prioridade menos que 14 ->Outras thread adquirem um quantum enchido -> Quando Quantum alcança zero (ou menos) -> Adquire a thread e restabeleça o valor de quantum -> tempo de intervalo interrompe quando IRQL > = DPC_LEVEL (2) -> Não carregou a thread -> qd o n existe nenhum Quantum decrementado
Controlo quantum: • Chave de registo:
HKLM\SYSTEM\CCS\Control\PriorityControl\Win32PrioritySeparation
•
Curto vs longo 1=longo; 2=curto: 0.3=predefinido (longo para servidores; curto para profissionais) • Variavel vs Fixo 1=impulsao de prioridade de processos de 1º plano; 2=não impulsao 0.3=predefinido (impulsão(boost) para profissionais, não implusao para servidores) • Impulsao de quantum de primeiro plano (ver tabela)
Opções de desempenho: ->sistema de applet em painel de controlo -> Programas -> Curto,quantums variável ->Falta para profissional -> Serviços de fundo -> Quantums longo e fixo ->Falta para servidores
Prioridade de impulsão: • pode ser especificado no driver ou execução: KeSetEvent( Event, Increment) e IoCompleteRequest( Irp, PriorityBoost) • depois da impulsão, a theard corre para um quantum àquela prioridade. Depois baixa um nível e corre outro quantum, de seguida baixa outro nível … ate voltar a base das prioridades • Os valores de impulsão recomendados estão definidos em and <wdm.h>: #define IO_SERIAL_INCREMENT 2 #define EVENT_INCREMENT 1 #define IO_KEYBOARD_INCREMENT 6 Resolução de inversão de prioridade: ->Inversão de prioridade -> uma theard de alta prioridade espera por algo fexado por uma theard inferior a qual nao pode correr por causa de uma theard de prioridade mediana correndo ->Impulsiona thread para evitar inversão de prioridade ->Linhas que ficam em estado pronto um longo tempo (quatro segundos) adquire um aumento grande para prioridade 15 ->Consegue correr para dois quantums a este aumento especial. Suporte de multiprocessador: • Ideal Processor: todas as threads têm um processador ideal • O valor predefinido é activo em round-robin fazendo parte de cada processo • Pode anular-se com SetTheardIdealProcessor • Quando uma theard está pronta: se o processador ideal esta no modo ocioso (menor esforço), ela corre; se o processador anterior correu no modo ocioso (menor esforço), ela corre; Afinidade dura ->threads podem correr em qualquer CPU a menos que afinidade dura seja fixe para aquela thread
->SetThreadAffinityMask ->A máscara é a bit máscara de CPUs permitido para correr a thread ->default é o proceso de afinidade da mascara que padroniza a todos os processadores ->Chamando SetProcessAffinityMask troca a prioridade da máscara para todas as threads correndo debaixo daquele processo ->E futuro criou a thread naquele processo ->Usando afinidade dura pode resultar threads adquirindo menos tempo de CPU
Waitable objects: -> kernel suporta vários waitable objetos, que podem resultar em uma thread pre-emption -> Processo, thread, Mutex (mutante), timer, ficheiro, Semáforo, Evento (manual reset (notificação) e auto reset (sincronização)), Trabalho, Console, troca notificação >Funções de espera -> Win32: WaitForSingleObject (Ex), WaitForMultipleObjects (Ex), MsgWaitForMultipleObjects (Ex), SignalObjectAndWait ->kernel: KeWaitForSingleObject, KeWaitForMultipleObjects Outros objetos de sincronização: ->Recurso -> Disponível só em kernel mode ->Protege dados com único-escritor, múltiplo-leitor esquema ->Trabalha a IRQL < DISPATCH_LEVEL ->Assim, não pode substituir uma spin lock ->check as funções do DDK ExAcquireResourceSharedLite ->Mutex rápido -> Disponível só em kernel mode ->trabalha apenas como um mutex regular, mas sem prioridade
Objectos de trabalho • Novo objecto do Windows 2000 kernel: o objecto de trabalho permite que um grupo de processos seja gerido como um unidade; os objectos podem ser nomeados, partilhados e seguros; Windows API:
•
-CreateJobObject / OpenJobObject; -AssignProcessToJobObject -TerminateJobObject -SetInformationJobObject O sistema força trabalho de quotas e segurança: limitando o tempo de processos do cpu, afinidades de cpu e prioridades de classes; limites de segurança e limites UI (user interface)