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.
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
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
"Interrupts" ist ein Wort, das extrem relevant sein wird –