Nil A написал(а) к Alexey Vissarionov в Jan 22 03:21:56 по местному времени:
Нello, Alexey!
Sunday January 09 2022 09:18, from Alexey Vissarionov -> Nil A:
NA>> Как пример, Libuv вообще делает асинхронными дисковые операции,
NA>> которые на epoll() не повесишь,
AV> С чего бы вдруг? Дескриптор - он в любом случае дескриптор, а что там
AV> за ним - известно только ядру.
epoll() под низом работает с poll(), а poll() не реализован для файлов файловой системы, т.е. открытые файлы (а не сокеты) всегда возвращают готовность, поэтому, например, O_NONBLOCK для файлов бесполезен.
http://lxr.linux.no/linux+v5.14/fs/eventpoll.c#L2045
2045 /
The target file descriptor must support poll /
2046 error = -EPERM;
2047 if (!file
canpoll(tf.file))
2048 goto error
tgtfput;
Я нейтрально отношусь к продуктам компании Facebook (Meta сейчас), но иногда они приносят общественную польщу в виде опенсорца.
Например, в 2019 году ФБ отдал в ядро Линукса io_uring интерфейс, который как раз и создан решить проблему асинхронных (дисковых) операций.
До этого в 2.6 добавили aio, но им никто не пользуется, потому что не удобно - надо открывать файлы с флагом O_DIRECT, а это отключает кэшь страниц, и надо передавать буфера выравнивать по границе памяти.
До этого можно было только O_ASYNC флаг устанавливать и ловить сигналы - ещё хуже.
AV> Еще и треды... epoll тем и хорош, что все дескрипторы обрабатываются в
AV> одном потоке.
Для сокетов и прочих eventfd - epoll рулит, но вот без обыкновенных (regular) файлов.
Кстати, сначала в 2000м в BSD появился kqueue, а потом уже в 2002ом в линуксе epoll. Можно сказать "списали".
Best Regards, Nil
--- GoldED+/LNX 1.1.5