IO 概念
一個(gè)基本的 IO乱豆,它會(huì)涉及到兩個(gè)系統(tǒng)對(duì)象棕兼,一個(gè)是調(diào)用這個(gè) IO 的進(jìn)程對(duì)象望蜡,另一個(gè)就是系統(tǒng)內(nèi)核 (kernel)承匣。當(dāng)一個(gè) read 操作發(fā)生時(shí),它會(huì)經(jīng)歷兩個(gè)階段:
- 通過 read 系統(tǒng)調(diào)用想內(nèi)核發(fā)起讀請求锻弓。
- 內(nèi)核向硬件發(fā)送讀指令搓茬,并等待讀就緒兽掰。
- 內(nèi)核把將要讀取的數(shù)據(jù)復(fù)制到描述符所指向的內(nèi)核緩存區(qū)中竿滨。
- 將數(shù)據(jù)從內(nèi)核緩存區(qū)拷貝到用戶進(jìn)程空間中佳恬。
IO 模型對(duì)比
從等待數(shù)據(jù)和數(shù)據(jù)復(fù)制這兩個(gè)時(shí)間段捏境,指出了不同 I/O 模型的區(qū)別
?? 類比餐廳吃飯
看了幾篇文章毁葱,為了加深理解垫言,我做了文字排版上的優(yōu)化,方便從相似的地方發(fā)現(xiàn)他們本質(zhì)上的不同倾剿。
- 我們?nèi)ゲ蛷d吃飯筷频,會(huì)經(jīng)過以下幾個(gè)步驟:
- 首先你(用戶態(tài)進(jìn)程)在飯店(內(nèi)核態(tài)的進(jìn)程)根據(jù)菜單點(diǎn)菜
- 然后等待廚房準(zhǔn)備好 ? 等待數(shù)據(jù)
- 接著服務(wù)員(內(nèi)核態(tài)的進(jìn)程)上菜 ? 將數(shù)據(jù)從內(nèi)核復(fù)制到用戶空間
- 只點(diǎn)一個(gè)菜
- 然后在餐桌上開始等待
- 你在這個(gè)過程中什么事都不干
- 直到服務(wù)員上菜 ?
阻塞式 I/O 模型
- 等了一會(huì)兒然后就去問服務(wù)員,不斷重復(fù)問前痘,直到服務(wù)員上菜 ?
非阻塞式 I/O 模型
- 直到服務(wù)員上菜 ?
- 你給服務(wù)員留下手機(jī)凛捏,告訴他菜準(zhǔn)備好的話
- 先不要上菜,打個(gè)電話給你际度,然后你就出去玩耍了
- 等到菜準(zhǔn)備好了葵袭,服務(wù)員手機(jī)通知你,你立馬回到了餐廳
- 你對(duì)服務(wù)員說 “你現(xiàn)在可以上菜了”乖菱,于是你在餐桌上等待服務(wù)員把菜送上來,然后吃飯蓬网。 ?
信號(hào)驅(qū)動(dòng)式 I/O 模型
- 你對(duì)服務(wù)員說 “你現(xiàn)在可以上菜了”乖菱,于是你在餐桌上等待服務(wù)員把菜送上來,然后吃飯蓬网。 ?
- 等到菜準(zhǔn)備好了葵袭,服務(wù)員手機(jī)通知你,你立馬回到了餐廳
- 先上菜窒所,菜上桌了打電話給你,然后你就出去玩耍了
- 等到菜上桌了帆锋,服務(wù)員手機(jī)通知你吵取,你立馬回到了餐桌
- 開始吃飯。 ?
異步 I/O 模型
- 開始吃飯。 ?
- 等到菜上桌了帆锋,服務(wù)員手機(jī)通知你吵取,你立馬回到了餐桌
- 先不要上菜,打個(gè)電話給你际度,然后你就出去玩耍了
- 你在這個(gè)過程中什么事都不干
- 然后在餐桌上開始等待
- 你點(diǎn)了很多菜
- 然后在餐桌上開始等待
- 你在這個(gè)過程中什么事都不干
- 某個(gè)時(shí)刻其中一個(gè)菜或者多個(gè)菜廚房里同時(shí)好了锯厢,
- 服務(wù)員跑過來說皮官,“親,您的有些菜好了实辑,要現(xiàn)在上桌么捺氢?”
- 你回答,現(xiàn)在就上剪撬,于是服務(wù)員上一個(gè)菜(服務(wù)員一次只能上一個(gè)菜)摄乒,你就吃完一個(gè),上一個(gè)你就吃完一個(gè) ?
I/O 復(fù)用模型
- 某個(gè)時(shí)刻其中一個(gè)菜或者多個(gè)菜廚房里同時(shí)好了锯厢,
- 你在這個(gè)過程中什么事都不干
- 然后在餐桌上開始等待
參考資料: