Question

Dans les systèmes multi-tâches, certaines conditions anormales empêchent les progrès de l'exécution des processus ou des fils. Je parle à la fois les processus et les fils simplement comme « processus ». Deux de ces conditions sont appelés morts-lock et live verrouillage.

Le premier se réfère à des procédés qui bloquent les uns les autres, empêchant ainsi d'exécuter une ou l'autre. Ce dernier fait référence aux processus qui empêchent l'autre de progresser, mais ne bloquent pas réellement l'exécution. Par exemple, ils pourraient toujours faire l'autre pour rollback les transactions, ni jamais être en mesure de les terminer.

Une autre condition est connue comme la famine des ressources, dans lequel une ou plusieurs ressources limitées, nécessaires à l'avancement des processus, ont été épuisées par eux et ne peuvent pas être restaurés à moins que les progrès des processus. Ceci est également un cas particulier de verrouillage en direct.

Je voudrais savoir s'il y a une autre définition, en particulier un académique, pour la « famine » qui ne se limite pas à la « famine des ressources ». Les références sont particulièrement bienvenus.

Et, non, ce n'est pas devoirs. : -)

Était-ce utile?

La solution

Je ne dirais pas que la famine des ressources est un cas particulier d'un livelock. Habituellement:

  • Dans un livelock, pas de fil fait des progrès, mais ils continuent d'exécution. (Dans une impasse, ils ne gardent même pas l'exécution)

  • Quand mourir de faim, un fil (s) NE faire des progrès et un fil (s) ne sont pas d'exécution.

Une bonne explication: http://docs.oracle.com/ JavaSE / tutorial / essentiel / concurrency / starvelive.html . Mais je comprends le choix de la terminologie peut varier.

En ce qui concerne la famine, la définition que j'ai entendu est:

Supposons qu'il est possible de spécifier un chemin d'exécution infinie (entrelacée) compatible avec les hypothèses (sémantique sémaphores, comportement du planificateur OS ...) tel que T thread est suspendu en attendant une ressource et n'a jamais repris, même s'il était possible infinité de fois. Alors T est appelé mourir de faim.

Mais la pratique ne correspond pas. Supposons que deux threads exécutent section critial dans une boucle infinie. Votre code de synchronisation permet le premier fil d'entrer dans la section critial une fois par heure. Est-il faim? Les deux fils sont autorisés à progresser, mais le premier est en train de faire son travail avec une lenteur désespérante.

La source de la famine sont faibles sémaphores simple. Si vous utilisez une primitive de synchronisation (ou la construction de votre propre) qui se comporte de la même, alors la famine entraînera.

problèmes classiques où la famine est bien connu:

Pour plus de détails, je recommande vivement le petit livre de sémaphores (gratuit): http: //www.greenteapress .com / sémaphores / .

Vous demandez si chaque famine est causée par l'attente d'une ressource. Je dirais -. Oui

Un fil peut être suspendu:

(1) sur un certain appel système de blocage - en attente sur / l'acquisition d'un mutex, sémaphores, variable conditionnelle; écrire (), poll () etc.

(2) sur une opération non bloquante. - comme effectuer des calculs

Starving sur (1) est affamés sur les ressources (mutex, un tampon, etc.).

Starving sur (2) meurt de faim sur CPU - vous pouvez considérer comme une ressource. Si cela se produit, le problème est avec le programmateur.

HTH

Autres conseils

Imaginez que vous êtes dans une file d'attente pour acheter de la nourriture dans un restaurant, pour lequel ont priorité les femmes enceintes. Et il y a juste un tas de femmes enceintes qui arrivent tout le temps.

Vous allez bientôt mourir de faim. ;)

Maintenant, imaginez que vous êtes un processus à faible priorité et les femmes enceintes sont les plus prioritaires. =)

Une autre zone où la famine ou « blocage indéfini » vient généralement en est quand on parle des algorithmes de planification prioritaires. Un algorithme d'ordonnancement de priorité a la possibilité de laisser un processus de faible priorité en attente indéfiniment. Un flot continu de processus de priorité plus élevée peut empêcher un processus de faible priorité de jamais arriver à courir.

En cas de ordonnanceurs prioritaires, la solution est « vieillissement ». Le vieillissement est la technique d'augmenter progressivement la priorité des processus qui attendent dans le système depuis longtemps.

Famine est simplement quand un processus ou un service est de ne pas servir, même quand il n'y a pas de blocage sur le système.

Ceci est un exemple que je viens de faire juste à des fins de clarification.

Imaginez un algorithme qui contrôle l'accès à des ordinateurs d'un réseau étendu ou quelque chose comme ça. Cet algorithme pourrait avoir une politique qui dit « Fournir un accès prioritaire à ces ordinateurs qui utiliseront moins de bande passante. », Cela semble comme une bonne politique, mais ce qui se passe quand un seul ordinateur veut accéder au réseau pour un téléchargement ftp qui va envoyer plusieurs GB quelque part. Avec cette politique seule, cet ordinateur mourir de faim puisque l'algorithme ne sera jamais sélectionner cet ordinateur, car il y aura toujours d'autres ordinateurs qui demandent l'utilisation de la bande passante plus faible.

On appelle la famine.

Work est aussi une sorte de ressource. Lorsque la distribution de travail dans une configuration producteur-consommateur est pas juste (ou idéal), certains sujets ne peuvent pas obtenir suffisamment d'éléments de travail pour les tenir occupés tout le temps.

Un processus ne soit pas une ressource ou des ressources pour un temps plus long. Ce n'est pas une impasse, parce qu'un seul processus / s sans problème exécuté. Le vieillissement peut être utilisé pour résoudre ce problème, un facteur de vieillissement est utilisé pour chaque demande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top