22
Processos e Threads no Windows Bruno Affonso Diego Chiquito Ruan Berté

Bruno Affonso Diego Chiquito Ruan Berté. O código de Escalonamento no Windows é implementado no Kernel. A rotina que desempenha as tarefas do Escalonador

Embed Size (px)

Citation preview

Page 1: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Processos e Threads no Windows

Bruno AffonsoDiego Chiquito

Ruan Berté

Page 2: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

O código de Escalonamento no Windows é

implementado no Kernel. A rotina que desempenha as tarefas do

Escalonador é chamado de Despachador do Kernel.

Determina qual Thread deve ser executada. Troca de contexto: salva o estado da Thread

em execução > carregar o estado de outra Thread > e iniciar a execução desta nova Thread.

Escalonador

Page 3: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

O Windows escalona usando as threads. Processos não executam, apenas fornecem

recursos e um contexto para a execução das suas Threads.

Se um processo A tiver 10 Threads executáveis, um Processo B tiver 2 Threads executáveis, e todas as 12 Threads estiverem na mesma prioridade, cada Thread teoricamente receberia 1/12 do tempo da CPU (Windows não daria 50% do tempo da CPU para o processo A e 50% para o processo B).

Escalonador

Page 4: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

O escalonador mantém uma fila de Threads

executáveis para cada nível de prioridade. Estas são chamadas ready Threads (threads prontas). Quando o processador se torna disponível, o sistema realiza a troca de contexto.

Salva contexto da Thread que acabou de ser executada > coloca a Thread que acabou de terminar sua execução no final da fila de sua prioridade > encontra a fila de maior prioridade que contém ready Threads > retira a Thread no início da fila, carregar seu contexto, e executa.

Trocas de Contexto

Page 5: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

As Threads são programadas para executar

baseadas na sua Prioridade. Os níveis de prioridade vão de 1 a 15 (menor

prioridade) e de 16 a 31 (maior prioridade). O sistema trata todas as threads que possuem a

mesma prioridade como iguais. O sistema atribui frações de tempo para as threads

de maior prioridade. Se nenhuma delas estiver pronta para executar, são

atribuídas fatias de tempo para as próximas threads de maior prioridade.

Níveis de Prioridade

Page 6: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Se uma thread de maior prioridade ficar disponível

para execução, o sistema deixa de executar a thread de prioridade baixa (sem deixar que ela termine de usar seu tempo), e atribui uma fatia de tempo completa para a thread de maior prioridade.

A prioridade de cada thread é determinada pelos seguintes critérios: A classe de prioridade do processo; O nível de prioridade da thread dentro da classe de

prioridade do seu processo.

Níveis de Prioridade

Page 7: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Cada thread tem uma prioridade dinâmica, esta

prioridade é usada pelo escalonador para determinar qual thread executar.

O sistema pode aumentar e diminuir a prioridade dinâmica para assegurar que esta thread seja executada.

As threads com prioridade base entre 16 e 31(tempo real) não sofrem aumento de prioridade por parte do sistema, apenas threads com prioridade base entre 1 e 15 recebem aumento dinâmico de prioridade.

Aumento de Prioridade

Page 8: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Depois de elevar a prioridade dinâmica de

uma thread, o escalonador reduz sua prioridade em um nível toda vez que a thread usa completamente sua fatia de tempo, até que a thread volte a sua prioridade base.

A intenção desses ajustes é tentar prover uma capacidade de resposta mais justa possível nos cenários de escalonamento, mas como qualquer algoritmo de escalonamento, estes ajustes não são perfeitos e nem sempre beneficia todas as aplicações.

Aumento de Prioridade

Page 9: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Tem-se uma thread de prioridade 7 que está em

execução, impedindo uma thread de prioridade 4 de receber tempo da CPU entretanto, uma thread de prioridade 11 está esperando por algum recurso que a thread de prioridade 4 bloqueou. Mas como a thread de prioridade 7 está tomando todo o tempo da CPU, a thread de prioridade 4 nunca irá executar por tempo suficiente para terminar o que quer que ela esteja fazendo e disponibilizar o recurso que bloqueia a thread de prioridade 11. Como o Windows lida com essa situação?

Aumento de Prioridade

Page 10: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Uma vez por segundo, o "Gerenciador de

Equilíbrio" (Balance Set Manager), uma thread de sistema que existe principalmente para realizar funções de gerenciamento de memória, procura filas prontas de quaisquer threads que estiveram em estado de "pronto" (isto é, que não executaram ainda) por 4 segundos.

Se ele encontrar essa thread, o Gerenciador de Equilíbrio aumenta a prioridade da thread para 15.

Balance Set Manager

Page 11: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Uma vez que a thread for executada, a

prioridade é imediatamente reduzida para sua prioridade base original. Se a thread não houver terminado e uma thread de prioridade maior estiver pronta para executar, a thread que foi reduzida volta para a fila "pronta", onde, novamente, esta fica disponível para um novo aumento se ficar lá (na fila) por mais 4 segundos.

Balance Set Manager

Page 12: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

O Gerenciador de Equilíbrio não verifica

realmente todas as threads sempre que é executado. Para minimizar o tempo de CPU utilizado, ele verifica somente 16 threads prontas, se houver mais threads naquele nível de prioridade, ele se lembra onde parou e inicia o próximo passo.

Além disso, ele aumentará apenas dez threads em cada passagem - se ele encontrar dez threads que mereçam esse aumento, ele para a verificação naquele ponto e inicia na próxima passagem.

Balance Set Manager

Page 13: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Nesse cenário de escalonamento, uma thread

com prioridade menor é interrompida quando uma thread com prioridade maior fica pronta para executar.

Quando uma thread é interrompida, ela é posta no começo da fila de threads prontas para a prioridade que estava executando.

Preempção

Page 14: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Inicializado: uma thread começa no estado

inicializado durante sua criação. Pronto: uma vez criada, entra no estado Pronto,

nesse estado as threads estão esperando para usar um processador.

Reserva: a thread entra no estado de reserva quando o despachador decide em qual processador será executada, aguardando a sua vez por aquele processador.

Execução: uma vez obtido o processador a thread entra em estado de Execução.

Estados de uma Thread

Page 15: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Terminado: quando a thread termina de executar. Espera: estado em que a thread precisa de alguma

entrada ou saída. Transição: quando a thread concluir sua espera, ou ela

volta para o estado pronto ou entra no estado de transição. A pilha de núcleo de uma thread no estado de transição foi paginada para fora da memória (por exemplo, porque não executou por um período de tempo e o sistema precisou de memória para outros propósitos).

Desconhecido: o sistema coloca uma thread no estado desconhecido quando não está seguro do estado da thread (usualmente devido a um erro)

Estados de uma Thread

Page 16: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Corta despesas compartilhando e reciclando

threads. Mantém limite sobre o número de threads

ativas. Provê gerenciamento das threads de trabalho.

Thread Pools

Page 17: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Pthreads-w32 – Diferenças:

Tipos de dados como pthread_thread_t, pthread_mutex_t, e pthread_cond_t, são todos utilizados como HANDLE no Win32.

Só há uma função necessária para fazer uma thread bloquear enquanto espera por um objeto: WaitForSingleObject. Portanto, somente um conjunto de parâmetros necessita ser conhecido, independente se o código está esperando em uma thread, um mutex, um semáforo, ou um evento.

No POSIX, se uma thread sinaliza uma condição, e não há uma thread esperando, o sinal é perdido. No Windows, se um evento é sinalizado, a thread continua sinalizando até que o evento seja alterado.

POSIX vs. Windows

Page 18: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Mudanças no kernel

Figura 1 Figura 2

Windows Vista

Page 19: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Thread Pool modo Usuário

Windows Vista e 7

Page 20: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Thread Pool melhorada:

Inserção de Heurística; Possível atraso na criação de novas

threads; Prevenção de thread explosion.

Windows 8

Page 21: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

Como um sistema operacional de multiprocessamento

preemptivo, o Windows CE suporta até 32 processos rodando simultaneamente no sistema.

Windows CE o Windows Mobile provêm 256 níveis de prioridade para as threads. Para assinalar níveis de prioridade, o Windows CE usa CeSetThreadPriority and CeGetThreadPriorityfunctions. CeSetThreadPriority define a prioridade para uma específica thread. CeGetThreadPriority retorna 0 (zero) como a maior prioridade e

255 como a menor.

Windows CE e Mobile

Page 22: Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador

http://www.albahari.com/threading/ https://msdn.microsoft.com/en-us/library/windows/desktop/

ms686760(v=vs.85).aspx http://jmhartsoftware.com/opensource.htm https://software.intel.com/en-us/blogs/2006/10/19/why-

windows-threads-are-better-than-posix-threads https://technet.microsoft.com/pt-br/magazine/

2007.02.vistakernel.aspx http://channel9.msdn.com/Shows/Going+Deep/Inside-

Windows-8-Pedro-Teixeira-Thread-pool https://msdn.microsoft.com/en-us/library/aa450600.aspx https://msdn.microsoft.com/en-us/library/aa911506.aspx

Referências