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