✨Epoll
epoll là một Linux system call được sử dụng cho việc thông báo sự kiện trên các I/O (I/O event notification) và được giới thiệu lần đầu của phiên bản nhân Linux 2.5.44 để thay thế poll() system call trước đó với tính năng tương tự. epoll() giúp giám sát nhiều file descriptor của các I/O tương ứng để kiểm tra tính sẵn sàng của chúng. Trong các ứng dụng có số lượng lớn file descriptor cần giám sát, epoll có hiệu suất tốt hơn với độ phức tạp thuật toán là O(1) khi so với các system call tương tự trước đó có độ phức tạp thuật toán là O(n).)
epoll giống với kqueue của FreeBSD, với nhiều hàm ở tầng userspace, với mỗi hàm đều có một file descriptor, tương ứng với một kernel object (tạm dịch: đối tượng kernel), làm đối số. epoll dùng cấu trúc dữ liệu [red–black tree] (RB-tree) để theo dõi tất cả các file description mà nó được phân công.
API
Đối tượng của epoll API là epoll instance (tạm dịch đối tượng epoll), một cấu trúc dữ liệu ở phía kernel có thành phần chính gồm 2 list (tạm dịch: 2 danh sách): Hàm epoll_create()
là 1 phiên bản cũ hơn của epoll_create1()
và không được khuyến khích sử dụng kể từ Linux kernel version phiên bản 2.6.27 và glibc phiên bản 2.9.
Hàm epoll_ctl()
được dùng để thêm mới, chỉnh sửa hoặc xóa bỏ epoll instance (với file descriptor epfd
tương ứng) trong interest list cùng với sự kiện epoll (epoll_event
) tương ứng của file descriptor đó.
Hàm epoll_wait
được dùng để chờ đợi sử kiện epoll trong 1 khoảng thời gian timeout
(đơn vị mili giây) đã được ghi từ lần gọi hàm epoll_ctl()
trước đó cho file descriptor epfd tương ứng. Nếu sự kiện epoll này xảy ra, epoll_wait()
trả về số file descriptor đã sẵn sàng cho thao tác I/O, trả về 0
nếu không có file descriptor nào sẵn sàng trong thời gian timeout
, và trả về -1
nếu xảy ra lỗi.
Kích hoạt sự kiện epoll
epoll hỗ trợ cả 2 chế độ kích hoạt sự kiện là edge-triggered và level-triggered. Với edge-triggered, epoll_wait
sẽ trả về giá trị >0 (ứng với số file descriptor đã sẵn sàng cho thao tác I/O) khi sự kiện epoll xảy ra được đưa vào hàng đợi (enqueued) của đối tượng epoll. Cờ EPOLLET được sử dụng cho edge-trigger. Tuy nhiên, phần lớn các chỉ trách của Cantrill đã được giải quyết bởi các option EPOLLONESHOT
và EPOLLEXCLUSIVE
. EPOLLONESHOT
được thêm vào ở phiên bản 2.6.2 của Linux kernel mainline, xuất bản vào tháng 2 năm 2004. EPOLLEXCLUSIVE
được thêm vào ở phiên bản 4.5, xuất bản vào tháng 3 2016.