Epoll: Linux system call để thông báo sự kiện trên các I/O

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):

  • Interest list (đôi khi còn được gọi là epoll set): Nhóm các file descriptor được epoll đưa vào danh sách cần giám sát
  • Ready list: Nhóm các file descriptor đã ở trạng thái ready (sẵn sàng) cho các thao tác I/O

Từ định nghĩa về 2 thành phần như trên, epoll hỗ trợ 3 API gồm epoll_create()epoll_create1(), epoll_ctl()epoll_wait().

int epoll_create(int size); int epoll_create1(int flags); 

2 hàm epoll_create1()epoll_create() có cùng tính năng khi đều khởi tạo một epoll instance. 2 hàm đều trả về một file descriptor, thường được đặt là epfd, tương ứng với epoll instance vừa khởi tạo đó. Đối số flag của hàm epoll_create1() chỉ chấp nhận 1 giá trị hợp lệ duy nhất là EPOLL_CLOEXEC. 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.

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 

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 đó.

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 

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. Với level-triggered mode, epoll_wait sẽ trả về giá trị >0 miễn là epoll event đó còn xảy ra.

Ví dụ với 1 pipe được giám sát với epoll sau khi nhận được data, struct epoll_event *events của epoll_wait sẽ được trả về với event tương ứng, cho biết rằng pipe đang có data để đọc. Giả sử rằng bên phía đọc pipe chỉ đọc 1 phần data trong pipe mà không đọc hết. Khi đó, ở chế độ level-triggered, những lần gọiepoll_wait tiếp theo sẽ đều trả về event để tiếp tục đọc, miễn là trong pipe vẫn còn data cho những lần đọc tiếp theo. Với chế độ edge-triggered, epoll_wait chỉ trả về 1 lần, tương ứng với sự kiện edge khi pipe chuyển từ "không có data" sang "có data".

Chỉ trích Epoll

Bryan Cantrill chỉ ra rằng epoll có những lỗi mà lẽ ra có thể tránh được, nếu nó học từ các phần mềm/chương trình tiền nhiệm như input/output completion ports, event ports (Solaris) và kqueue. 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 EPOLLONESHOTEPOLLEXCLUSIVE. 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.

Liên kết ngoài

Chú thích

Tags:

Kích hoạt sự kiện EpollChỉ trích EpollEpollĐộ phức tạp thuật toán

🔥 Trending searches on Wiki Tiếng Việt:

Nhà thờ chính tòa Đức Bà Sài GònChiến tranh Đông DươngBố già (phim 2021)Đỗ Nhật HàLệnh Ý Hoàng quý phiÂu LạcDanh sách quốc gia xã hội chủ nghĩaQuần thể di tích Cố đô Hoa LưNhà NguyênMã MorseOne PieceNguyễn Thúc Thùy TiênThám tử lừng danh ConanNghệ AnLandmark 81Trịnh TúTrần Kim TuyếnNgã ba Đồng LộcMinh MạngDương Thu HươngHiệp định Genève, 1954Vĩnh PhúcLê Đức AnhNATOChiến dịch Huế – Đà NẵngNguyễn Văn TrỗiNarutoTiêu ChiếnLạc Long QuânPhạm Phương Thảo (ca sĩ)Hoa KỳĐế quốc La MãKinh Dương VươngHỏa phụng liêu nguyênLGBTĐường lên đỉnh Olympia năm thứ 23Hoàng ĐanNguyễn TrãiĐường cao tốc Cầu Giẽ – Ninh BìnhViệt CộngElon MuskNhư Ý truyệnVõ Văn HoanTempestPhật giáo Hòa HảoĐảng Cộng sản Việt NamKylian MbappéTrung Dũng (diễn viên)VnExpressTổng công ty Bưu điện Việt NamHàn QuốcTrương Gia BìnhQuân đoàn 4, Quân đội nhân dân Việt NamĐịa lý châu ÁNhà Tây SơnCậu bé mất tíchChữ Quốc ngữTrí tuệ nhân tạoNewJeansLàoCubaTrần Hưng ĐạoGiải bóng đá vô địch quốc gia ĐứcĐồng ThápĐà LạtTổn thất nhân mạng trong Chiến tranh Việt NamBình ĐịnhHội chứng CyclopiaTào TháoSingaporeTôn giáoPháo (rapper)Running Man (chương trình truyền hình)Thủ tướng Chính phủ nước Cộng hòa xã hội chủ nghĩa Việt NamBảy hoàng tử của Địa ngụcVõ Thị SáuNgân hàng thương mại cổ phần Ngoại thương Việt NamLịch sử Việt Nam🡆 More