Wie funktioniert Linux, das E / A blockiert?

8

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?

    
tgguy 05.05.2010, 22:25
quelle

3 Antworten

11

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:

  1. Der Gerätetreiber erstellt lesen und Warteschlangen für ein Gerät schreiben.
  2. Jeder Prozess-Thread, der warten möchte für I / O wird auf das passende gesetzt Warteschlange. Wenn ein Interrupt auftritt Der HF weckt einen oder mehrere wartende Threads. (Offensichtlich die Threads laufen nicht sofort, da wir in Interrupt sind Kontext, aber werden zu den hinzugefügt Kernel-Scheduling-Warteschlange).
  3. Wenn vom Kernel geplant, wird der Thread prüft, ob Bedingungen vorliegen sind richtig damit fortzufahren - wenn nicht es geht zurück in die Warteschlange.

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: Ссылка

    
Dipstick 06.05.2010 06:35
quelle
0

Lesen Sie dies: Ссылка

Es ist eine sehr, klare, sehr leicht zu verstehende Erklärung. Dies gilt im Allgemeinen auch für Linux.

    
S.Lott 05.05.2010 22:31
quelle
0

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.

    
mikek3332002 06.05.2010 05:29
quelle

Tags und Links