epoll
এপোল
Linux-এর scalable readiness notification API — হাজার হাজার idle socket-এর মধ্যে ready-গুলো O(ready) সময়ে দেয়।
C10K সমস্যা: connection হাজারে, active এক মুহূর্তে মাত্র কয়েকটা। Thread-per-connection অপচয়; select/poll প্রতি call-এ সব fd kernel-এ সরিয়ে আনে আর সব scan করে — O(n), connection বাড়লে খরচ বাড়ে।
epoll-এর মডেল — interest list একবার kernel-এ জমা থাকে;
epoll_wait শুধু ready-গুলো ফেরত দেয়:
int ep = epoll_create1(0);
struct epoll_event ev = { .events = EPOLLIN, .data.fd = srv };
epoll_ctl(ep, EPOLL_CTL_ADD, srv, &ev); // একবারই নিবন্ধন
struct epoll_event out[64];
int n = epoll_wait(ep, out, 64, -1); // ready fds
for (int i = 0; i < n; i++) handle(out[i].data.fd);
Level vs edge trigger — LT-তে data থাকা পর্যন্ত বারবার জানায়; ET-তে edge-এ একবারই — non-blocking fd + buffer পুরো খাওয়ার শৃঙ্খলা লাগে, বদলে syscall কম।
nginx, redis, node-এর event loop — নিচে সবার এই জাতীয় mechanism; BSD/macOS-এ kqueue, Windows-এ IOCP সমপর্যায়ের।