27 votes

Quel est le meilleur équivalent epoll / kqueue / select sous Windows?

Quelle est la meilleure fonction de notification d'événements d'E / S de Windows?

Au mieux, je veux dire quelque chose qui ...

  1. n'a pas de limite sur le nombre de descripteurs de fichiers d'entrée
  2. fonctionne sur tous les descripteurs de fichiers (fichiers disque, sockets, ...)
  3. fournit différents modes de notification (déclenchement sur front, déclenchement sur limite)

28voto

Chris Smith Points 2858

Dans Windows, async opérations sont effectuées par une opération de fichier, pas de descripteur. Il y a plusieurs façons d'attendre sur les opérations de fichier se termine de façon asynchrone.

Par exemple, si vous souhaitez savoir quand les données sont disponibles sur une socket réseau, numéro un async demande de lecture sur la socket et lorsqu'elle est terminée, les données étaient disponibles et ont été récupérés.

Dans Win32, des opérations asynchrones utiliser l' OVERLAPPED structure pour contenir de l'état au sujet d'une exceptionnelle IO opération.

  1. Associer les fichiers avec un IO Achèvement de Port et d'expédition async IO demandes. Lorsqu'une opération est terminée, elle va mettre un message d'achèvement sur la file d'attente qui votre thread(s) peut attendre et récupérer à mesure qu'ils arrivent. Vous pouvez aussi mettre défini par l'utilisateur des messages dans la file d'attente. Il n'y a pas de limite au nombre de fichiers ou de messages en file d'attente peut être utilisé avec un port de fin d'
  2. Envoi de chaque opération e / s avec un événement. L'événement associé à une opération deviendra signalé (satisfaire une attente) quand il se termine. Utiliser WaitForMultipleObjects attendre sur tous les événements à la fois. Ceci a l'inconvénient de ne pouvoir attendre sur MAXIMUM_WAIT_OBJECTS objets à la fois (64). Vous pouvez aussi attendre sur les autres types d'événements en même temps (processus/thread résiliation, mutex, les événements, les sémaphores)
  3. L'utilisation d'un pool de threads. Le pool de threads peut prendre un nombre illimité d'objets et d'opérations sur les fichiers d'attendre et d'exécuter une fonction définie par l'utilisateur lors de l'achèvement de chaque.
  4. Utiliser ReadFileEx et WriteFileEx file d'attente pour les Appels de Procédure Asynchrone (Apc) pour le thread appelant et de l' SleepEx (ou WaitFor{Single|Multiple}ObjectsEx) avec Alertable TRUE , pour recevoir un message de notification pour chaque opération, lorsqu'elle est terminée. Cette méthode est similaire à un IO port d'achèvement, mais ne fonctionne que pour un seul thread.

Le noyau de Windows NT ne fait pas de distinction entre le connecteur, fichier du disque, pipe, etc. les opérations de fichiers en interne: l'ensemble de ces options va fonctionner avec tous les types de fichiers.

2voto

schlamar Points 3108

libuv

libuv offre des E / S par événement pour Unix et Windows et prend en charge les sockets, les fichiers et les canaux. Il s'agit de la couche de plate-forme de Node.js.

Plus de détails sur: http://nikhilm.github.io/uvbook/introduction.html

0voto

Heron Points 42

Il n'y a pas encore, pour autant que je suis conscient. Un ami et moi-même travaillons sur un open-source Windows epoll de mise en œuvre (lien ci-dessous), mais nous sommes en cours d'exécution dans les questions de trouver comment faire la même chose que l'implémentation de Linux.

Les obstacles actuels:

  • Sous Linux, les descripteurs de fichier et de la prise descripteurs sont interchangeables, mais dans Windows, ils ne le sont pas. Les deux doivent être compatibles avec une epoll mise en œuvre.
  • Sous Windows, il est assez difficile d'obtenir un noyau événements... qui est de savoir comment epoll fonctionne sous Linux. Nous sommes deviner qu'un programme à l'aide de notre croix-plate-forme epoll bibliothèque fonctionne sensiblement plus lent dans Windows que Linux.

Je vais essayer de revenir et de mettre à jour ce post, comme nous l'avons faire avancer le projet.

http://sourceforge.net/projects/cpoll

0voto

Nouil Points 1

La fonction select () est POSIX et utilisable sur les fenêtres incluant "winsock.h" ou "winsock2.h".

0voto

user2225104 Points 95

@Heron Pourquoi quelqu'un essaierait-il de porter epoll () sur Windows alors que kqueue est a) plus performant b) plus facile à porter. Je pense qu'il devrait être possible de créer une implémentation de kqueue sur Windows avec des ports d'achèvement d'E / S et WaitForMultiple (). Je n'ai pas vérifié les petits caractères (tels que la fusion d'événements dans kqueue) - mais je pense que cela pourrait être assez bien fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X