2010-10-28 20 views
6

Sprawdzałem, jak działają twisted i node.js, i próbuję dokładnie zrozumieć, w jaki sposób system operacyjny obsługuje operacje I/O przy użyciu wywołań zwrotnych.W jaki sposób realizowane jest programowanie sterowane zdarzeniami?

Rozumiem, że jest to dobre, ponieważ potrzebujemy mniej wątków, ponieważ nie musimy zablokować wątków oczekujących na operacje wejścia/wyjścia. Ale coś musi wywołać wywołanie zwrotne po zakończeniu operacji we/wy.

W jaki sposób jest to realizowane przez system operacyjny?

Odpowiedz

5

Jednym ze sposobów jest mieć OS dołączyć informacje na temat każdego, kto czeka na wywołanie zwrotne do odpowiedniej struktury danych, taki jak ekwiwalent w jądrze deskryptora pliku, na który oczekujesz powiadomienia o przeczytaniu. Gdy coś dzieje się z tym deskryptorem pliku, system operacyjny skanuje kelnerów, aby sprawdzić, czy ktoś powinien zostać powiadomiony. Jeśli tak, to robi to. Możesz przeczytać o jednej implementacji tego w Lemon's paper introducing FreeBSD's kqueue mechanism. Zobacz w szczególności sekcję 6, "Implementacja", podrozdziały 3 i 4, "Działanie na źródle zdarzenia" i "Dostawa".

3

Rozwiązanie to zostało rozwiązane w systemie operacyjnym za pomocą opcji "Urządzenia/interfejsy powiadamiania o zdarzeniach wejścia/wyjścia", np. epoll, ankieta, kqueue lub wybierz.

Spójrz na deft, a zwłaszcza jego "io/event loop, aby zobaczyć konkretny przykład zastosowania" systemów powiadamiania "wspomnianych powyżej. (java.nio.channels.Selector jest java nio sposobem zapewnienia abstrakcję do tego.)

disclaimer: im DEFT committer