Frage

Ereignisorientiert und asynchron werden häufig als Synonyme verwendet. Gibt es Unterschiede zwischen den beiden?

Auch was ist der Unterschied zwischen epoll und aio? Wie passen sie zusammen?

Zuletzt habe ich oft gelesen, dass AIO in Linux schrecklich kaputt ist. Wie genau ist es kaputt?

Vielen Dank.

War es hilfreich?

Lösung

Ereignisse sind eines der Paradigmen, um eine asynchrone Ausführung zu erreichen. Aber nicht alle asynchronen Systeme verwenden Ereignisse. Das ist um die semantische Bedeutung dieser beiden - eine ist eine Super -Inde eines anderen.

Epoll und AIO verwenden verschiedene Metaphern:

Epoll ist ein Blockiervorgang (epoll_wait()) - Sie blockieren den Thread, bis ein Ereignis stattfindet, und schicken Sie das Ereignis an verschiedene Verfahren/Funktionen/Filialen in Ihrem Code.

In AIO übergeben Sie die Adresse Ihrer Rückruffunktion (Abschlussroutine) an das System, und das System ruft Ihre Funktion auf, wenn etwas passiert.

Das Problem mit AIO ist, dass Ihr Callback -Funktionscode auf dem System -Thread und so oben im Systemstapel ausgeführt wird. Ein paar Probleme damit, wie Sie sich vorstellen können.

Andere Tipps

Sie sind völlig andere Dinge.

Das Ereignisorientierte Paradigma bedeutet, dass ein Objekt, das als "Ereignis" bezeichnet wird, an das Programm gesendet wird, wenn etwas passiert, ohne dass "etwas" in regelmäßigen Abständen befragt werden muss, um festzustellen, ob es passiert ist. Dieses "Ereignis" kann vom Programm gefangen werden, um einige Aktionen (dh ein "Handler") auszuführen - entweder synchron oder asynchron.

Daher kann der Umgang mit Ereignissen entweder synchron oder asynchron sein. JavaScript verwendet beispielsweise ein synchrones Ereignissystem.

Asynchron bedeutet, dass Aktionen unabhängig vom aktuellen "Hauptausführungsstrom" erfolgen können. Wohlgemerkt, es tut es NICHT Mittelwert "parallel" oder "anderer Thread". Eine "asynchrone" Aktion kann tatsächlich auf dem Hauptfaden ausgeführt werden, wodurch der "Haupt" -Anführungsstrom in der Zwischenzeit blockiert wird. Verwechseln Sie also nicht "asynchron" mit "Multi-Threading".

Sie können sagen, dass technisch gesehen ein asynchroner Betrieb automatisch geht davon aus Eventing - zumindest "abgeschlossen", "fehlerhaft" oder "abgebrochen/storniert" Ereignisse (eine oder mehrere davon) werden an den Anstifter des Vorgangs (oder das zugrunde liegende O/S selbst) gesendet, um zu signalisieren, dass der Betrieb eingestellt hat . So ist Async immer ereignisorientiert, aber nicht umgekehrt.

Event Driven ist ein einzelner Thread, bei dem Ereignisse für ein bestimmtes Szenario registriert sind. Wenn dieses Szenario konfrontiert ist, werden die Ereignisse abgefeuert. Selbst zu diesem Zeitpunkt wird jedes der Ereignisse auf sequentielle Weise abgefeuert. Es ist nichts Asynchrones daran. Node.js (Webserver) verwendet Ereignisse, um sich mit mehreren Anfragen zu befassen.

Asynchron ist im Grunde Multitasking. Es kann mehrere Threads oder Prozesse ausführen, um eine bestimmte Funktion auszuführen. Es unterscheidet sich völlig von der Ereignis in dem Sinne, dass jeder Thread unabhängig ist und kaum auf einfache Weise mit dem Hauptfaden interagiert. Apache (Webserver) verwendet mehrere Threads, um eingehende Anforderungen zu bearbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top