### 簡介
Epoll是poll的改進版,更加高效,能同時處理大量文件描述符,跟高并發有關,Nginx就是充分利用了epoll的特性。講這些沒用,我們先了解poll是什么。
### Poll
Poll本質上是Linux系統調用,其接口為`int poll(struct pollfd *fds,nfds_t nfds, int timeout)`,作用是監控資源是否可用。
舉個例子,一個Web服務器建了多個socket連接,它需要知道里面哪些連接傳輸發了請求需要處理,功能與`select`系統調用類似,不過`poll`不會清空文件描述符集合,因此檢測大量socket時更加高效。
### Epoll
我們重點看看epoll,它大幅提升了高并發服務器的資源使用率,相比poll而言哦。前面提到poll會輪詢整個文件描述符集合,而epoll可以做到只查詢被內核IO事件喚醒的集合,當然它還提供邊沿觸發(Edge Triggered)等特性。
不知大家是否了解C10K問題,指的是服務器如何支持同時一萬個連接的問題。如果是一萬個連接就有至少一萬個文件描述符,poll的效率也隨文件描述符的更加而下降,epoll不存在這個問題是因為它僅關注活躍的socket。
### 實現
這是怎么做到的呢?簡單來說epoll是基于文件描述符的callback函數來實現的,只有發生IO時間的socket會調用callback函數,然后加入epoll的Ready隊列。更多實現細節可以參考Linux源碼,
### Mmap
無論是select、poll還是epoll,他們都要把文件描述符的消息送到用戶空間,這就存在內核空間和用戶空間的內存拷貝。其中epoll使用mmap來共享內存,提高效率。
Mmap不是進程的概念,這里提一下是因為epoll使用了它,這是一種共享內存的方法,而Go語言的設計宗旨是"不要通過共享來通信,通過通信來共享",所以我們也可以思考下進程的設計,是使用mmap還是Go提供的channel機制呢。
- 前言
- 致謝
- 概述
- 使用代碼
- 使用Docker
- 進程基礎
- 進程是什么
- Hello World
- PID
- PPID
- 使用PID
- 進程名字
- 進程參數
- 輸入與輸出
- 并發與并行
- 進程越多越好
- 進程狀態
- 退出碼
- 進程資源
- 死鎖
- 活鎖
- POSIX
- Nohup
- 運行進程
- Go編程實例
- 衍生新進程
- 執行外部程序
- 復制進程
- 進程進階
- 文件鎖
- 孤兒進程
- 僵尸進程
- 守護進程
- 進程間通信
- 信號
- Linux系統調用
- 文件描述符
- Epoll
- 共享內存
- Copy On Write
- Cgroups
- Namespaces
- 項目實例Run
- 項目架構
- 代碼實現
- 注意事項
- 創建目錄權限
- 捕獲SIGKILL
- Sendfile系統調用
- 后記
- 參考書籍
- 項目學習
- 再次感謝