2013-10-16 4 views
8

Ich habe gewesen, obwohl asynchrone I/O immer ein Rückrufformular hat. Aber kürzlich entdeckte ich, dass einige Low-Level-Implementierungen die Polling-API verwenden.Werden alle asynchronen E/A letztendlich in Abfragen implementiert?

  1. kqueue
  2. libpq

Und das führt mich vielleicht alle (oder die meisten) asynchronen I/O zu denken, dass (jeder Datei, Buchse, mach-Port, etc.) implementiert schließlich in einer Art Meinungsumfrage. Vielleicht ist das Callback-Formular nur eine Abstraktion nur für die übergeordnete API.

Das könnte eine dumme Frage sein, aber ich weiß nicht, wie eigentlich die meisten asynchronen I/O auf niedrigem Niveau implementiert. Ich habe gerade die System-Level-Benachrichtigungen verwendet, und wenn ich sehe kqueue - das ist die Systembenachrichtigung, es ist ein Polling-Stil!

Wie soll ich asynchrone I/O auf niedrigem Niveau verstehen? Wie die High-Level asynchrone Benachrichtigung wird von Low-Level-Polling-System gemacht? (wenn es tatsächlich tut)

+0

Wenn diese Frage nicht zu dieser SO passt, kann ich nach einem besseren Ort fragen, um diese Frage zu stellen? (zB: andere SE-Seite wie zB Programmer oder Unix & Linux ...) – Eonil

+0

Interessante Frage. Nicht gut für das Stackoverflow-Format, aber ich werde es nicht abstimmen ... Weil ich gerne einige Antworten hören möchte! – Floris

+2

"Interrupts" ist ein Wort, das extrem relevant sein wird –

Antwort

11

Bei der niedrigsten (oder zumindest, am niedrigsten wert zu betrachten) Hardware-Ebene, asynchrone Operationen wirklich sind asynchron in modernen Betriebssystemen.

Wenn Sie beispielsweise eine Datei von der Festplatte lesen, übersetzt das Betriebssystem Ihren Anruf in read in eine Reihe von Festplattenoperationen (suchen Sie nach Speicherorten, lesen Sie die Blöcke X bis Y usw.). Auf den meisten modernen Betriebssystemen werden diese Befehle entweder in spezielle Register oder spezielle Speicherorte im Hauptspeicher geschrieben, und der Plattencontroller wird informiert, dass Vorgänge ausstehen. Das Betriebssystem geht dann seinen Aufgaben nach und wenn der Plattencontroller alle ihm zugewiesenen Operationen abgeschlossen hat, löst es eine interrupt aus, was bewirkt, dass der Thread, der das Lesen angefordert hat, dort weitermacht, wo es aufgehört hat.

Unabhängig davon, welche Art von asynchronen Low-Level-Betrieb Sie betrachten (Festplatten-I/O, Netzwerk-I/O, Maus- und Tastatureingabe usw.), gibt es letztendlich eine Stufe, auf der ein Befehl ist an die Hardware gesendet, und der "Rückruf" wird sozusagen nicht ausgeführt, bis die Hardware den Zugriff beendet hat und dem Betriebssystem mitgeteilt wird, dass es erledigt ist, normalerweise in Form eines Interrupts.

Das ist nicht zu sagen,, dass nicht einige asynchrone Operationen mit Abruf implementiert sind. Eine triviale (aber naive und kostspielige) Möglichkeit, blockierende Operationen asynchron zu implementieren, besteht darin, einen Thread zu erzeugen, der darauf wartet, dass die Operation abgeschlossen wird (vielleicht in einer engen Schleife) und dann den Callback aufruft, wenn er beendet ist. Im Allgemeinen sind jedoch asynchrone Operationen auf OS-Ebene wirklich asynchron.

Es ist auch erwähnenswert, dass, nur weil eine API blockiert, bedeutet nicht, dass es polling: Sie können eine blockierende API auf eine asynchrone Operation und eine nicht blockierende API auf eine synchrone Operation. Mit Dingen wie select und kqueues zum Beispiel geht der Thread tatsächlich einfach schlafen, bis etwas Interessantes passiert. Dieses "etwas Interessantes" kommt (normalerweise) in Form eines Interrupts zustande, und das wird als ein Hinweis darauf angesehen, dass das Betriebssystem die relevanten Threads zum Fortsetzen der Arbeit aufwecken sollte. Es sitzt nicht nur in einer engen Schleife und wartet darauf, dass etwas passiert.

Es gibt wirklich keine Möglichkeit zu sagen, ob ein System Polling oder "echte" Callbacks (wie Interrupts) nur von seiner API verwendet, aber ja, es gibt asynchrone APIs, die wirklich von asynchronen Operationen unterstützt werden.

Verwandte Themen