Linux IO模式及 select、poll、epoll詳解
一. 涉及概念
用戶空間與內核空間
進程間切換
進程的阻塞
文件描述符
緩存I/O
用戶控件與內核空間
操作系統根據尋址空間,劃分為內核空間與用戶控件。
Linux 操作系統的高位1G字節為內核使用;低位3G字節位用戶使用 (32位操作系統而言)
- 進程切換
為了控制進程的執行,內核必須有能力掛起正在CPU上運行的進程,并恢復以前掛起的某個進程的執行。這種行為被稱為進程切換
- 進程的阻塞
正在執行的進程,由于期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新數據尚未到達或無新工作做等,則由系統自動執行阻塞原語(Block),使自己由運行狀態變為阻塞狀態。當進程進入阻塞狀態,是不占用cpu資源的
- 文件描述符fd
文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符
- 緩存I/O
緩存 I/O 又被稱作標準 I/O,大多數文件系統的默認 I/O 操作都是緩存 I/O。在 Linux 的緩存 I/O 機制中,操作系統會將 I/O 的數據緩存在文件系統的頁緩存( page cache )中,也就是說,數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。
select,poll,epoll 都屬于用戶進程調用函數,整個進程進入block狀態(block狀態不占用CPU);
而同時kernel監控所有函數指負責的socket文件描述符,有任何的一個socket中的數據準備好了,select(poll,epoll)就會返回;
用戶進程此時將會終止block狀態,進行下一步的操作。