Comment utilise-t-on réellement kqueue()
pour faire des r/w asynchrones simples? Il semble que ce soit pour remplacer epoll()
et select()
, et donc le problème qu'il essaye de résoudre est la mise à l'échelle de l'écoute sur un grand nombre de descripteurs de fichiers pour les changements.Utilisation de kqueue pour une async simple io
Cependant, si je veux faire quelque chose comme: lire les données de descripteur X, laissez-moi quand les données sont prêtes - comment l'API support qui? À moins qu'il n'y ait une API complémentaire pour lancer des requêtes r/w non-bloquantes, je ne vois pas d'autre moyen que de gérer moi-même un pool de threads, ce qui va à l'encontre du but recherché.
Est-ce simplement le mauvais outil pour le travail? Stick avec aio
?
En plus: Je ne suis pas avertis avec la façon dont OS BSD internes modernes fonctionnent - mais est kqueue()
construit sur aio
ou visa versa? J'imagine que cela dépendrait de savoir si le système de sous-système OS io est fondamentalement basé sur l'interruption ou l'interrogation.
Merci pour la réponse. Quand j'ai dit «descripteurs», je l'ai dit dans son sens général, bien que de toute évidence, il ait été conçu pour cibler les prises/tuyaux.Je ne sais pas pourquoi je pensais qu'ils seraient construits les uns les autres - pas que j'y pense, ça n'aurait aucun sens. Il est probable qu'ils soient tous les deux construits à partir d'une structure au niveau du noyau, dans laquelle les threads peuvent s'inscrire pour être intéressés par un événement, et informés quand cela arrive. La différence serait 'kqueue()' paquets ensemble, tandis que 'aio' prendrait la propriété exclusive d'un descripteur et lancerait une requête r/w en premier. Oui? –
Sûrement kqueue prend en charge les E/S asynchrones via le filtre EVFILT_AIO. Vous configurez une file d'attente, puis lorsque vous effectuez une requête d'E/S asynchrone, vous transmettez le descripteur de la file d'attente dans la requête et, une fois l'opération terminée, un événement est envoyé à la file d'attente. Cela semble exactement ce que veut le PO. Est-ce que je manque quelque chose? –
@TomAnderson, sur macOS au moins, la page de manuel 'kqueue' le dit pour' EVFILT_AIO': "Ce filtre est actuellement non supporté." –