Les ports de complétion Linux et I/O?

en utilisant winsock, vous pouvez configurer les sockets ou séparer les opérations d'e/s pour"se chevaucher". Cela signifie que les appels à effectuer des e/s sont retournés immédiatement, tandis que les opérations réelles sont complétées de manière asynchrone par des threads de travail séparés.

Winsock fournit également des"ports d'achèvement". D'après ce que j'ai compris, un port d'achèvement agit comme un multiplexeur de poignées (sockets). Une poignée peut être démultiplexée si elle n'est pas au milieu d'une opération d'e/s, i.e. si toutes ses e/s les opérations sont complété .

Donc, à ma question... linux supporte-t-il les ports de completion ou même les entrées/sorties asynchrones pour les sockets?

34
demandé sur someguy 2010-05-08 19:01:07

7 réponses

si vous cherchez quelque chose exactement comme IOCP, vous ne le trouverez pas, parce qu'il n'existe pas.

Windows utilise une notification sur le modèle d'achèvement (d'où les Ports achèvement ). Vous commencez une opération de manière asynchrone, et recevez une notification lorsque cette opération est terminée.

les applications Linux (et la plupart des autres Unix-alikes) utilisent généralement une notification sur modèle prêt. Vous recevez une notification que la socket peut être lu ou écrit sans blocage. Ensuite, vous faites l'opération d'entrée/sortie, qui ne bloquera pas.

avec ce modèle, vous n'avez pas besoin de 151940920 "asynchrone I/O. les données sont immédiatement copiées dans / hors du tampon de socket.

le modèle de programmation pour cela est assez délicat, c'est pourquoi il existe des bibliothèques d'abstraction comme libevent. Il fournit un modèle de programmation plus simple, et résume les différences de mise en œuvre entre les systèmes d'exploitation supportés.

Il ya une notification sur le modèle prêt dans Windows ainsi (select ou WSAWaitForMultipleEvents), que vous avez peut-être regardé avant. Il ne peut pas être adapté à un grand nombre de sockets, il n'est donc pas adapté aux applications réseau haute performance.

ne laissez pas cela vous rebuter - Windows et Linux sont des systèmes d'exploitation complètement différents. Quelque chose qui ne se balance pas bien sur un système peut très bien fonctionner sur le autre. Cette approche fonctionne très bien sous Linux, avec des performances comparables à IOCP sous Windows.

74
répondu BlackAura 2010-05-12 17:02:16

IOCP se prononce "asynchrone I / O" sur diverses plateformes UNIX:

19
répondu D.Shawley 2010-05-08 15:23:31

Utiliser boost::asio. Mains vers le bas. Il a une courbe d'apprentissage douce, mais il est multiplateformes, et utilise automatiquement la meilleure méthode disponible pour le système sur lequel vous compilez. Il n'y a simplement aucune raison de ne pas.

je sais que ce n'est pas tout à fait une réponse à votre question, mais c'est le meilleur conseil que je pourrais donner.

8
répondu Ken Smith 2011-08-19 17:40:50

Lire L'entrée de blog de Google sur libevent , vous pouvez mettre en œuvre la sémantique IOCP sur Unix en utilisant asynchrone IO mais ne peut pas directement mettre en œuvre asynchrone IO sémantique en utilisant IOCP,

http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html

pour un exemple d'IO asynchrone de plateforme croisée avec une API de socket BSD, regardez ZeroMQ comme récemment publié sur LWN.net,

http://www.zeromq.org /

article LWN,

http://lwn.net/Articles/370307 /

1
répondu Steve-o 2010-05-10 04:30:22

le noyau Linux fournit le concept" I / O block completion", chaque fois que vous utilisez l'API" blk_complete_request " par exemple. Un autre exemple:

http://lxr.free-electrons.com/source/kernel/sched/completion.c

et comme expliqué ici:

http://www.ibm.com/developerworks/library/l-async /

linux a à la fois synchrone et API de Completion des blocs d'E/S asynchrones.

les valeurs ci-dessus sont toutes au niveau du noyau. Au niveau de l'espace utilisateur, il y a L'API "io_submit ()":

http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt

qui détaille l'ensemble complet de Io_*() APIs.

question partiellement similaire:

N'y a-t-il vraiment pas de bloc asynchrone e/s sur Linux?

1
répondu Peter Teoh 2017-05-23 12:25:49

Je ne comprends pas très bien ce que vous entendez par"ports d'achèvement". Tout ce que je peux dire, c'est que vous pouvez utiliser des sockets en mode non-blocage, ce qui signifie que les appels reviennent immédiatement.

cette référence est assez ancienne, mais elle est exhaustive en ce sens qu'elle couvre select() etc.: http://rhoden.id.au/doc/sockets2.html

et voici le manuel GNU sur les sockets: http://www.gnu.org/software/libc/manual/html_node/Sockets.html

0
répondu ypnos 2010-05-08 15:16:24

Boost ASIO implémente le modèle Windows IOCP (Proactor design pattern) sur Linux à l'aide de epoll (Réacteur modèle). Voir http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html

0
répondu Roshan 2012-08-22 19:32:56