Question

Quel est le meilleur système de notification d’événements d’E / S de Windows?

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

  1. ne limite pas le nombre de descripteurs de fichier en entrée
  2. fonctionne sur tous les descripteurs de fichiers (fichiers disque, sockets, ...)
  3. fournit différents modes de notification (déclenchée par le bord, déclenchée par la limite)
Était-ce utile?

La solution

Sous Windows, les opérations asynchrones sont effectuées par opération de fichier et non par descripteur. Il existe plusieurs façons d'attendre que les opérations sur les fichiers se terminent de manière asynchrone.

Par exemple, si vous souhaitez savoir quand les données sont disponibles sur un socket réseau, émettez une demande de lecture asynchrone sur le socket et, une fois terminé, les données étaient disponibles et ont été récupérées.

Dans Win32, les opérations asynchrones utilisent le OVERLAPPED pour contenir l’état d’une opération d’IO en attente.

  1. Associez les fichiers à un port d'achèvement IO et envoyez des demandes d'E / S asynchrones. Lorsqu'une opération est terminée, un message d'achèvement est mis sur la file d'attente que votre ou vos threads de travail peuvent attendre et récupérer à mesure qu'ils arrivent. Vous pouvez également placer des messages définis par l'utilisateur dans la file d'attente. Il n'y a pas de limite au nombre de fichiers ou de messages en file d'attente pouvant être utilisés avec un port d'achèvement
  2. Répartissez chaque opération IO avec un événement. L'événement associé à une opération sera signalé (attendre une attente) lorsqu'il sera terminé. Utilisez WaitForMultipleObjects attendre tous les événements à la fois. Cela a pour inconvénient de ne pouvoir attendre que les objets MAXIMUM_WAIT_OBJECTS à la fois (64). Vous pouvez également attendre d’autres types d’événements en même temps (terminaison de processus / thread, mutex, événements, sémaphores)
  3. Utilisez un pool de threads . Le pool de threads peut prendre un nombre illimité d’objets et d’opérations sur les fichiers et exécuter une exécution fonction définie par l'utilisateur à la fin de chaque.
  4. Utilisez ReadFileEx et WriteFileEx < mettre en file d'attente Appels de procédure asynchrone ( APC) au thread appelant et SleepEx (ou WaitFor {Unique | Multiple} ObjectsEx ) avec Alertable TRUE pour recevoir un message de notification pour chaque opération à la fin. Cette méthode est similaire à un port d’achèvement d’IO, mais ne fonctionne que pour un seul thread.

Le noyau Windows NT ne fait pas de distinction entre les opérations de fichier socket, fichier disque, canal, etc. en interne: toutes ces options fonctionneront avec tous les types de fichiers.

Autres conseils

libuv

libuv propose des E / S événementielles pour Unix et Windows et prend en charge les sockets, fichiers et canaux. C’est la couche plateforme de Node.js.

Plus de détails à l'adresse: http://nikhilm.github.io/uvbook/introduction.html

Il n'y en a pas encore, à ma connaissance. Un ami et moi travaillons sur une implémentation open source d'epoll Windows (lien ci-dessous), mais nous rencontrons des difficultés pour déterminer comment le faire fonctionner de la même manière que l'implémentation Linux.

Obstacles actuels:

  • Sous Linux, les descripteurs de fichier et les descripteurs de socket sont interchangeables, mais pas sous Windows. Les deux doivent être compatibles avec une implémentation epoll.
  • Sous Windows, il est assez difficile d’obtenir des événements du noyau ... c’est ainsi que fonctionne epoll sous Linux. Nous pensons qu'un programme utilisant notre bibliothèque epoll multi-plateforme s'exécutera nettement plus lentement sous Windows que sous Linux.

Je vais essayer de revenir et de mettre à jour ce post au fur et à mesure de l'avancement du projet.

http://sourceforge.net/projects/cpoll

La fonction select () est POSIX et utilisable sous Windows, y compris " winsock.h " ou "winsock2.h".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top