11.04.2013 Views

Resumo sobre os métodos de escalonamento Acontecimentos que ...

Resumo sobre os métodos de escalonamento Acontecimentos que ...

Resumo sobre os métodos de escalonamento Acontecimentos que ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Resumo</strong> <strong>sobre</strong> <strong>os</strong> métod<strong>os</strong> <strong>de</strong><br />

<strong>escalonamento</strong><br />

Quando é invocado o escalonador?<br />

Modo <strong>de</strong> <strong>de</strong>cisão<br />

preemptivo: escalonador chamado periodicamente<br />

(orientado para fatias <strong>de</strong> tempo) ou quando o estado<br />

do sistema muda<br />

não- preemptivo: escalonador chamado quando um<br />

processo termina ou se blo<strong>que</strong>ia<br />

Como é escolhido o processo <strong>que</strong> vai ocupar o CPU?<br />

Avaliação da importância do processo: P = Priority(p)<br />

Regras <strong>de</strong> <strong>de</strong>sempate<br />

aleatórias<br />

cronológicas (FIFO)<br />

cíclica (por rotação - round robin)<br />

02-12-2007 SO - 07/08 1<br />

Tamanho do time-slice<br />

Sistemas interactiv<strong>os</strong> (time-sharing systems)<br />

O tempo <strong>de</strong> resp<strong>os</strong>ta é o critério essencial<br />

Escolha da fatia <strong>de</strong> tempo q (time-slice)<br />

<strong>de</strong>termina o tempo <strong>de</strong> resp<strong>os</strong>ta e o overhead:<br />

quando q → ∞, RR aproxima-se do FIFO<br />

quando q → 0, o tempo perdido em trocas <strong>de</strong><br />

contexto → 100% (logo, produtivida<strong>de</strong> → 0)<br />

quando q >> overhead <strong>de</strong> troca <strong>de</strong> contexto, n<br />

process<strong>os</strong> CPU bound executam<br />

concorrentemente a 1/n da velocida<strong>de</strong> do CPU<br />

02-12-2007 SO - 07/08 3<br />

Comparação <strong>de</strong> algoritm<strong>os</strong><br />

Mo<strong>de</strong>lação <strong>de</strong>terminísitca – pega-se numa<br />

carga <strong>de</strong>finida (workload) e simula-se o<br />

<strong>de</strong>sempenho <strong>de</strong> cada caso<br />

02-12-2007 SO - 07/08 5<br />

Aconteciment<strong>os</strong> <strong>que</strong> afectam o<br />

<strong>de</strong>sempenho do CPU<br />

Trocas <strong>de</strong> contexto: Fim do time slice, blo<strong>que</strong>io ...<br />

Um número excessivo <strong>de</strong> trocas <strong>de</strong> contexto, aumenta<br />

a utilização do CPU e diminui a performance das<br />

aplicações<br />

estimativa do custo <strong>de</strong> uma troca <strong>de</strong> contexto são<br />

10.000 cicl<strong>os</strong> <strong>de</strong> CPU<br />

Excepções/interrupções: faltas <strong>de</strong> página, overflow,<br />

un<strong>de</strong>rflow, emulação <strong>de</strong> vírgula flutuante<br />

switch para modo kernel, salvaguarda d<strong>os</strong> regist<strong>os</strong>,<br />

tratamento da situação<br />

po<strong>de</strong> originar uma troca <strong>de</strong> contexto (p.e. por falta <strong>de</strong><br />

página)<br />

02-12-2007 SO - 07/08 2<br />

Escalonamento por grup<strong>os</strong><br />

Fair Share Scheduler: process<strong>os</strong> são inserid<strong>os</strong><br />

em grup<strong>os</strong>. A cada grupo é atribuído pelo<br />

administrador uma percentagem mínima do<br />

tempo <strong>de</strong> CPU<br />

O tempo <strong>que</strong> sobra é dividido <strong>de</strong> acordo com<br />

as mesmas percentagens<br />

Dentro do grupo é usado o método <strong>de</strong><br />

<strong>escalonamento</strong> normal<br />

02-12-2007 SO - 07/08 4<br />

Métricas <strong>de</strong> ocupação do CPU<br />

Globais<br />

Tamanho da fila READY: valor corrente do número <strong>de</strong><br />

process<strong>os</strong> no estado READY<br />

Carga média (load average): média d<strong>os</strong> últim<strong>os</strong> 1, 5 e<br />

15 minut<strong>os</strong> do tamanho da fila READY<br />

número <strong>de</strong> chamadas ao sistema<br />

número <strong>de</strong> trocas <strong>de</strong> contexto<br />

Locais ao processo<br />

%user, %system, real time, tempo na fila READY<br />

número total <strong>de</strong> chamadas ao sistema e seu tipo<br />

número <strong>de</strong> trocas <strong>de</strong> contexto e <strong>de</strong> CPU (se aplicável)<br />

02-12-2007 SO - 07/08 6<br />

1


O <strong>que</strong> são valores “normais”?<br />

Depen<strong>de</strong> do tipo da aplicação (batch, interactiva,<br />

servidor/cliente, CPU bound ou IO bound). Um ponto<br />

importante é o tempo passado na fila READY<br />

Heurísticas conhecidas para sistemas UNIX<br />

mais <strong>de</strong> 3000 chamadas ao sistema / seg po<strong>de</strong>m levar a<br />

<strong>que</strong> o CPU fi<strong>que</strong> saturado. As trocas <strong>de</strong> contexto <strong>de</strong>vem<br />

ser 1/3 disto<br />

Relação system time/user time<br />

70% user 30 % system OLTP<br />

90% user 10 % systema Computação intensiva<br />

percentagens elevadas <strong>de</strong> tempo <strong>de</strong> sistema junto<br />

com “idle time” po<strong>de</strong>m indicar problemas <strong>de</strong> memória<br />

ou <strong>de</strong> contenção n<strong>os</strong> CPUs<br />

02-12-2007 SO - 07/08 7<br />

Resolução <strong>de</strong> gargal<strong>os</strong> no(s) CPU(s)<br />

Soluções hardware<br />

CPU mais rápido, multiprocessador, mais cache, TLB<br />

maior. Nem todas as aplicações tiram partido <strong>de</strong> um<br />

multiprocessador<br />

Soluções software incluindo afinação do sistema<br />

fair share scheduler, nice, utilização das classes RT,<br />

mudar o time slice, mudar o perfil <strong>de</strong> utilização<br />

(horário, batch), afinida<strong>de</strong> <strong>de</strong> processadores<br />

Optimização da aplicação<br />

optimizações do compilador e “profiling” - reescrita<br />

das rotinas i<strong>de</strong>ntificadas<br />

diminuir o uso <strong>de</strong> chamadas ao sistema “caras”<br />

usar threads para tirar partido do paralelismo real<br />

02-12-2007 SO - 07/08 9<br />

Escalonamento para process<strong>os</strong> “timesharing”<br />

Tod<strong>os</strong><strong>os</strong>process<strong>os</strong>têmigualimportância<br />

O consumo <strong>de</strong> tempo <strong>de</strong> CPU diminui a<br />

priorida<strong>de</strong><br />

A permanênciaemesperaaumentaa<br />

priorida<strong>de</strong><br />

Os process<strong>os</strong> <strong>de</strong>ntro do sistema têm a priorida<strong>de</strong><br />

aumentada (em especial quando se blo<strong>que</strong>iam à<br />

espera <strong>de</strong> I/O)<br />

Com preensão<br />

Modificação externa da priorida<strong>de</strong> (UNIX<br />

nice/renice)<br />

02-12-2007 SO - 07/08 11<br />

Sintomas <strong>de</strong> <strong>que</strong> o gargalo é o CPU<br />

Saturação do CPU<br />

idle time 0 %<br />

user time muito alto<br />

system time muito alto<br />

muitas chamadas ao sistema: criação <strong>de</strong><br />

process<strong>os</strong> (fork/exec são as chamadas ao sistema<br />

mais “caras”, muit<strong>os</strong> pacotes recebid<strong>os</strong><br />

falhas na cache<br />

coerência das caches n<strong>os</strong> multiprocessadores,<br />

provocada por trocas <strong>de</strong> CPU ou activida<strong>de</strong> <strong>de</strong> IPC<br />

Filas ready muito gran<strong>de</strong>s<br />

Espera por recurs<strong>os</strong><br />

02-12-2007 SO - 07/08 8<br />

Escalonamento <strong>de</strong> process<strong>os</strong><br />

no Linux<br />

Linux usa dois algoritm<strong>os</strong> <strong>de</strong> <strong>escalonamento</strong>:<br />

Um para process<strong>os</strong> interactiv<strong>os</strong> (time sharing)<br />

Um para process<strong>os</strong> tempo real<br />

o <strong>escalonamento</strong> <strong>de</strong> longo prazo é externo ao<br />

kernel (comand<strong>os</strong> batch ou nqs)<br />

O algoritmo a aplicar <strong>de</strong>pen<strong>de</strong> da classe <strong>de</strong><br />

<strong>escalonamento</strong> do processo<br />

Para process<strong>os</strong> time-sharing, o Linux usa um<br />

algoritmo com múltiplas filas <strong>de</strong> process<strong>os</strong><br />

pront<strong>os</strong> com priorida<strong>de</strong>s variáveis<br />

02-12-2007 SO - 07/08 10<br />

Escalonamento <strong>de</strong> process<strong>os</strong> "RT"<br />

Dentro d<strong>os</strong> process<strong>os</strong> realtime, o Linux<br />

implementa classes <strong>de</strong> <strong>escalonamento</strong> FIFO e<br />

RR: em amb<strong>os</strong> <strong>os</strong> cas<strong>os</strong>, cada processo tem<br />

uma priorida<strong>de</strong><br />

O escalonador escolhe o processo com maior<br />

priorida<strong>de</strong>: em caso <strong>de</strong> igualda<strong>de</strong>, corre o <strong>que</strong><br />

espera há mais tempo<br />

Na classe FIFO <strong>os</strong> processes executam até<br />

terminarem ou se blo<strong>que</strong>arem (sem preensão)<br />

Os process<strong>os</strong> em RR utilizam uma fatia <strong>de</strong><br />

tempo (com preensão)<br />

02-12-2007 SO - 07/08 12<br />

2


Process<strong>os</strong> RT<br />

Priorida<strong>de</strong> mais elevada <strong>que</strong> process<strong>os</strong> “time sharing”<br />

Características dum processo tempo real (RT)<br />

objectivo: cumprir “<strong>de</strong>adlines”<br />

pouca ocupação <strong>de</strong> memória, ligado com bibliotecas<br />

estáticas<br />

“locked” em memória (tempo <strong>de</strong> arran<strong>que</strong> minimizado)<br />

corre durante pouco tempo - passa o processamento<br />

pesado para um processo “normal”<br />

foi objecto <strong>de</strong> “<strong>de</strong>bug” sistemático<br />

corre pouco fre<strong>que</strong>ntemente<br />

02-12-2007 SO - 07/08 13<br />

Facilida<strong>de</strong>s típicas d<strong>os</strong> SOs para<br />

Tempo-Real<br />

Trocas <strong>de</strong> contexto rápidas<br />

Pe<strong>que</strong>na ocupação <strong>de</strong> memória (memory footprint)<br />

Resp<strong>os</strong>ta muito rápida a interrupções do exterior<br />

Suporte <strong>de</strong> multiprogramação (Multitasking) com<br />

disp<strong>os</strong>itiv<strong>os</strong> <strong>de</strong> comunição entre process<strong>os</strong><br />

Minimização d<strong>os</strong> interval<strong>os</strong> <strong>de</strong> tempo em <strong>que</strong> as<br />

interrupções estão <strong>de</strong>sligadas (disabled)<br />

“Tasks” po<strong>de</strong>m adormecer por períod<strong>os</strong> fix<strong>os</strong> <strong>de</strong><br />

tempo (melhor precisão <strong>que</strong> num sistema generalista)<br />

Alarmes e temporizadores<br />

Minimização da Latência<br />

Latência <strong>de</strong> evento éo tempo <strong>que</strong><strong>de</strong>correentre<br />

a ocorrência do evento e a execução da rotina <strong>que</strong><br />

o trata.<br />

02-12-2007 SO - 07/08 17<br />

Escalonamento tempo real<br />

Os process<strong>os</strong> RT po<strong>de</strong>m ter a priorida<strong>de</strong> fixa<br />

(HP-UX, W2K, Linux)<br />

Vári<strong>os</strong> algoritm<strong>os</strong> <strong>de</strong> <strong>escalonamento</strong> entre<br />

process<strong>os</strong> RT<br />

POSIX RTsched (Real-Time Scheduler)<br />

SCHED_FIFO - sem preensão<br />

SCHED_RR - round robin <strong>de</strong>ntro da mesma<br />

priorida<strong>de</strong><br />

SCHED_RR2 - fatia <strong>de</strong> tempo <strong>de</strong>pen<strong>de</strong> da<br />

priorida<strong>de</strong><br />

02-12-2007 SO - 07/08 14<br />

Característics <strong>de</strong> SOs para “hard real time”<br />

Determinismo<br />

As operações são executadas em temp<strong>os</strong> fix<strong>os</strong><br />

pré-<strong>de</strong>terminad<strong>os</strong> ou a interval<strong>os</strong> <strong>de</strong> tempo<br />

pré-<strong>de</strong>terminad<strong>os</strong><br />

Limite ao tempo <strong>que</strong> SO <strong>de</strong>mora a fazer<br />

“acknowledge” a uma interrupção<br />

Tempo <strong>de</strong> resp<strong>os</strong>ta<br />

Quanto tempo, <strong>de</strong>pois do “acknowledgment”,<br />

começa a correr a rotina <strong>de</strong> atendimento<br />

Quanto tempo <strong>de</strong>mora a correr a tarefa <strong>que</strong><br />

trata o evento<br />

Latência <strong>de</strong> <strong>de</strong>spacho<br />

Latência <strong>de</strong> <strong>de</strong>spacho éo tempo <strong>que</strong>o<br />

escalonador necessita para passar um processo a<br />

pronto e colocar a correr outro.<br />

02-12-2007 SO - 07/08 18<br />

3


Escalonamento para tempo real<br />

Estático baseado em tabelas (table-driven)<br />

<strong>de</strong>termina em tempo <strong>de</strong> execução o momento em <strong>que</strong><br />

um processo começa (ou recomeça) a executar<br />

Estático com preensão e baseado nas priorida<strong>de</strong>s<br />

Dinâmico baseado no cumprimento <strong>de</strong> temp<strong>os</strong> limite<br />

(<strong>de</strong>adlines)<br />

Escalonamento com preensão baseado em priorida<strong>de</strong>s<br />

po<strong>de</strong> incluir preensão imediata: permite <strong>que</strong> um<br />

processo responda a event<strong>os</strong> muito rapidamente<br />

Problema da inversão das priorida<strong>de</strong>s<br />

Em qual<strong>que</strong>r sistema com priorida<strong>de</strong>s<br />

Um processo p2 po<strong>de</strong> blo<strong>que</strong>ar por muito tempo um<br />

processo <strong>de</strong> mais alta priorida<strong>de</strong> p1<br />

se p1 necessita <strong>de</strong> um recurso <strong>de</strong>tido por p2, não<br />

po<strong>de</strong> interromper o processo <strong>de</strong> mais baixa<br />

priorida<strong>de</strong> <strong>de</strong>ntro da respectiva SC (secção crítica)<br />

Soluções:<br />

Executar a SC à priorida<strong>de</strong> do processo p1 <strong>que</strong> também<br />

usa a SC<br />

Herança dinâmica <strong>de</strong> priorida<strong>de</strong>s:<br />

p2 está na SC<br />

priorida<strong>de</strong>(p1) > priorida<strong>de</strong>(p2)<br />

p1 tenta entrar na SC ⇒ p2 herda a priorida<strong>de</strong> <strong>de</strong><br />

p1 enquanto executa a SC<br />

02-12-2007 SO - 07/08 21<br />

SMP:Symmetric Multiprocessor<br />

Memória Partilhada<br />

Processor Processor Processor<br />

Cache Cache<br />

Cache<br />

Main<br />

Memory<br />

I/O<br />

Subsystem<br />

. . .<br />

Exemplo: Escalonamento baseado em<br />

Deadlines<br />

As aplicações <strong>de</strong> tempo real não estão interessadas<br />

em velocida<strong>de</strong> absoluta mas na conclusão <strong>de</strong> tarefas<br />

num dado prazo limite (<strong>de</strong>adline)<br />

Escolher para correr a tarefa com a “<strong>de</strong>adline” mais<br />

próxima<br />

maximiza a p<strong>os</strong>sibilida<strong>de</strong> <strong>de</strong> cumprimento <strong>de</strong>ssas<br />

“<strong>de</strong>adlines”<br />

Tem <strong>de</strong> levar em conta todas as <strong>de</strong>adlines pen<strong>de</strong>ntes e<br />

temp<strong>os</strong> <strong>de</strong> tratamento <strong>de</strong> cada processo<br />

Escalonamento para múltipl<strong>os</strong><br />

processadores<br />

Problema com várias vertentes e longe <strong>de</strong><br />

estar resolvido<br />

Soluções para:<br />

CPUs homogéne<strong>os</strong><br />

Multiprocessamento simétrico: qual<strong>que</strong>r CPU<br />

po<strong>de</strong> executar qual<strong>que</strong>r processo <strong>que</strong> esteja<br />

na fila READY<br />

Tempo <strong>de</strong> acesso uniforme à memória (UMA)<br />

02-12-2007 SO - 07/08 22<br />

Partilha da carga (load sharing)<br />

Solução assimétrica: <strong>de</strong>cisões <strong>de</strong> <strong>escalonamento</strong><br />

pertencem a um só CPU. Evita o acesso paralelo à fila<br />

READY<br />

cada CPU uma fila ready (ou conjunto <strong>de</strong> filas)<br />

Solução simétrica (SMP): Fila Ready comum a tod<strong>os</strong><br />

<strong>os</strong> CPUs<br />

Os CPUs fazem auto-<strong>escalonamento</strong>: quando um CPU<br />

fica livre, vai à fila READY comum escolher um<br />

processo para correr<br />

É preciso garantir <strong>que</strong> a manipulação da fila READY é<br />

uma secção crítica em paralelismo real<br />

Afinida<strong>de</strong> <strong>de</strong> caches: <strong>de</strong> preferência,um<br />

processo/threads corre sempre no mesmo CPU<br />

02-12-2007 SO - 07/08 24<br />

4


Afinida<strong>de</strong>s em multiprocessadores<br />

SMP<br />

Filh<strong>os</strong> são colocad<strong>os</strong> no mesmo CPU <strong>que</strong> o pai<br />

periodicamente (por exemplo <strong>de</strong> 1 em 1s) a<br />

carga <strong>de</strong> cada CPU é analisada e se a<br />

diferença é significativa são movid<strong>os</strong> um ou<br />

mais process<strong>os</strong><br />

quando um processo passa <strong>de</strong> blo<strong>que</strong>ado a<br />

pronto: é colocado na fila READY do mesmo<br />

processador em princípio, mas po<strong>de</strong> mudar se<br />

a carga estiver <strong>de</strong>siquilibrada<br />

02-12-2007 SO - 07/08 25<br />

Evolução para um kernel multiprocessador<br />

Suporte hardware para secções críticas<br />

Test and set, Spin Locks<br />

Não basta ter as interrupções fechadas, para<br />

garantir secções críticas <strong>de</strong>ntro do kernel<br />

A eficiência da exploração d<strong>os</strong> múltipl<strong>os</strong><br />

processadores está ligada à granularida<strong>de</strong> d<strong>os</strong><br />

“locks” <strong>de</strong>ntro do kernel:<br />

kernel pouco reentrante: “lock” único <strong>que</strong><br />

serializa o acesso ao kernel<br />

Pouc<strong>os</strong> “locks” por longo tempo<br />

Muit<strong>os</strong> “locks” por pouco tempo (preferível)<br />

02-12-2007 SO - 07/08 27<br />

Problemas d<strong>os</strong> multiprocessadores<br />

Contenção no acesso a recurs<strong>os</strong>- locks e spin locks<br />

(para recurs<strong>os</strong> <strong>de</strong>tid<strong>os</strong> durante pouco tempo)<br />

Coerência das caches- <strong>de</strong>saparece quando um<br />

processo muda <strong>de</strong> CPU<br />

Priorida<strong>de</strong>s - não há a garantia <strong>que</strong> <strong>os</strong> N process<strong>os</strong> <strong>de</strong><br />

priorida<strong>de</strong> mais elevada estejam a correr n<strong>os</strong> N CPUs<br />

(fila READY por CPU)<br />

Não escalabilida<strong>de</strong> resultante <strong>de</strong> sincronização entre<br />

process<strong>os</strong> da aplicação<br />

Deadlocks e err<strong>os</strong> <strong>de</strong> programação mais prováveis<br />

uma vez <strong>que</strong> há paralelismo real<br />

02-12-2007 SO - 07/08 29<br />

Afinida<strong>de</strong> <strong>de</strong> processadores<br />

Fixa um processo num dado CPU- utilizado para<br />

acelerar comunicação entre process<strong>os</strong> (por exemplo<br />

minimizando <strong>os</strong> problemas <strong>de</strong> coerência <strong>de</strong> caches)<br />

Gang scheduling: um grupo <strong>de</strong> process<strong>os</strong> é atribuído a<br />

um grupo <strong>de</strong> processadores<br />

<strong>os</strong> threads da mesma aplicação são colocad<strong>os</strong> em CPUs<br />

distint<strong>os</strong> o <strong>que</strong> aumenta o paralelismo e diminui <strong>os</strong><br />

problemas <strong>de</strong> troca <strong>de</strong> contexto, coerência <strong>de</strong> caches<br />

e falhas no TLB<br />

02-12-2007 SO - 07/08 26<br />

Spinning versus Switching<br />

Nalguns cas<strong>os</strong> o CPU tem <strong>de</strong> esperar<br />

p.e. espera para adquirir acesso a uma lista<br />

Há várias soluções:<br />

spinning gasta cicl<strong>os</strong> <strong>de</strong> CPU<br />

switching também usa cicl<strong>os</strong> <strong>de</strong> CPU<br />

É p<strong>os</strong>sível tomar <strong>de</strong>cisões diferentes cada vez<br />

<strong>que</strong> se encontra um “mutex” fechado<br />

02-12-2007 SO - 07/08 28<br />

5

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!