Question

Les deux libs 2 libs sont conçus pour la planification d'E / S ASYNC et les deux engage Epoll sur Linux, et KQueu sur FreeBSD, etc.

Sauf différence superficielle, je veux dire quelle est la vraie différence entre ces deux bibliothèques?concernant l'architecture ou la philosophie de conception?

Était-ce utile?

La solution

En ce qui concerne la philosophie de design, Libev a été créé pour améliorer certaines des décisions architecturales de Libevent, par exemple, l'utilisation mondiale de la variable a rendu difficile l'utilisation de Libevent en toute sécurité dans des environnements multithreads, les structures des observateurs sont grandes car elles combinent des E / S, Les manutentionnaires de temps et de signaux en un, les composants supplémentaires tels que les serveurs HTTP et DNS souffraient d'une mauvaise qualité de la mise en œuvre et de problèmes de sécurité résultants, et les minuteries étaient inexactes et ne savaient pas bien les sauts de temps.

Libev a essayé d'améliorer chacune d'elles, en n'utilisant pas de variables globales, mais en utilisant un contexte de boucle pour toutes les fonctions, en utilisant de petits observateurs pour chaque type d'événement (un observateur d'E / S utilise 56 octets sur X86_64 par rapport à 136 pour libier) , permettant des types d'événements supplémentaires tels que des minuteries basées sur WallClock par rapport au temps monotonique, les interruptions inter-thread, préparer et vérifier les observateurs à intégrer d'autres boucles d'événement ou à être intégrées et ainsi de suite.

Le problème du composant supplémentaire est "résolu" en ne les ayant pas du tout, de sorte que Libev peut être petit et efficace, mais vous devez également regarder ailleurs pour une bibliothèque HTTP, car Libev n'en a-t-il pas (par exemple, Il y a une bibliothèque très liée appelée libéio qui fait des E / S asynchrones, qui peuvent être utilisées indépendamment ou avec Libev, afin que vous puissiez mélanger et correspondre).

Donc, en bref, Libev tente de faire une seule chose (bibliothèque d'événements POSIX), et celle-ci de la manière la plus efficace possible. Libevent tente de vous donner la solution complète (Event Lib, une bibliothèque d'E / S non bloquante, serveur HTTP, client DNS).

ou, même plus court, Libev tente de suivre la philosophie de la boîte à outils UNIX de faire une chose que possible, aussi bonne que possible.

Notez que c'est la philosophie de conception que je peux énoncer avec l'autorité parce que j'ai conçu Libev. Si ces objectifs de conception ont effectivement été atteints, ou si la philosophie est basée sur des principes sains, est à vous de juger.

update 2017:

On m'a posé plusieurs fois quelle fois la minuterie, je me réfère et pourquoi Libev ne prend pas en charge IOCPS sur Windows.

Quant aux horaires, les horaires libéaux des horaires libellés par rapport à un temps de base inconnu qui est à l'avenir, sans que vous sachiez. Libev peut vous dire à l'avance Quelle période de base qu'il utilisera pour planifier des minuteries, ce qui permet aux programmes d'utiliser à la fois l'approche libéffée et l'approche de Libev. De plus, Libevent expirerait parfois les timeurs tôt, en fonction du backend. Le premier est un problème d'API, ce dernier est fixable (et aurait pu être fixé depuis - je n'ai pas vérifié).

Quant au support IOCP - je ne pense pas que cela puisse être fait, car les IOCPS ne sont tout simplement pas assez puissants. Pour une chose, ils ont besoin d'un type de socket spécial, qui limiterait davantage l'ensemble des poignées autorisées sur Windows (par exemple, les SOPCKETS utilisés par PERL sont du type «faux» pour IOCPS). En outre, les IOCPS ne soutiennent tout simplement pas des événements d'extrémité I / O, ils ne peuvent que faire des E / S réels. Il existe des solutions de contournement pour certains types de poignée, telles que la lecture d'un mannequin 0 octet, mais à nouveau, cela limiterait les types de poignée que vous pouvez utiliser sur Windows encore plus et plus compterait sur un comportement non documenté qui n'est probablement pas partagé par tous les fournisseurs de socket. .

À ma connaissance, aucune autre bibliothèque d'événements ne prend en charge IOCPS sous Windows, non plus. Ce que Libevent est, en plus de la bibliothèque d'événements, cela vous permet de faire la queue des opérations de lecture / écriture qui peuvent ensuite être effectuées via IOCPS. Depuis que Libev ne fait pas d'E / S pour vous, il n'ya aucun moyen d'utiliser IOCPS à Libev lui-même.

Ceci est effectivement par conception - Libev essaie d'être petit et de type POSIX, et Windows n'a tout simplement pas de moyen efficace d'obtenir des événements d'E / S de style POSIX. Si IOCPS est important, vous devez soit les utiliser vous-même, soit en utilisant certains des nombreux autres cadres qui font des E / S pour vous et peuvent donc utiliser IOCPS.

Autres conseils

Le grand avantage de libelant pour moi est le support OpenSSL intégré.Interface bufferevent, introduite dans la version 2.0 de API libevent , gère les connexions sécurisées presque sans douleur pour le développeur. Peut-être que mon savoir-faire est passé hors de jour, mais cela semble être libev ne supporte pas cela.

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