Please enable JavaScript.
Coggle requires JavaScript to display documents.
Cap 12 : Problemas Clássicos - Coggle Diagram
Cap 12 : Problemas Clássicos
Produtores/Consumidores
Problema do buffer limitado
Coordenar o acesso de tarefas a um buffer
Produtor: produz e deposita um item no buffer, deve esperar caso não haja vaga livre. O produtor "consome" uma vaga
Consumidor: retira um item do buffer e o consome, deve aguardar caso o buffer esteja vazio. "Produz" uma vaga
Exclusão mútua, para não corromper dados
Suspensão dos produtores caso o buffer esteja cheio
Suspensão dos consumidores se o buffer estiver vazio
Solução usando semáforos
Um semáforo para controlar as vagas no buffer
Um semáforo para controlar os itens no buffer
Um mutex para controlar o acesso ao buffer
Solução usando variáveis de condição
Um mutex para controlar o acesso ao buffer
Uma condição de vaga
Uma condição de presença de itens
Leitores/Escritores
Um conjunto de tarefas que leem e escrevem em uma área de memória
Leituras podem ser feitas em paralelo, mas escritas precisam ser exclusivas
Presente em aplicações com múltiplas threads
O padrão POSIX define mecanismos para lidar com isso
Solução Simplista
Proteger a área com um mutex ou semáforo com valor 1
Apenas um processo usa a seção por vez
Deixa a desejar em desempenho pois restringe desnecessariamente o acesso dos leitores
Solução com priorização dos leitores
Mutex que controla o acesso à area
Mutex que controla o acesso a uma variável contadora que permite saber se um leitor é o primeiro a entrar ou o último a sair
Permite que vários leitores façam leitura simultânea
Caso existam muitos leitores em atividade, os escritores podem ficar impedidos de usar a área
O jantar dos selvagens
Solução
mutex que controla o acesso ao caldeirão
semáforo que indica o caldeirão vazio
semáforo que indica o caldeirão cheio
Uma task selvagem e outra task cozinheiro
O cozinheiro só pode encher o caldeirão quanto ele estiver vazio
Selvagens não podem servir se o caldeirão estiver vazio
Selvagens não podem servir ao mesmo tempo
Uma tribo de selvagens está sentado ao redor de um caldeirão contendo N porções de cozido. Quando um selvagem quer comer ele serve uma porção a menos que o caldeirão esteja vazio, nesse caso ele acorda o cozinheiro e espera que ele encha o caldeirão novamente
Variação do problema dos produtores/consumidores
O jantar dos filósofos
Essa solução possui baixo desempenho
Quando um filósofo quiser comer ele deve primeiro obter o saleiro, quando tiver ambos os palitos ele devolve o saleiro
Uma solução trivial é colocar um saleiro hipotético sobre a mesa
Outras soluções podem provocar inanição, alguns filósofos nunca conseguem comer
Solução simples pode provocar impasses, situações onde todos os filósofos ficam bloqueados
Cada filósofo é uma tarefa e cada palito é um semáforo
Os filósofos não conversam entre si
Como os palitos são compartilhados, dois filósofos vizinhos não podem comer ao mesmo tempo
Para comer um filósofo precisa pegar o palito à sua direita e à sua esquerda, um de cada vez
Ha uma mesa redonda com um lugar fixo para cada filósofo, com um prato, cinco palitos compartilhados e um grande prato de arroz ao meio
Um grupo de filósofos chineses alternam suas vidas entre comer e meditar