2017-02-05 2 views
0

nach meinem Wissen, der Prozess, der den Mutex sperrt, ist derjenige, der den Mutex freischalten muss.Mein Zweifel ist wie der Prozessor wissen, welchen Prozess zu entsperren? Gibt es eine Datenstruktur, die die PID (oder) etwas davon speichert bestimmter Prozess (intern) im Wartezustand, so dass der Prozessor nur den bestimmten Prozess entsperren kann.In Mutex, wie der Prozessor (CPU) wissen, welchen Prozess zu entsperren?

bitte geben Antwort..dies d Frage in einem meiner Interviews gefragt.

+0

Fragen Sie, wie die Threads/Prozesse, die auf den Mutex warten, vom Kernel geplant werden, um den autonomen "test and set" CPU-Befehl auszuführen und den Mutex zu bekommen? Ich glaube nicht, dass es irgendwelche Garantien darüber gibt, welcher Thread den Mutex zuerst erhält, so dass es mehrere funktionale Implementierungen davon geben könnte. –

Antwort

0

Der Thread/Prozess, der den Mutex hat, ist der einzige, der sich im Code vorwärts bewegt. Später im Code für diesen Thread sollte es eine Freigabe des Mutex geben. Die anderen Threads/Prozesse, die nicht über den Mutex verfügen, werden darauf warten, so dass sie es weder aufnehmen noch freigeben, bis der 1-laufende Prozess zur Mutex-Version gelangt.

0

Wie der Prozessor wissen, welchen Prozess zu entsperren?

Der Prozessor weiß nichts; es führt nur blind die Kette von Maschinenanweisungen aus, die ihm zur Verfügung gestellt wurden.

Die Threading-Bibliothek, auf der anderen Seite wurde sorgfältig entwickelt, um mit dieser Art von Sache umzugehen. Außerdem enthält jedes moderne/Multitasking-Betriebssystem einen Thread-Scheduler, der beim Booten in den Speicher geladen wird, und verwaltet, welche Threads wann ausgeführt werden. Es arbeitet mit der Threading-Bibliothek zusammen, um Probleme beim Sperren/Entsperren korrekt zu behandeln.

Die Frage lautet also: Woher weiß die Betriebssystem-Software, welcher Thread als nächstes aufwachen soll, wenn ein Mutex entsperrt wird?

Natürlich variiert die tatsächliche Implementierung mit dem Betriebssystem, aber konzeptionell können Sie sich jedes Mutex-Objekt mit einer Linked-List vorstellen, und wenn ein Thread versucht, einen Mutex zu sperren, der bereits gesperrt ist, fügt sich der Thread zum Tail hinzu der verknüpften Liste und teilt dem Scheduler dann mit, dass er (der Thread) in den Ruhezustand versetzt wird. Später, wenn der Mutex entsperrt ist, öffnet die Entsperrroutine den ersten schlafenden Thread (falls vorhanden) aus der verknüpften Liste, ordnet dem Thread den Eigentümer des Mutex erneut zu und fordert dann den Scheduler auf, aufzuwachen diesen Thread so schnell wie möglich.

(Vorbehalte: Eine reale Implementierung wäre wahrscheinlich ein bisschen komplexer als das, da es darauf achten muss, Rennbedingungen zu vermeiden und die Leistung zu maximieren, aber ich denke, das gibt Ihnen eine Vorstellung davon, wie es gemacht werden könnte Beachten Sie, dass in dieser Beispielimplementierung Threads den Mutex in der Reihenfolge "first-come/first-served" erhalten, dh in der gleichen Reihenfolge, in der sie lock() aufgerufen haben, aber in vielen Implementierungen der realen Welt ist diese Reihenfolge nicht garantiert. also sollten Sie sich nicht darauf verlassen)

+0

danke für deine Antwort ... ich habe verstanden, was du gesagt hast ... was meinst du eigentlich, wenn du erwähnst "weist dem Thread den Besitz des Mutex zu"? @ Jeremy Friesner – sravanthi

+0

@sravanthi nur ein Thread hält den Mutex auf einmal; Der Thread, der den Mutex enthält, wird als Besitzer des Mutex bezeichnet. Wenn lock() in einem Thread zurückgegeben wird, ist garantiert, dass dieser Thread der Besitzer des Mutex ist.Wenn also Thread B innerhalb von lock() wartet, weil Thread A der Besitzer des Mutex ist und Thread A unlock() auf dem Mutex aufruft, wird Thread B in diesem Moment der Besitzer der Sperre des Mutex und des Threads B() Aufruf wird zurückgeben, so dass Thread B die Ausführung fortsetzen kann. –

+0

Vielen Dank für Ihre Antwort ... @ Jeremy Friesner – sravanthi

Verwandte Themen