Frage

In Multitasking-Systemen, einige anormalen Bedingungen verhindern Fortschritt der Prozesse oder Threads ausführen. Ich werde auf beiden Prozesse beziehen und Threads einfach als „Prozesse“. Zwei dieser Bedingungen sind Deadlock und Live-Lock genannt.

Ersteres bezieht sich auf Verfahren, die sich gegenseitig blockieren, wodurch verhindert wird entweder von der Ausführung. Letzteres bezieht sich auf Verfahren, die sich gegenseitig aus voran verhindern, aber nicht tatsächlich die Ausführung blockieren. Zum Beispiel könnten sie dazu führen, ständig jeder anderen Transaktionen rückgängig zu machen, weder jemals in der Lage sein, sie zu beenden.

Eine weitere Bedingung ist als Ressource Hunger bekannt, in denen ein oder mehr endlichen Ressourcen, für den Fortschritt der Prozesse erforderlich, werden von ihnen aufgebraucht und können nicht, es sei denn die Prozesse Fortschritt gestellt werden. Dies ist auch ein besonderer Fall von Live-Sperre.

Ich würde gerne wissen, ob es eine andere Definition, insbesondere ein akademischer, für „Hunger“, das nicht auf „Ressource Hunger“ beschränkt ist. Referenzen sind besonders willkommen.

Und, nein, das ist keine Hausaufgaben. : -)

War es hilfreich?

Lösung

Ich würde nicht sagen, dass Ressource Hunger ein Spezialfall eines Livelock ist. In der Regel:

  • In einem Livelock, macht kein Thread Fortschritte, aber sie halten die Ausführung. (In einer Sackgasse, sie halten nicht einmal ausgeführt wird)

  • Beim Hungern, einig Fäden (n) DO Fortschritte machen und einig Thread (s) nicht ausgeführt wird.

Eine gute Erklärung: http://docs.oracle.com/ JavaSE / tutorial / essential / concurrency / starvelive.html . Aber ich verstehe die Wahl der Terminologie variieren kann.

Wenn es um Hunger kommt, die Definition, die ich hörte, ist:

Angenommen, es ist möglich, einen unendlichen Ausführungspfad (Interlace) im Einklang mit Annahmen zu spezifizieren (Semaphore Semantik, OS-Scheduler Verhalten ...), so dass Thread T für eine Ressource suspendiert wartet und nie wieder aufgenommen, auch wenn es möglich war, unendlich viele Male. Dann wird T genannt hungern.

Aber die Praxis nicht, dass übereinstimmen. Angenommen, zwei Threads critial Abschnitt in einer Endlos-Schleife auszuführen. Ihr Synchronisationscode ermöglicht es der erste Thread den critial Abschnitt einmal pro Stunde ein. Ist es Hunger? Beide Themen sind erlaubt, um die Fortschritte, aber das erste man tut seine Arbeit schmerzlich langsam.

Die einfachste Quelle des Hungers sind schwach Semaphore. Wenn Sie einen Synchronisierungsgrund (oder der Aufbau Ihre eigenen) verwenden, die in ähnlicher Weise verhalten, dann wird Verhungern führen.

Klassische Probleme in dem Verhungern gut bekannt ist:

Für weitere Details, ich von ganzem Herzen Das kleine Buch der Semaphore empfehlen (kostenlos): http: //www.greenteapress .com / Semaphore / .

Sie fragen, ob jeder Hunger durch das Warten auf eine Ressource verursacht wird. Ich würde sagen, -. Ja

kann ein Thread suspendiert werden:

(1) auf einem gewissen Sperrsystemaufruf - Warten auf / einen Mutex erwerben, Semaphore, Bedingungsvariable; write (), poll () etc.

(2) auf einigen nicht-blockierenden Betrieb -. Wie Berechnungen durchführen

Hungernde auf (1) auf Ressourcen hungern (Mutexe, Puffer usw.).

Hungernde auf (2) auf CPU hungert - Sie können es als Ressource betrachten kann. Wenn es passiert, ist das Problem mit Scheduler.

HTH

Andere Tipps

Stellen Sie sich in einer Warteschlange sind in einem Restaurant zu kaufen Lebensmittel, für die schwangeren Frauen Priorität haben. Und es gibt nur eine ganze Reihe von schwangeren Frauen die ganze Zeit ankommen.

Sie werden bald hungern. ;)

Nun stellen Sie sind ein niedrige Priorität Prozess und die schwangeren Frauen sind höhere Priorität diejenigen. =)

Ein weiterer Bereich, in dem Verhungern oder „unbestimmte blocking“ typischerweise aufkommt, wenn man über Priority Scheduling-Algorithmen zu sprechen. Eine Priorität Scheduling-Algorithmus hat die Möglichkeit, eine niedrige Priorität Prozess des Ausscheidens wartet auf unbestimmte Zeit. Ein stetiger Strom von höherer Priorität Prozessen kann einen niedrige Priorität Prozess verhindern, dass jemals laufen zu bekommen.

Bei Priorität Disponenten sind die Lösung „Alter“. Alter ist die Technik der nach und nach der Priorität von Prozessen zu erhöhen, die für eine lange Zeit im System warten.

Starvation ist einfach, wenn ein Verfahren oder eine Dienstleistung nicht dienen zu sein, auch wenn es kein Stillstand auf dem System ist.

Dies ist ein Beispiel, das ich gerade nur zur Verdeutlichung aus.

ein Algorithmus Stellen Sie sich vor, den Computer Zugang zu einem WAN oder so ähnlich steuern. Dieser Algorithmus könnte eine Politik, die sagt: „Geben Sie vorrangigen Zugang zu den Computern, die weniger Bandbreite verwenden.“, Das wie eine richtige Politik scheinen, aber dann, was passiert, wenn ein einzelner Computer mit dem Netzwerk für einen FTP-Upload zugreifen will, das wird Bitte senden Sie irgendwo mehr GB. Mit dieser Politik allein werden verhungern, dass Computer, da der Algorithmus nie diesen Computer auswählen, da wird es immer andere Computer kleine Bandbreitennutzung anfordert.

Das heißt Hunger.

Arbeit ist auch eine Art von Ressource. Wenn die Arbeitsverteilung in einem Erzeuger-Verbraucher-Setup nicht fair ist (oder ideal), können nicht einige Threads genug Arbeit Einzelteile erhalten, um sie zu halten die ganze Zeit beschäftigt.

Ein Prozess erhält keine Ressource oder Ressourcen für eine längere Zeit. Dies ist keine Sackgasse, weil ein Prozess / s ohne Problem laufen. Das Altern kann verwendet werden, um dieses Problem zu lösen, ein Alterungsfaktor für jede Anforderung verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top