Reference
The Implementation of epoll (1) (idndx.com)
Prerequisites
- inode:可以理解為linux下每個文件的index number,其存儲了關于這個文件的所有metadata,比如其讀寫權限,size,文件類型,以及文件內容存儲的位置等等(Detailed Understanding of Linux Inodes)
FAQ
Q: 為什么epoll實體(instance)是用fd來進行引用呢?
A:因為這可以讓epoll實體變得和socket一樣可以poll
Q:epoll的核心是什么?
A:核心就是struct eventpoll
這個內核數據結構,它定義并維護了epoll所需的所有操作;通過epoll_create()
創建一個epoll實體,而在底層就對應一個struct eventpoll
,一些細節如下:
- 首先通過
ep_alloc()
創建一個struct eventpoll
; - 然后通過
fd = get_unused_fd_flags()
獲取一個系統當前還沒有使用過的fd; - 然后通過
struct file *anon_inode_getfile(const char *name, const struct file_operations *fops, void *priv, int flags)
獲取一個新的file;(priv參數對應的就是那個struct eventpoll實體) - 然后通過
fd_install(fd, file)
將fd和上面的file實體進行裝載,從而讓fd成為一個有效fd; - 最終,返回的這個fd就可以用來引用struct eventpoll實體!
Q:epoll是如何記住用戶注冊的所有fd的?
A:通過struct eventpoll
中的rbr
成員,該成員是一個紅黑樹