Linux IO模式及 select、poll饲梭、epoll詳解
一. 涉及概念
用戶空間與內(nèi)核空間
進(jìn)程間切換
進(jìn)程的阻塞
文件描述符
緩存I/O
用戶控件與內(nèi)核空間
操作系統(tǒng)根據(jù)尋址空間乘盖,劃分為內(nèi)核空間與用戶控件。
Linux 操作系統(tǒng)的高位1G字節(jié)為內(nèi)核使用憔涉;低位3G字節(jié)位用戶使用 (32位操作系統(tǒng)而言)
- 進(jìn)程切換
為了控制進(jìn)程的執(zhí)行订框,內(nèi)核必須有能力掛起正在CPU上運(yùn)行的進(jìn)程,并恢復(fù)以前掛起的某個進(jìn)程的執(zhí)行兜叨。這種行為被稱為進(jìn)程切換
- 進(jìn)程的阻塞
正在執(zhí)行的進(jìn)程穿扳,由于期待的某些事件未發(fā)生,如請求系統(tǒng)資源失敗国旷、等待某種操作的完成纵揍、新數(shù)據(jù)尚未到達(dá)或無新工作做等,則由系統(tǒng)自動執(zhí)行阻塞原語(Block)议街,使自己由運(yùn)行狀態(tài)變?yōu)樽枞麪顟B(tài)泽谨。當(dāng)進(jìn)程進(jìn)入阻塞狀態(tài),是不占用cpu資源的
- 文件描述符fd
文件描述符在形式上是一個非負(fù)整數(shù)特漩。實(shí)際上吧雹,它是一個索引值,指向內(nèi)核為每一個進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表涂身。當(dāng)程序打開一個現(xiàn)有文件或者創(chuàng)建一個新文件時雄卷,內(nèi)核向進(jìn)程返回一個文件描述符
- 緩存I/O
緩存 I/O 又被稱作標(biāo)準(zhǔn) I/O,大多數(shù)文件系統(tǒng)的默認(rèn) I/O 操作都是緩存 I/O蛤售。在 Linux 的緩存 I/O 機(jī)制中丁鹉,操作系統(tǒng)會將 I/O 的數(shù)據(jù)緩存在文件系統(tǒng)的頁緩存( page cache )中妒潭,也就是說,數(shù)據(jù)會先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中揣钦,然后才會從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間雳灾。
select,poll冯凹,epoll 都屬于用戶進(jìn)程調(diào)用函數(shù)谎亩,整個進(jìn)程進(jìn)入block狀態(tài)(block狀態(tài)不占用CPU);
而同時kernel監(jiān)控所有函數(shù)指負(fù)責(zé)的socket文件描述符宇姚,有任何的一個socket中的數(shù)據(jù)準(zhǔn)備好了匈庭,select(poll,epoll)就會返回浑劳;
用戶進(jìn)程此時將會終止block狀態(tài)阱持,進(jìn)行下一步的操作。