Jaki jest najlepszy equvalient epoll / kqueue / select w systemie Windows?

Jaka jest najlepsza funkcja powiadamiania o zdarzeniach We/Wy w systemie Windows?

Przez best mam na myśli coś takiego ...

  1. nie ma limitu liczby deskryptorów plików wejściowych
  2. działa na wszystkich deskryptorach plików (pliki dyskowe, gniazda, ...)
  3. zapewnia różne tryby powiadomień (wyzwalanie krawędzi, wyzwalanie limitu)
Author: kennytm, 2008-09-16

4 answers

W Windows operacje asynchroniczne są wykonywane przez operacje na plikach, a nie przez deskryptor. Istnieje kilka sposobów oczekiwania na operacje na plikach, aby zakończyć się asynchronicznie.

Na przykład, jeśli chcesz wiedzieć, kiedy dane są dostępne w gnieździe sieciowym, wyślij żądanie odczytu asynchronicznego na gnieździe, a po jego zakończeniu dane były dostępne i zostały pobrane.

W Win32 operacje asynchroniczne wykorzystują OVERLAPPED struktura zawierająca Stan o nieprzewidzianym IO operacja.

  1. Połącz pliki z portem zakończenia IO i wysyłaj asynchroniczne żądania IO. Gdy operacja zostanie zakończona, w kolejce pojawi się komunikat o zakończeniu, na który wątki robocze będą mogły czekać i pobierać je po ich zakończeniu. Do kolejki można również wstawiać wiadomości zdefiniowane przez użytkownika. Nie ma limitu liczby plików lub kolejkowanych wiadomości z portem zakończenia
  2. Wyślij każdą operację IO z wydarzeniem. Wydarzenie związane z operacja zostanie zasygnalizowana (oczekiwanie) po jej zakończeniu. Użycie WaitForMultipleObjects czekać na wszystkie wydarzenia na raz. Ma to tę wadę, że można czekać tylko na MAXIMUM_WAIT_OBJECTS obiekty naraz (64). Można również czekać na inne typy zdarzeń w tym samym czasie (zakończenie procesu/wątku, muteksy, zdarzenia, semafory)
  3. użyj puli wątków . Pula wątków może przyjmować nieograniczoną liczbę obiektów i operacji na plikach, aby czekać i wykonywać zdefiniowaną przez użytkownika funkcja po zakończeniu każdego.
  4. Użyj ReadFileEx i WriteFileEx do kolejki asynchronicznych wywołań procedur (APCs) do wątku wywołującego i SleepEx (lub WaitFor{Single|Multiple}ObjectsEx) z Alertable TRUE, aby otrzymać komunikat powiadamiający o każdej operacji po jej zakończeniu. Ta metoda jest podobna do portu zakończenia IO, ale działa tylko dla jednego wątku.

Jądro Windows NT nie rozróżnia gniazd, plików na dysku, rur itp. operacje na plikach wewnętrznie: wszystkie te opcje będą działać ze wszystkimi typami plików.

 37
Author: Chris Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 21:01:56

Libuv

libuv oferuje evented I / O Dla Unix i Windows i ma wsparcie dla gniazd, plików i rur. Jest to warstwa platformy węzła.js.

Więcej szczegółów na stronie: http://nikhilm.github.io/uvbook/introduction.html

 3
Author: schlamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-16 10:26:42

Nie ma jeszcze, o ile mi wiadomo. Razem z przyjacielem pracujemy nad implementacją open source Windows epoll (link poniżej), ale napotykamy problemy, zastanawiając się, jak sprawić, by działała ona tak samo jak implementacja Linuksa.

Obecne przeszkody:

  • w Linuksie deskryptory plików i deskryptory gniazd są wymienne, ale w Windows tak nie jest. Oba muszą być zgodne z implementacją epoll.
  • W Windows trudno jest uzyskać jądro wydarzenia... tak działa epoll w Linuksie. Domyślamy się, że program korzystający z naszej wieloplatformowej biblioteki epoll będzie działał zauważalnie wolniej w systemie Windows niż Linux.

Postaram się wrócić i zaktualizować ten post w miarę postępów w projekcie.

Http://sourceforge.net/projects/cpoll

 0
Author: Heron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 22:13:33

Funkcja Select () jest POSIX i może być używana w systemie windows, w tym " winsock.h " lub " winsock2.h".

 0
Author: Nouil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 10:30:40