Pular para o conteúdo principal

Esperas não activas

Algumas definições e conceitos

Variável Lock – diz se está alguém a executar o while. Garante que o wait() e o signal() são atômicos e que só está um processo de cada vez na zona critica.


Wait(condiction_variable, lock) – põe o processo actual numa lista (FIFO) em espera e liberta o lock. Aguarda por um sinal do sistema operativo para poder pôr os processos guardados na FIFO da variável de condição prontos a executar.

Signal(condiction_variable) – vai a lista de processos bloqueados (FIFO) faz pop da lista e põem o processo bloqueado na fila de processos prontos a executar pelo sistema operativo.

Funcionamento do psedo-código


Psedo-Código:

Lock lock;
Condition vazio, cheio;

int a[N], nitems, ...;

int tirar(){
acquire(lock); //está alguem apartir desta linha?
while (nitems == 0)
wait(vazio, lock); // Não tenho nada para fazer. Espero!
{algoritmo que faz coisas}
signal(cheio);// Bem! Quem estava à espera do meu trabalho para continuar, prossiga!
release(lock);//Apartir deste momento quem quiser entrar na zona critica pode faze-lo.
return (x);
}

{Mesma cena que acima}
int por(int x) {
acquire(lock);
while (nitems == N)
wait(cheio, lock);
...
nitems++;
signal(vazio);
release(lock);
}



wait(cond, lock){
cond.f.append(p);//fila de processos em espera
release(lock);//libertar a entrada a outros processos pelo while abaixo
suspend();//processo suspenso
}

signal(cond){
if cond.f != []
q = cond.f.pop();//acordar o primeiro processo da fila dos suspensos
ready(q);//avisar o sistema operativo que este processo esta pronto a ser executado
}

Comentários

Postagens mais visitadas deste blog

A gente e a alma

Falo uma língua tão antiga Que trago as mãos em calos Nascem letras para uma cantiga Nos enxertos dos teus bardos Amo-te mulher em todas as prosas Sou o maior dos perversos Não despedaço corações, nem faço mossas mas nascem-me espinhos nos versos Tua alma espreita-me na poda É mosto a fermentar os segredos vício de vinho que não sai de moda Por isso esmago com os pés os medos Por isso sou farinha nesta roda E o pão cresce no teu corpo de vinhedos

Exame 07/08 {Resolucao}

Enunciado aqui module Exame where data Tree a = Empty | Node a (Tree a) (Tree a) type Extracto = [Movimento] type Movimento = (Descricao, Tipo, Data, Montante) type Descricao = String data Tipo = Credito | Debito deriving (Eq,Show) type Ano = Int type Mes = Int type Dia = Int data Data = D Ano Mes Dia deriving (Eq,Ord,Show) type Montante = Double -- valor positivo -- Dados para teste movimento1=("Compra", Debito, (D 1999 12 01), 123.0) movimento2=("EuroMilhoes", Credito, (D 2009 08 23), 155.5) movimento3=("EDP", Debito, (D 2009 01 26), 32.0) extracto = [movimento1,movimento2,movimento3] ------------------------------- --pg1 menoresMaiores :: Float -> Tree Float -> ([Float],[Float]) menoresMaiores n Empty = ([],[]) menoresMaiores n arv = let l = toList arv in ((filter (n>) l),(filter (n String -> Bool ePrefixo [] r = True ePrefixo l [] = True ePrefixo (x:xs) (y:ys) | (x==y)= True && e...