Libev использует три структуры данных для хранения разных наблюдателей.
Куча: для наблюдателей, отсортированных по времени, например ev_timer
и ev_periodic
.
Связанный список: например, ev_io
, ev_signal
, ev_child
и т. д.
Массив: например, ev_prepare
, ev_check
, ev_async
и т. д.
Нет никаких сомнений в том, что для хранения наблюдателя за таймером используется куча. Но каковы критерии выбора связанного списка и массива?
Структура данных, в которой хранятся наблюдатели ev_io, кажется немного сложной. Во-первых, это массив с индексом fd
, а элемент массива представляет собой связанный список ev_io watcher
. Выделить место под массив удобнее, если в качестве элемента использовать связанный список. Это причина?
Или просто из-за того, что операция вставки или удаления ev_io
выполняется чаще, а ev_prepare
кажется более стабильной?
Или какие-то другие причины?