Was passiert in Linux, wenn Sie einen blockierenden E / A-Anruf wie Lesen oder Akzeptieren machen, was passiert eigentlich?
Meine Gedanken: Der Prozess wird aus der Ausführungswarteschlange genommen, in einen Warte- oder Blockierungsstatus in einer Warteschlange gestellt. Wenn dann eine TCP-Verbindung hergestellt wird (zum Akzeptieren) oder die Festplatte bereit ist oder etwas für eine Datei gelesen wird, wird ein Hardware-Interrupt ausgelöst, der diese Prozesse warten lässt (im Fall einer Datei lesen, wie funktioniert das?) Linux wissen, welche Prozesse zu wecken, da es viele Prozesse auf verschiedene Dateien warten könnte?). Oder vielleicht anstelle von Hardware-Interrupts, fragt der individuelle Prozess selbst nach Verfügbarkeit. Nicht sicher, Hilfe?
Jedes Linux-Gerät scheint etwas anders implementiert zu sein, und der bevorzugte Weg scheint alle paar Linux-Versionen zu variieren, da sicherere / schnellere Kernel-Features hinzugefügt werden, aber generell:
Ein typisches Beispiel (etwas vereinfacht):
Im Treiber bei der Initialisierung:
%Vor%In der Lesefunktion eines Treibers:
%Vor%Dann gibt der Interrupt-Handler nur aus:
%Vor% Beachten Sie, dass wait_event_interruptible () ein Makro ist, das eine Schleife versteckt, die nach einer Bedingung sucht - in diesem Fall read_avail != 0
- und wiederholt erneut zur Warteschlange hinzufügt, wenn die Bedingung nicht erfüllt ist.
Wie bereits erwähnt, gibt es eine Reihe von Variationen - die wichtigste ist, dass, wenn es viel Arbeit für den Interrupt-Handler zu tun gibt, sie das absolute Minimum selbst ausführt und den Rest zu einer Arbeitswarteschlange oder einem Tasklet zurückschickt (allgemein) bekannt als die "untere Hälfte" und es ist dies, dass die wartenden Threads aufwecken würde.
Weitere Informationen finden Sie im Linux Device Driver-Buch - pdf hier verfügbar: Ссылка
Effektiv kehrt die Methode nur zurück, wenn die Datei zum Lesen bereit ist, wenn Daten in einem Socket sind, wenn eine Verbindung angekommen ist ...
Um sicherzustellen, dass Sie sofort zurückkehren können, möchten Sie wahrscheinlich die Auswahl verwenden Systemaufruf, um einen fertigen Dateideskriptor zu finden.
Tags und Links linux linux-kernel blocking