Sistemas Operacionais

Aula 7: Problemas Clássicos de Sincronização

O Jantar dos Filósofos

Jantar dos Filósofos

semaphore garfo[5];

filosofo(i) {
  while (true) {
    think();
    wait(garfo[i]);
    wait(garfo[i+1 % 5]);
    eat();
    signal(garfo[i]);
    signal(garfo[i+1 % 5]);
  };
}
Funciona ?




Jantar dos Filósofos

semaphore garfo[5];
filosofo(i) {
  while (true) {
    think();
    if (i != 5) {
      wait(garfo[i]);
      wait(garfo[i+1 % 5]);
      eat();
      signal(garfo[i]);
      signal(garfo[i+1 % 5]);
    } else {
      wait(garfo[i+1 % 5]);
      wait(garfo[i]);
      eat();
      signal(garfo[i+1 % 5]);
      signal(garfo[i]);
    };
  };
}
Funciona ?

Jantar dos Filósofos

Leitores/Escritores

Leitores/Escritores

semaphore escrevendo = 1, lendo = 1;
int leitores = 0;
leitor() {
  while (true) {
    wait(lendo);
    leitores++;
    if (leitores == 1) wait(escrevendo);
    signal(lendo);
    le();
    wait(lendo);
    leitores--;
    if (!leitores) signal(escrevendo);
    signal(lendo);
  };
}

escritor() {
  while (true) {
    wait(escrevendo);
    escreve();
    signal(escrevendo);
  }
}

Leitores/Escritores

Problema: leitores podem sufocar escritores!

O Barbeiro Dorminhoco

A barbearia tem:

Se o movimento estiver fraco (nenhum freguês), o barbeiro senta na sua cadeira e dorme;

Quando um freguês chega no salão vazio, ele tem que acordar o barbeiro;

Se outros fregueses chegam enquanto o barbeiro está ocupado, eles:

O Barbeiro Dorminhoco

#define CHAIRS  5

semaphore customers = 0,
          barbers = 0;
          mutex = 1;
int waiting = 0;

O Barbeiro Dorminhoco

Barber(){
  while (true) {
    wait(customers);
    wait(mutex);
    waiting--;
    signal(barbers);
    signal(mutex);
    cut_hair();
  }
}

Customer(){
  wait(mutex);
  if (waiting < CHAIRS) {
    waiting++;
    signal(customers);
    signal(mutex);
    wait(barbers);
    get_haircut();
  } else {
    signal(mutex);
  }
}