Je suis en train de concevoir une boucle d'événements pour les E/S socket asynchrones en utilisant epoll/devpoll/kqueue/poll/select (y compris windows-select).Conception et problèmes de la boucle d'événements asynchrones
J'ai deux options d'exécution, opération IO:
mode non bloquant, sondage sur EAGAIN
- Set socket en mode non-bloquant.
- Lecture/écriture sur le socket.
- Si l'opération aboutit, envoyez une notification d'achèvement à la boucle d'événements.
- Si j'obtiens EAGAIN, ajoutez le socket à "select list" et à socket de sondage.
mode de scrutin: sondage et puis exécutez
- socket Ajouter pour sélectionner la liste et il sondage.
- Attendez la notification qu'il soit lisible inscriptible
- lecture/écriture
- après notification d'achèvement à boucle d'événements de sucseeds
Pour moi, il ressemble d'abord, il faudrait système moins d'appels lors de l'utilisation en mode normal , en particulier pour l'écriture sur socket (les tampons sont assez gros). En outre, il semble qu'il serait possible de réduire le surcoût sur le nombre de "select" exécutions, en particulier il est agréable quand vous n'avez pas quelque chose qui évolue bien comme epoll/devpoll/kqueue.
Questions:
- Y at-il des avantages de la seconde approche?
- Y at-il des problèmes de portabilité avec des opérations non bloquantes sur les sockets/descripteurs de fichiers sur de nombreux systèmes d'exploitation: Linux, FreeBSD, Solaris, MacOSX, Windows.
Notes: S'il vous plaît ne suggèrent pas l'utilisation de boucle d'événements existant/implémentations socket-api
Je ne vois aucune raison pour laquelle vous ne pouvez pas attendre pour allouer de la mémoire un jusqu'à besoin d'utiliser la première approche. Est-ce que je manque quelque chose? – Ioan
Je suppose que oui, mais en pratique, il n'est pas implémenté de cette façon. Dans le premier cas, vous avez besoin de la mémoire tampon disponible à partir des étapes 2 à 4, dans le second, vous en avez besoin uniquement à l'étape 3. – karunski