Sleep/Wake Up

  • bloqueante
  • para problemas bounded buffer(limitado pelo buffer)
  • problema do produtor/consumidor (produtor adiciona no buffer, consumidor tira do buffer)
  • o problema do produtor/consumidor acontece quando o produtor quer adicionar no buffer, mas ele está cheio, ou o consumidor quer tirar do buffer, mas ele está vazio
  • para resolver isso, o sleep/wake up coloca o processo para dormir
  • dois processos acessam o buffer ao mesmo tempo
  • buffer age como uma fila circular
  • exclusão mutua deve ser aplicada
  • há a possibilidade de usar uma variável para dizer se um pode consumir e se o outro pode adicionar, contudo, o scheduler pode interromper antes da variável ser modificada, podendo então causar a dissincronia e consequentemente um deadlock
  • um processo pode colocar outro para dormir (sleep) ou acordar (wake up)

Semáforo

  • armazena o numero de wake ups enviados, começando em 1
  • se o número for 0, o recurso está sendo usado, se não ele está livre
  • operação down executa sempre que um processo quer utilizar o recurso e up para liberar o recurso
  • operações são atômicas
  • aplica a exclusão mutua
  • bloqueante
  • quando um processo acessa a região crítica, ele da um comando down, se o valor for 0 ele entra numa fila e fica bloqueado até chegar a vez dele de usar, se não ele executa
  • Semáforo full → conta no buffer quantos espaços estão sendo usados (começa com o numero de elementos)
  • Semáforo empty → conta o numero de espaços vazios no buffer (começa com 0)
  • soluciona o mesmo problema do produtor/consumidor

Monitor

  • há somente um processo ativo dentro do monitor o restante é bloqueado
  • semelhante ao semáforo, só que mais fácil de controlar
  • bloco programático
  • compilador que garante a exclusão mutua
  • dentro de um bloco monitor há procedimentos a serem executados, antes de executar ele vê se não há nada que estava sendo executado antes

Mensagem

  • processos podem estar em diferentes máquinas
  • envia e recebe mensagens ao invés de usar memória compartilhada
  • pode usar as primitivas SEND e RECIEVE para sincronia
  • pode ser bloqueante ou não (usando outra THREAD por exemplo)
  • por usar rede, há diversos problemas que podem acontecer
  • para resolver a perda de mensagens, é usado ACK para dizer que a info chegou corretamente
  • para resolver a perda do ACK, as mensagens são todas numeradas, assim, caso um envie a mesma mensagem 2 vezes, entende-se que ele não recebeu o ACK então, você descarta a mensagem e envia o ACK de novo
  • pode haver combinação de bloqueante e não bloqueante (emissor x receptor)

emissor bloqueante e receptor bloqueante = síncrono

emissor não bloqueante e receptor não bloqueante = assíncrono

o restante = semi síncrono

  • RPC → comanda a execução de um método em outra CPU, seguindo modelo Cliente x servidor. Nesse caso, como a memória é diferente, não é possível a passagem de parâmetros por referencia, então deve-se sempre retornar algo desse método remoto

Notes

  • em JAVA wait() bloqueia o processo
  • synchronized em JAVA diz que o método será executado de forma atômica, sem ser interrompido no meio. Útil para quando estamos usando recurso compartilhado