Pergunta

Em sistemas multitarefa, algumas condições anormais impedir o progresso da execução de processos ou threads. Vou referir-se a ambos os processos e threads simplesmente como "processos". Duas dessas condições são chamados mortos-lock e live-bloqueio.

O anterior refere-se a processos que são bloqueadores uns aos outros, impedindo assim quer a partir de execução. A segunda refere-se a processos que impedem o outro de progredir, mas na verdade não bloqueiam a execução. Por exemplo, eles podem continuamente causa uns aos outros para reverter transações, nem nunca ser capaz de acabar com eles.

Outra condição é conhecida como a fome de recursos, em que um ou mais finitos recursos, necessários para o andamento dos processos, foram esgotados por eles e não pode ser restaurada a menos que os processos de progredir. Este também é um caso especial de live-bloqueio.

Eu gostaria de saber se há qualquer outra definição, particularmente um um acadêmico, para "fome" que não se limita a "fome de recursos". Referências são especialmente bem-vindos.

E, não, isso não é lição de casa. : -)

Foi útil?

Solução

Eu não diria que a fome de recursos é um caso especial de um livelock. Geralmente:

  • Em um livelock, sem fio faz o progresso mas eles continuam em execução. (Em um impasse, eles nem sequer manter execução)

  • Quando fome, alguma linha (s) fazem progresso e (s) alguma linha não estão em execução.

Uma boa explicação: http://docs.oracle.com/ JavaSE / tutorial / essencial / simultaneidade / starvelive.html . Mas eu entendo a escolha de terminologia pode variar.

Quando se trata de inanição, a definição que ouvi é:

Suponha que é possível especificar um caminho infinito de execução (entrelaçado) consistente com os pressupostos (semântica semáforo, comportamento do agendador OS ...) tal que rosca T está suspenso à espera de algum recurso e nunca retomada, mesmo que fosse possível infinitamente muitas vezes. Então T é chamado de fome.

Mas a prática não corresponde. Suponhamos dois segmentos executar secção critial num ciclo infinito. Seu código de sincronização permite que o primeiro segmento para entrar na seção critial uma vez por hora. É a fome? Ambos os tópicos estão autorizados a progredir, mas o primeiro está fazendo seu trabalho dolorosamente lento.

A fonte mais simples de fome são semáforos fracos. Se você estiver usando um primitivo de sincronização (ou construir seu próprio) que se comporta da mesma forma, em seguida, a fome será o resultado.

problemas clássicos onde a fome é bem conhecida:

Para obter mais detalhes, eu recomendo vivamente The Little Book of Semáforos (grátis): http: //www.greenteapress .com / semáforos / .

Você está perguntando se a cada fome é causada pela espera de algum recurso. Eu diria - Sim.

A linha pode ser suspensa:

(1) em algum bloqueio de chamadas do sistema - esperando on / adquirir um mutex, semáforo, variável condicional; write (), poll () etc.

(2) em uma operação sem bloqueio -. Como realizar cálculos

Privante em (1) é fome em recursos (semáforos, tampão etc.).

Starving em (2) está morrendo de fome na CPU - você pode considerá-lo como um recurso. Se isso acontecer, o problema é com programador.

HTH

Outras dicas

Imagine que você está em uma fila para comprar alimentos em um restaurante, por que as mulheres grávidas têm prioridade. E há apenas um monte de mulheres grávidas que chegam o tempo todo.

Você logo vai estar morrendo de fome. ;)

Agora imagine que você é um processo de baixa prioridade e as mulheres grávidas são mais altas prioritários. =)

Outra área onde a fome ou "bloqueio indefinido" normalmente surge é quando se fala de Prioridade algoritmos de escalonamento. Um algoritmo de escalonamento prioridade tem a possibilidade de deixar algum processo de baixa prioridade esperando indefinidamente. Um fluxo constante de processos de maior prioridade pode impedir que um processo de baixa prioridade de sempre de começar a correr.

Em caso de programadores prioritárias, a solução é "envelhecimento". O envelhecimento é a técnica de aumentar gradualmente a prioridade dos processos que espera no sistema por um longo tempo.

A fome é simplesmente quando um processo ou serviço não está sendo servir, mesmo quando não há impasse no sistema.

Este é um exemplo que eu acabei de inventar apenas para fins de esclarecimento.

Imagine um algoritmo que computadores de controle de acesso a uma WAN ou algo parecido. Este algoritmo pode ter uma política que diz "Fornecer acesso prioridade aos computadores que irão utilizar menos largura de banda.", Que irá parecer como uma política adequada, mas então o que acontece quando um único computador quer acessar a rede para um upload ftp que a vontade enviar vários GB em algum lugar. Apenas com esta política, esse computador vai morrer de fome desde o algoritmo nunca vai selecionar esse computador, uma vez que haverá sempre outros computadores que pedem o uso de banda menor.

Isso é chamado de fome.

Trabalho também é um tipo de recurso. Quando a distribuição do trabalho em uma configuração de produtor-consumidor não é justo (ou ideal), alguns segmentos podem não receber itens de trabalho suficientes para mantê-los ocupados o tempo todo.

Um processo não recebe um recurso ou recursos por um longo tempo. Este não é um impasse, porque um processo / s executado sem problema. O envelhecimento pode ser usado para resolver este problema, um fator de envelhecimento é usado para cada solicitação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top