Algoritmos de Escalonamento de Tarefas
1/19
INTRODUÇÃO
Um sistema de tempo real é definido como um sistema em que a precisão e a
correcção finais dependem não só do resultado computacional, mas também do tempo
consumido para produzir esses resultados.
Hoje em dia encontramo-nos rodeados de sistemas de tempo real, desde simples
sistemas de controlo de uma linha de montagem até ao controlo dos sistemas de voo dos
aviões e futuramente no controlo das estações espaciais.
A maior parte dos sistemas baseiam-se em informação conhecida à priori –
sistemas estáticos – o que leva a elevados custos de produção e manutenção. A próxima
geração de sistemas de tempo real para situações críticas (hard real time) serão
desenvolvidas de forma a serem dinâmicas, previsíveis e flexíveis.
Quando temos que levar em linha de conta o tempo, como é o caso dos sistemas
de tempo real, um dos principais problemas que se nos depara consiste em “arrumar” o
conjunto de tarefas que compõe o sistema dentro de um determinado período de tempo.
O escalonamento de tarefas envolve a distribuição de recursos e tempo pelas
tarefas de forma a serem atingidos certos patamares de performances. Este é talvez o
assunto mais estudado no âmbito dos sistemas de tempo real e é também aquele que se
apresenta com mais possibilidades de aprofundamento visto que é um tema em
constante desenvolvimento.
A forma de medir a performance de um sistema de escalonamento depende do
propósito do sistema de tempo real. Isto faz com que haja um sem número de formas de
avaliar essas performances já que em cada situação temos que dar mais ênfase a um
determinado aspecto do sistema. Enquanto num algoritmo estático prevalece a
necessidade de diminuir o tamanho da tabela (horário), num sistema dinâmico temos
que dar mais importância à minimização do tempo de resposta.
Esta variedade de métricas que existem torna mais difícil a comparação de
algoritmos de escalonamento. Outro aspecto que torna esta comparação menos clara,
são as características das tarefas que cada sistema executa. As tarefas podem ser
associadas a tempos de computação, utilização de recursos, prioridades, precedências e,
como não podia deixar de ser, tempo. Se uma tarefa for periódica a sua frequência é
importante, se for esporádica então dá-se importância ao tempo limite de execução
(deadline).
Do que vimos até agora podemos concluir que uma das principais características
de um sistema de tempo real é a previsibilidade. A análise do escalonamento tem que
Algoritmos de Escalonamento de Tarefas
2/19
ser feita de modo a prever se o conjunto de tarefas a escalonar vai ou não cumprir o
tempo limite de execução. Aparecem assim vários paradigmas do escalonamento que
dependem de :
•
Se um sistema faz ou não a análise do escalonamento.
•
Em caso afirmativo, este é estático ou dinâmico?
•
O resultado da análise produz uma tabela na qual são indicadas todas as
tarefas a executar?
Baseado-nos nestes pontos podemos identificar os seguintes tipos de algoritmos :
•
Algoritmos estáticos geridos por uma tabela – Estes algoritmos são
estáticos ou seja, não há alterações ao longo da execução, e as tarefas a
executar
estão
indicadas
numa
tabela
que
o
algoritmo
consulta
constantemente.
•
Algoritmos estáticos preemptivos – aqui a diferença para o anterior reside na
inexistência de qualquer tabela. Durante a execução as tarefas são executadas
começando pela de maior prioridade.
•
Algoritmos dinâmicos planeados – ao contrário dos anteriores aqui o
algoritmo não executa todas as tarefas que chegam ao processador, executa
apenas aqueles que é possível concluir dentro do prazo.
•
Algoritmos dinâmicos de “melhor esforço” – nestes algoritmos não se
analisa a executabilidade da tarefa, o sistema tenta apenas cumprir todos os
deadlines, pode por isso acontecer que uma tarefa seja abortada durante a
execução.
Algoritmos de Escalonamento de Tarefas
3/19
STATIC CYCLIC SCHEDULING
(Escalonamento Estático Cíclico - EEC)
Esta é talvez a mais antiga forma de escalonamento. É um tipo de escalonamento
off-line, que só suporta tarefas periódicas.
O padrão de execução das tarefas é armazenado num calendário, após ter sido
determinado por um algoritmo configurador. Durante a execução o programa de
escalonamento segue à risca a informação contida no calendário.
A primeira questão a surgir prende-se com o tamanho da tabela e a quantidade de
memória que ela irá ocupar, pois com o crescente número de vezes que as tarefas se
executariam, ela tornar-se-ia gigantesca. Na realidade não é isto que se verifica. O que
acontece é que o programa percorre toda a tabela e quando atinge o seu fim regressa ao
início do calendário dando assim origem ao nome de escalonamento cíclico. O período
de repetição é dado pelo mínimo múltiplo comum (m.m.c.) entre os períodos de cada
uma das tarefas ( T= mmc (ti ) ). Vai-se apresentar de seguida um cronograma que
demonstra do escalonamento de cinco tarefas utilizando este tipo de algoritmo :
Tarefa
T
C
A
25
10
B
25
8
C
50
5
D
50
4
E
100
2
Legenda :
T : Período
C : Tempo de computação
Algoritmos de Escalonamento de Tarefas
4/19
Uma vez que o algoritmo de execução é tão simples, a análise do cumprimento
dos deadlines também efectuada de uma forma simples. É apenas necessário percorrer o
calendário para verificar que os requisitos temporais de cada tarefa são obedecidos. O
âmago da questão prende-se então com o algoritmo de escalonamento off-line utilizado
para gerar a tabela.
Podemos encontrar vários algoritmos que efectuam essa operação, mas antes de
entrarmos nesse assunto temos de encontrar um modelo que represente este sistema de
escalonamento.
Não é necessário criar restrições ao modelo, estas surgem das limitações do
algoritmo e devidas ao escalonamento estático.
Uma vez que a execução das tarefas é pré-planeada só podemos permitir tarefas
periódicas, pois as esporádicas seriam de difícil tratamento e ocupariam mais tempo do
aquele necessário para a sua execução - o seu tratamento seria feito através de polling, o
que faria aumentar o tempo de execução (polling+execução ).
Outra limitação diz respeito ao tamanho da tabela. Esta não pode ocupar muito
espaço de memória uma vez que esta é um recurso muito limitado. A tabela deve ser
percorrida no mais pequeno período de tempo possível de forma que o regresso seu ao
início seja feito sem introduzir estagnações na execução.
Como vimos anteriormente o período mínimo de execução das tarefas é-nos dado
através do conceito de mínimo múltiplo comum do período das tarefas em questão. Esta
abordagem pode levar à obtenção de períodos de execução muito superiores ao
necessário e consequentemente a um calendário maior. A forma normalmente utilizada
para resolver esta situação consiste em alterar o valor dos períodos das tarefas –
normalmente diminuí-los – de forma a torná-los múltiplos simples uns dos outros,
tornando assim a tabela mais pequena. Em contrapartida este processo provoca o
aumento da utilização do processador e torna os períodos de execução das tarefas mais
pequenos que o necessário.
O algoritmo construtor da tabela é avaliado pela sua performance. Um modelo
simples (tarefas periódicas e independentes) pode ser facilmente resolvido através deste
tipo de escalonamento, mas podemos criar um modelo mais complexo introduzindo o
conceito de partilha de dados por duas tarefas. Neste caso o algoritmo tem que garantir a
execução de uma tarefa, que esteja a aceder a esses dados,
interrupção.
não permitindo a sua
Algoritmos de Escalonamento de Tarefas
5/19
ESCALONAMENTO DE PRIORIDADES FIXAS.
- Escalonamento “RATE MONOTONIC”.
Este tipo de escalonamento começou a ser desenvolvido no início da década de
70, principalmente a partir do aparecimento de um artigo da autoria de C. L. Liu e J. W.
Layland.
No escalonamento de prioridade fixa o controlador do processo tem que garantir
que é a tarefa de prioridade mais alta que está a ser executada em qualquer altura.
Basicamente o funcionamento pode descrever-se da seguinte forma :
Se tivermos uma tarefa de baixa prioridade a ser executada, no
momento em que chaga uma tarefa de prioridade mais alta a execução
da primeira é interrompida para dar lugar à exe cução da outra
(preempção). Se durante a execução desta tarefa por pedida a
execução de outra de prioridade intermédia o processador continua a
executar a tarefa de prioridade mais elevada e só depois de a terminar
é que vai iniciar a execução da tarefa de prioridade intermédia.
A tarefa de prioridade reduzida será executada no fim e só apenas
se não aparecer não nenhuma de prioridade mais elevada.
A análise de um algoritmo de escalonamento requer um modelo onde se
consideram os aspectos mais relevantes para o comportamento do sistema. No estudo
deste algoritmo vamos considerar os seguintes aspectos para efectuar a pretendida
modelização :
- Todas as tarefas são periódicas.
- Os períodos são iguais aos tempos limite (deadlines).
- As tarefas não podem autobloquear-se ou auto-suspender-se.
Outra consideração que devemos efectuar consiste no modo como as prioridades são
determinadas. Neste caso quanto menor for o período da tarefa maior será a sua
prioridade, ou seja estas são determinadas de acordo com o período (RATE
MONOTONIC).
Outros aspectos levados em consideração no desenvolvimento deste tipo de
escalonamento, embora desnecessários, foram a assumpção que as tarefas tinham que
Algoritmos de Escalonamento de Tarefas
6/19
ser periódicas e que os tempos de execução das tarefas deveriam ser constantes.
Resumindo, este algoritmo efectua um escalonamento preemptivo e de prioridades
fixas.
Como podemos verificar se um conjunto de tarefas é escalonável ?
Uma possibilidade de verificar a escalonabilidade de um conjunto de tarefas pode
ser através da utilização do seguinte teste :
(
)
 Ci 
1
 ≤ n 2 n − 1
i =1  i 
n
∑  T
n à n.º de tarefas a
escalonar
Mas a análise efectuada através desta expressão não é exacta. A situação da
desigualdade não se verificar não significa que as tarefas não sejam escalonáveis.
Vai-se apresentar de seguida um exemplo demonstrativo da falibilidade deste
método :
Considere-se o seguinte conjunto de tarefas :
TAREFA
T
D
C
PRIORIDADE
A
52
52
12
BAIXA
B
40
40
10
MÉDIA
C
30
30
10
ALTA
Através do cálculo do somatório indicado na expressão obtemos uma taxa de
utilização (U) de 81.41%. Calculando o segundo membro da inequação chegamos ao
valor 77.98%. concluí-se então que, segundo este teste, as tarefas não são escalonáveis
podendo verificar-se falhas no cumprimento dos deadlines. No entanto estas tarefas são
escalonáveis, pois se todas as tarefas cumprirem os prazos na situação mais difícil
(invocação simultânea de todas as tarefas) então os deadlines serão cumpridos. É esta
situação que se apresenta de seguida :
Algoritmos de Escalonamento de Tarefas
7/19
Invocação
Fim de execução
Preempção
Como se verifica conseguiu-se efectuar o escalonamento de todas as tarefas –
todas cumprem os deadlines – apesar do teste de escalonamento indicar o contrário.
- Análise Exacta.
Em 1986 dois investigadores – Mathai Joseph e Paritosh Pandya –
desenvolveram um modelo de análise exacta do algoritmo de escalonamento que foi
referido previamente.
Neste modelo foi introduzido o conceito de tempo de resposta de uma tarefa na
pior situação, ou seja o tempo necessário para levar a cabo uma tarefa na pior das
hipóteses.
Uma vez calculado este tempo o teste para verificar a possibilidade de escalonar
um determinado conjunto de tarefas é simples. É apenas necessário que o tempo de
resposta do pior caso seja inferior ao tempo limite ( deadline ).
Com isto podemos eliminar duas restrições do escalonamento através de
prioridades fixas que eram a necessidade dos períodos das tarefas serem iguais aos
tempos limite e a incapacidade de lidar com tarefas esporádicas ( não-periódicas ). A
primeira verifica-se porque, como é sabido, podemos comparar o tempo de resposta na
pior situação com outro valor e verificar se o primeiro é suficientemente pequeno de
maneira a ser possível escalonar as tarefas. Quanto às tarefas esporádicas este modelo
lida com elas com relativa facilidade. Como já vimos anteriormente uma tarefa
Algoritmos de Escalonamento de Tarefas
8/19
esporádica é aquela que é provocada por um acontecimento atípico ao processo. No
algoritmo apresentado inicialmente a uma tarefa deste género seria atribuído um
deadline elevado ou um período muito pequeno o que resultaria, aquando da análise das
tarefas, numa impossibilidade de efectuar o seu correcto escalonamento, o que na
realidade não era verdade, já que este podia ser realizado.
Vai-se de seguida analisar a expressão que caracteriza este modelo :
Ri = C i +
 Ri 
∑  Cj
∀ j∈hp (i )  T j 
hp(i) é o conjunto de
tarefas de prioridade
superior à de i.
x
é a função tecto
que nos dá o inteiro mais
pequeno maior ou igual
a x.
Esta expressão lança logo à partida a dúvida da sua resolução, uma vez que a
incógnita ( Ri ) aparece em ambos os membros da equação.
A resolução deste problema passa pela criação de uma relação recursiva, onde
uma iteração serve para calcular valores de Ri que respondam à equação. O valor que
interessa é o mais pequeno.
Podemos então transformar a equação de forma a obtermos o seguinte :
Rin +1 = C i +
 Rin 
∑  Cj
∀ j ∈hp ( i )  T j 
O termo Rin+1 é a (n+1)-ésima aproximação ao pior tempo de resposta Ri.
Podemos ver facilmente que as aproximações vão sendo cada vez maiores até que o
resultado da iteração se torne convergente ou exceda algum limite. As iterações são
iniciadas com qualquer valor menor ou igual que Ri, por exemplo Rio =02 .
Através desta análise o valor de Ri só é válido se for menor ou igual ao período
dessa tarefa, isto porque se o tempo de resposta for maior que o período então uma
tarefa i poderia ser atrasada devido a uma invocação prévia de si mesma. Quer isto
também dizer que em cada tarefa o tempo limite tem que ser menor ou igual ao período.
Vamos agora aplicar esta análise ao conjunto de tarefas que já tínhamos referido
anteriormente :
Algoritmos de Escalonamento de Tarefas
TAREFA
A
B
C
9/19
T
52
40
30
D
52
40
30
C
12
10
10
Primeiro que tudo temos que definir as prioridades que vamos atribuir às tarefas.
Uma vez que estamos a caracterizar o método rate monotonic vamos utilizá-lo para esse
efeito. Desta forma a tarefa de maior prioridade será a C, seguida da B e finalmente a
tarefa A.
Vamos calcular RA primeiro. O conjunto de tarefas de prioridade superior a A e
formado por B e C. Assim as aproximações serão dadas por :
 R0 
R0 
R 1A = C A +  A  C B +  A C C = C A = 12
 TB 
 TC 
 12 
 12 
R A2 = C A +  C B +  C C = 32
T B 
 TC 
 32 
 32 
R 3A = C A +  C B +  C C = 42
T B 
 TC 
 42 
 42 
R A4 = C A +  C B +  C C = 52
T B 
 TC 
R 5A = 52
como se pode verificar a partir da quinta aproximação os resultados começam a
convergir, por isso RA=52.
Seguindo o mesmo processo obtemos RB=20 e RC=10.
Então podemos acrescentar à tabela inicial uma coluna com os piores tempos de
resposta de cada tarefa :
TAREFA
A
B
C
T
52
40
30
D
52
40
30
C
12
10
10
R
52
20
10
Algoritmos de Escalonamento de Tarefas
10/19
Como se pode ver na tabela anterior este conjunto de tarefas é escalonável, o que
vem contradizer o método inicial (Liu e Layland).
Este tipo de aproximação serve perfeitamente, por enquanto, os nossos propósitos.
É-nos possível alcançar os três objectivos a que nos propomos sempre que desejamos
efectuar um escalonamento de um dado conjunto de tarefas (configuração, análise e
execução). A configuração consiste em determinar as prioridades das tarefas (neste caso
menor período => maior prioridade). Até agora vimos dois exemplos de análise, o teste
proposto no estudo inicial de Liu e Layland e a análise exacta que acabámos de expôr.
Finalmente a execução consiste em realizar a tarefa de maior prioridade que esteja em
fila de espera.
-Deadline Monotonic vs Rate Monotonic.
No modelo inicial rate monotonic verificámos que para ser escalonável, todas as
tarefas de um sistema tinham de cumprir a seguinte condição :
à O período de uma tarefa tinha de ser igual ao seu deadline.
Mas como vimos anteriormente, o cálculo do pior tempo de resposta ( R )
permite-nos ter tempos diferentes para essas características.
Como se pode verificar facilmente, um algoritmo rate monotonic não é o melhor
para uma situação em que temos D<=T. a uma tarefa urgente mas pouco frequente
continua a ser atribuída uma prioridade baixa uma vez que o período ( T ) é elevado e
provavelmente não irá cumprir o seu deadline.
Aparece assim um outro algoritmo de ordenamento de tarefas , o deadline
monotonic, que tal como o próprio nome indica atribuí a prioridade mais alta à tarefa
com menor deadline. Este sistema é o melhor para o caso em que D <= T.
Algoritmos de Escalonamento de Tarefas
11/19
- Partilha de recursos, bloqueamento de tarefas.
Uma das restrições existentes no modelo inicial de escalonamento era que as
tarefas não podiam ser bloqueadas ou suspenderem-se a si próprias. Isto tornava a
partilha de recursos, principalmente dados, muito difícil.
Podemos recordar-nos do algoritmo de escalonamento estático cíclico, onde
vimos que tínhamos que limitar o acesso aos dados pelas tarefas. Chamámos a isto o
problema da concorrência.
Uma das formas de resolver esta situação consiste na criação de semáforos. Os
semáforos são um conceito introduzido por Edsgar Djikstra em 1960. Servem para
regular o acesso à informação e aos recursos por parte das tarefas, impedindo o acesso
de uma tarefas a essa informação após outra ter dado indicação que está a aceder à
mesma.
Uma vez activado o semáforo, a tarefa é executada dentro de uma secção crítica.
A tarefa que chegou no fim só pode aceder aos dados ou recurso após a primeira tarefa
ter desactivado o semáforo.
O problema dos semáforos reside aqui. É que uma tarefa pode tentar aceder a uma
determinado recurso e este já ter sido bloqueado por outra tarefa de menor prioridade,
fazendo com que a tarefa mais prioritária fique retida enquanto o semáforo não for
desactivado. Vamos apresentar um exemplo.
Consideremos o seguinte conjunto de tarefas :
TAREFA
A
B
C
T
D
50
10
500 500
3000 3000
C
5
250
1000
Admita-se que as tarefas A e C partilham um conjunto de dados e que cada uma
requer um tempo de computação para aceder aos dados de 1ms. Um semáforo s controla
o acesso à informação partilhada.
Considere-se também que a tarefa C está a ser executada e activa o semáforo s no
instante t. após C ter activado o semáforo a tarefa A é iniciada, e como tem prioridade
mais alta começa a ser executada. Um pouco mais tarde - instante t+2 – a tarefa B é
invocada, mas como não tem a prioridade mais alta não é executada.
Algoritmos de Escalonamento de Tarefas
12/19
No instante t+3 a tarefa A precisa de aceder aos dados que partilha com C e tenta
activa s, o que não consegue porque a tarefa C já o activou. Nesta altura A bloqueia à
espera que o semáforo seja desactivado.
Nesta situação a tarefa que tem mais prioridade é a B, que necessita de 250ms
para ser executada, terminando de o ser no instante t+253, então a tarefa C torna-se a de
maior prioridade e é executada. No instante t+254 a tarefa C desbloqueia o semáforo e a
tarefa A começa a ser executada, mas já sem cumprir o seu deadline.
O processo descrito acima pode ser ilustrado pela seguinte figura :
A tarefa que atrasa a execução da A é a B apesar de esta ter prioridade inferior.
Este efeito é conhecido como INVERSÃO DE PRIORIDADES e verifica-se quando uma
tarefa de menor prioridade atrasa a execução doutra de prioridade superior. As
consequências poderiam ser mais nefastas, no caso de existirem mais tarefas entre A e C
que viriam atrasar ainda mais a tarefa de maior prioridade.
Pelo que vimos até agora os semáforos apenas lançaram o caos no escalonamento
das tarefas. É aqui que temos que introduzir um outro conceito que nos resolverá o
problema, a HERANÇA DE PRIORIDADES.
É notório que quando A tenta aceder à informação “guardada” por s, mas não
consegue visto este estar “trancado” por C, a execução desta última torna-se urgente
pois contribuí directamente para o atraso de A.
Por isso, porque não atribuir, momentaneamente, a prioridade de A a C por forma
a apressar a sua execução. Vejamos o que acontece.
Algoritmos de Escalonamento de Tarefas
13/19
No instante t a tarefa C acede ao semáforo s. Neste momento a tarefa A é activada
e começa a ser executada. No instante t+2 B é invocada, mas não é executada pois não é
a tarefa de maior prioridade. No instante t+3 a tarefa tenta “trancar” o semáforo mas não
o consegue porque C já o fez, então A é bloqueada e C herda a sua prioridade, o que a
torna a tarefa de maior prioridade começando assim a ser executada.
No instante t+4 ela termina de aceder aos dados e “destranca” s. Aqui a tarefa C
adquire a sua prioridade normal e A começa a ser executada acedendo aos dados
partilhados e fechando o semáforo. A tarefa A termina a sua execução no instante t+9
cumprindo o seu tempo limite.
O processo é demonstrado na figura seguinte.
t+9
t+9
No entanto continua a verificar-se um problema que é a possibilidade de acontecer
uma situação de deadlock, que é o equivalente a tempos de resposta infinitos, para o
pior caso.
Podemos ilustrar o caso da seguinte forma, utilizando dois semáforos (s1 e s2 ).
No instante t a tarefa C bloqueia s1 , seguidamente a tarefa A bloqueia s2 e tenta
bloquear s1 o que não consegue pois este fora bloqueado pela tarefa C. Aqui a tarefa A é
suspensa e a C herda a prioridade de A recomeçando a execução.
Nesse instante a tarefa C tenta aceder a s2 , mas não consegue pois este já foi
bloqueado por A. Neste caso atinge-se uma situação em que nenhuma tarefa pode ser
executada – deadlock.
Algoritmos de Escalonamento de Tarefas
14/19
O problema pode ser resolvido através da utilização de um algoritmo que não se
ressinta do problema da inversão de prioridades e do deadlock. Esse algoritmo é o
PRIORITY CEILING que vamos apresentar de seguida.
- Protocolo Priority Ceiling.
Este protocolo é relativamente recente (1987) e vem colocar algumas restrições à
forma de bloqueio e libertação dos semáforos. A primeira refere-se à impossibilidade de
uma tarefa ocupar um semáforo entre invocações, ou seja quando termina a execução de
uma secção crítica tem que libertar todos os semáforos. Quanto à segunda restrição
refere-se à forma de bloqueio e libertação dos semáforos, que deve ser feita de forma
piramidal, ou seja – considerando dois semáforos – se o bloqueio for feita da forma
s1 às2
a libertação deve ser feita na ordem inversa e nunca na mesma ordem do
bloqueio.
O protocolo define um determinado período limitado de tempo (de computação)
para a execução da secção crítica em que uma tarefa i ocupa o semáforo. Este assume,
também, que a tarefa i pode bloquear semáforos de um determinado conjunto conhecido
inicialmente ( uses(i) à conjunto de semáforos de i).
Este protocolo baseia-se no conceito de tecto de prioridade, que é a máxima
prioridade de entre as tarefas que usam um determinado recurso com um semáforo
afecto. Por outras palavras podemos dizer que tecto de prioridade é a prioridade da
tarefa de maior prioridade que usa um determinado semáforo.
O protocolo consiste no seguinte, a prioridade dinâmica de uma tarefa é o maior
valor entre a sua prioridade e a das tarefas que ela bloqueia, assim uma tarefa só pode
utilizar um recurso se a sua prioridade dinâmica for maior que o tecto de prioridade de
todos os recursos em uso por outras tarefas, ou seja uma tarefa i só pode bloquear um
semáforo se a sua prioridade for superior às prioridades tecto de todos os semáforos já
bloqueados. Se esta condição não se verificar então a nossa tarefa inicial é bloqueada no
semáforo.
Se o semáforo já está bloqueado, a tarefa i não o pode bloquear pois a sua
prioridade não pode ser maior que o tecto de prioridade do semáforo. Quando a tarefa i
bloqueia o semáforo a tarefa que o ocupa presentemente herda a prioridade da tarefa i.
Algoritmos de Escalonamento de Tarefas
15/19
Este protocolo tem prioridades interessantes, tais como a inexistência de deadlock,
uma tarefa i só é atrasada, no máximo, uma vez por uma tarefa de menor prioridade em
que este atraso é função do cumprimento da secção crítica.
- Protocolo de Herança Imediata.
O protocolo anterior é talvez o mais difícil, tanto de entender como de aplicar. O
algoritmo escalonador tem que verificar constantemente qual é a tarefa que está
bloqueada, em que semáforo e quais foram as prioridades herdadas. Do mesmo modo o
algoritmo perde muito tempo a verificar se uma tarefa pode bloquear um semáforo.
Há um protocolo que se baseia no mesmo principio (pior tempo de resposta) que é
o protocolo de HERANÇA IMEDIATA. Este protocolo tem o mesmo modus operandi
que o PRIORITY CEILING, mas tem um comportamento em tempo real diferente.
Basicamente o seu comportamento é o seguinte :
Quando uma tarefa i pretende bloquear um semáforo esta modifica de imediato a
sua prioridade para o maior valor entre a sua prioridade e a prioridade tecto do
semáforo. Quando a tarefa desbloqueia o semáforo o valor da sua prioridade regressa
ao valor inicial.
É fácil de perceber porque é que a tarefa i só é atrasada, no máximo, por uma
tarefa de menor prioridade, tal como no protocolo anterior :
Não pode haver duas tarefas de baixa prioridade que bloqueiem dois semáforos
com tectos superiores ao da tarefa i, isto porque uma delas terá herdado, imediatamente,
a prioridade mais alta, e como tal a outra tarefa não pode ser executada e assim bloquear
outro semáforo.
Verifica-se também que não há necessidade de bloquear e desbloquear o
semáforo, pois este não pode estar bloqueado quando a tarefa i o tenta fazer, pois então
haveria outra tarefa de prioridade superior à de i a ser executada e e assim esta não o
poderia ser, não tentando então bloquear o semáforo.
Como a herança de prioridades é imediata a tarefa i é bloqueada, no máximo,
antes de começar a ser executada, isto porque se uma tarefa de prioridade mais baixa
retiver o controlo de um semáforo que possa bloquear a tarefa i então esta terá herdado
uma prioridade superior à de i e quando esta for invocada não começa a ser executada
imediatamente esperando que a tarefa de prioridade mais baixa acabe de ser executada,
Algoritmos de Escalonamento de Tarefas
16/19
nesse momento não haverá semáforos que travem a progressão da tarefa “i” e esta pode
ser executada sem entraves, a não ser que seja desalojada por outra de maior prioridade.
Esta propriedade de herança imediata é muito útil quando é necessário
implementar um algoritmo escalonador.
Em vários sistemas operativos a concorrência é controlada à custa da actuação de
interrupções. Este protocolo funciona da mesma maneira, apenas foram substituídas as
interrupções por tarefas.
IMPLEMENTAÇÃO DE ESCALONADORES DE PRIORIDADE FIXA .
Introdução
Como vimos anteriormente, através das equações desenvolvidas, não são
permitidas alterações de “comportamento” pelo escalonador. Vimos, por exemplo, que
essas equações não prevêem custos de implementação do escalonamento.
Neste capítulo descrevem-se duas maneiras de implementar um escalonamento de
prioridades fixas de forma a permitir alterações de comportamento dessas
implementações.
Escalonamento por acontecimentos
Neste tipo de implementação criam-se duas filas, uma, de execução, é ordenada
por prioridade das tarefas, a outra , de espera, que é ordenada pelo tempo que uma
tarefa pretende demorar até ser libertada.
Quando uma tarefa executa uma instrução de espera, o algoritmo retira-a da fila
de execução e coloca-a na fila de espera. Após terminar o transporta da tarefa entre as
filas, o algoritmo actua uma interrupção da CPU que inicializa um temporizador, o qual
irá avisar o algoritmo quando for altura de executar a tarefa que se encontra à cabeça da
fila de espera.
Quando a interrupção do temporizador é activada todas as tarefas com tempos de
libertação iguais ou menores que o tempo da interrupção são transferidos para a fila de
execução.
Algoritmos de Escalonamento de Tarefas
17/19
O atraso do escalonador pode ser calculado tendo em conta que o factor de
bloqueamento para todas as tarefas inclui o tempo de processamento da instrução de
espera. Este período de processamento é contabilizado no pior tempo de resposta da
execução dessa instrução.
Temos também de considerar o tempo de processamento das interrupções de
temporização. Como é sabido uma interrupções ocorre ao mesmo tempo que uma terfa
pretende ser executada. Para
cada tarefa real do sistema podemos criar uma tarefa
fictícia com uma prioridade muito elevada, o mesmo período da tarefa real e um tempo
de execução igual ao pior tempo de computação do manipulador da interrupção.
Há alguns problemas que devem ser ultrapassados neste tipo de escalonamento. O
hardware de temporização deve ser sofisticado, pois a programação que o algoritmo lhe
vai impôr implica o armazenamento de longos períodos de tempo. Nalguns
processadores o temporizador não é capaz de executar, convenientemente, essa função o
que vai aumentar a complexidade do algoritmo de escalonamento, pois quando se
verificar algum problema este deve ser detectado pelo algoritmo de maneira a que este
possa manter o controlo do tempo.
Outro problema verifica-se quando o algoritmo obriga o temporizador a provocar
a interrupção num intervalo de tempo muito pequeno o que leva a que o interrupção
possa ocorrer novamente antes que a tarefa seja libertada.
È devido a esta complexidade que surge outro tipo de implementação que é o
escalonamento por momentos.
Escalonamento por momentos
Esta é uma forma mais simples de implementar um algoritmo de escalonamento
de prioridade fixa. Como anteriormente o escalonador pode ser invocado aquando de
uma instrução de espera e pode alterar a tarefa a executar se chegar uma de maior
prioridade do que aquela que está a computar. No entanto, ao contrário da aproximação
anterior, o temporizador não é programado para interromper a execução num dado
momento. Em vez disso o temporizador é programado para levantar uma interrupção a
intervalos regulares de tempo (momentos). Quando o escalonador é invocado pelo
temporizador ele apenas interroga a fila de espera para verificar se existem tarefas que
possam ser executadas.
Algoritmos de Escalonamento de Tarefas
18/19
Isto vem acabar com os problemas de corrida e de perda de interrupções desde
que o escalonador não demore mais do que o período regular previamente definido.
No entanto a análise efectuada na aproximação anterior já não é válida, pois temos
que ter em consideração a transferência de tarefas pode ser atrasada até um (1) intervalo
de tempo, o que não se verificava na análise anterior, tornando-a por isso, inválida.
Devemos também ter em conta o tempo de execução do escalonador, o que pode
ser feito tendo em calculando o seu pior tempo de execução e então tratando-o como
uma tarefa de alta prioridade com período igual ao intervalo de tempo do temporizador.
Na pior das situações o escalonador transfere todas as tarefas da fila de espera
para a de execução, mas esta situação ocorre muito raramente e por isso não é
considerada nesta aproximação.
O melhor procedimento será criar um conjunto de tarefas fictícias de maneira a
modelizar os custos de manipulação das filas e criar uma tarefa periódica simples para
modelizar os custos de temporização.
Comparação dos dois modelos
Podemos comparar os dois modelos e analisar quais são as suas vantagens e
desvantagens.
A maior vantagem da segunda aproximação é a sua simplicidade, tanto de
elaborar como de perceber. Da mesma forma também não requer grandes
potencialidades em termos de hardware. Por último nesta implementação não há
condições para se verificarem corridas entre as interrupções.
O escalonamento por acontecimentos é de uma forma geral mais eficiente que o
escalonamento por momentos e tem como maior desvantagem a sua complexidade.
Algoritmos de Escalonamento de Tarefas
19/19
CONCLUSÕES
Neste trabalho tentámos elaborar um apanhado relacionado com escalonamento de
tarefas e os seus algoritmos.
Incidimos mais fortemente ao nível dos algoritmos para situações de sistemas
mono-processador e com prioridades fixas, embora alguns deles, devido à sua evolução,
já não seja muito correcto considerá-los de prioridade fixa como vimos para o fim.
Este é um capítulo dos Sistemas de Tempo Real em que, por mais restrito que seja
o assunto, nunca é possível abrangê-lo na sua totalidade, por isso, e como somos meros
alunos, é natural que se verifiquem algumas falhas.
BIBLIOGRAFIA
à Planeamento de Tarefas – Paulo Moisés, 1999.
à Real Time Systems by Fixed Priority Scheduling – K. Tindell e H. Hansson,
1997
à Planificación Dinámica de Tareas – Alejandro Alonso, 1996
Download

Um sistema de tempo real é definido como um sistema em que a