Nivel activado epoll
es muy similar a poll
. ¿Por qué no es poll
solo un contenedor para epoll
sistemas compatibles con este último?
EDITAR: Quiero decir, ¿hay barreras técnicas contra tal decisión? La implementación poll
como epoll
aumentaría drásticamente el rendimiento de muchas aplicaciones de red. Debería haber algún problema técnico que no noto.
poll
como envoltorioepoll
sería increíblemente complejo e ineficiente. Tendría que configurar un nuevo descriptor de epoll y configurarlo cada vez o tendría que hacer una comparación dolorosa del conjunto de encuestas actual con el ya asociado con el descriptor de epoll. ¡Qué asco!Respuestas:
la encuesta es mucho más simple para casos fáciles; Probablemente sea igual de eficiente para un pequeño número de descriptores de archivos. La persona que llama no necesita preocuparse por mantener los FDs de la encuesta y agregar / eliminar FDs, solo puede agregar todos los que desee en cada llamada para sondear.
Mi sensación es que son complementarios, aunque la encuesta PODRÍA implementarse como una envoltura para epoll, probablemente no debería serlo.
epoll podría (casi) implementarse como un contenedor para la encuesta, pero eso derrotaría sus argumentos de eficiencia.
fuente
La semántica de
poll()
yepoll
son diferentes. Sipoll()
le informa que un descriptor es legible, entonces lee un poco pero no lee todos los bytes disponibles, y luego pasa ese descriptorpoll()
nuevamente, se activará de inmediato. AFAIK lo mismo no es ciertoepoll
.También tenga en cuenta que los
epoll
descriptores son un recurso limitado. La página de manual habla sobre lasepoll_create()
condiciones de falla con las que AFAIK no ocurrepoll()
.Si bien no estoy seguro de todos los detalles de implementación, de esto podemos decir que no tiene sentido crear
poll()
un contenedorepoll
. El programador debe ser consciente de estos puntos, y el código existente escrito con los supuestospoll()
permitidos se rompería.fuente
Bien, 7 años después tengo una respuesta más convincente basada en este artículo de Evan Klitzke.
En primer lugar, la razón por la que hice la pregunta en primer lugar es la ventaja de rendimiento a menudo mencionada en
epoll
comparación conpoll
/select
. La palabra dice queepoll
es asintóticamente más eficiente (O (1)) quepoll
(O ( N )).Lo que no es tan ampliamente conocido es que solo el disparo por flanco
epoll
es verdaderamente O (1), mientras que el disparado por nivelepoll
tiene los mismos síntomas de O ( N ). De hecho, el sabor activado por nivel tiene que pasar por la lista de archivos vistos cada vez que se llama para encontrar los que potencialmente aún tienen más datos pendientes. La variedad activada por el borde puede confiar en las señales en respuesta a los nuevos bytes que aparecen en un fd.Sería interesante averiguar cómo exactamente un hilo reanudado descubre qué fd lo despertó, pero ciertamente es posible que este dato se transmita durante la activación activada por epoll.
Obviamente,
poll
/select
no puedo usar edge-triggerepoll
ya que la semántica es diferente. Como vimos, la implementación con activación por nivelepoll
no traería beneficios de rendimiento asintótico. Y posiblemente, también lo afecte negativamente si los factores constantes o los términos constantes son altos (ya que parecen estar basados en un punto de referencia aproximado que hice y cité en otro comentario).Para obtener más información, lea Bloqueo de E / S, E / S sin bloqueo y Epoll .
fuente