Ciências da computação dia 279
OS
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