I/O模型
對于一個網(wǎng)絡(luò)I/O通信過程链峭,比如網(wǎng)絡(luò)數(shù)據(jù)讀取畦娄,會涉及兩個對象,一個是調(diào)用這個I/O操作的用戶線程弊仪,另外一個就是操作系統(tǒng)內(nèi)核熙卡。一個進(jìn)程的地址空間分為用戶空間和內(nèi)核空間,用戶線程不能直接訪問內(nèi)核空間励饵。
當(dāng)用戶線程發(fā)起I/O操作后驳癌,網(wǎng)絡(luò)數(shù)據(jù)讀取操作會經(jīng)歷兩個步驟:
- 用戶線程等待內(nèi)核將數(shù)據(jù)從網(wǎng)卡拷貝到內(nèi)核空間。
- 內(nèi)核將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間曲横。
各種I/O模型的區(qū)別就是喂柒,它們實現(xiàn)這兩個步驟的方式是不一樣的不瓶。
同步阻塞I/O
用戶線程發(fā)起read調(diào)用后就阻塞了禾嫉,讓出CPU。內(nèi)核等待網(wǎng)卡數(shù)據(jù)到來蚊丐,把數(shù)據(jù)從網(wǎng)卡拷貝到內(nèi)核空間熙参,接著把數(shù)據(jù)拷貝到用戶空間,再把用戶線程叫醒麦备。
同步非阻塞I/O
用戶線程不斷的發(fā)起read調(diào)用孽椰,數(shù)據(jù)沒到內(nèi)核空間時,每次都返回失敗凛篙,直到數(shù)據(jù)到了內(nèi)核空間黍匾,這一次read調(diào)用后,在等待數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間這段時間里呛梆,線程還是阻塞的锐涯,等數(shù)據(jù)到了用戶空間再把線程叫醒。
I/O多路模型
用戶線程的讀取操作分成兩步了填物,線程先發(fā)起select調(diào)用纹腌,目的是問內(nèi)核數(shù)據(jù)準(zhǔn)備好了嗎。等內(nèi)核把數(shù)據(jù)準(zhǔn)備好了滞磺,用戶線程再發(fā)起read調(diào)用升薯。在等待數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間這段時間里,線程還是阻塞的击困。那為什么叫I/O多路復(fù)用呢涎劈?因為一次select調(diào)用可以向內(nèi)核查多個數(shù)據(jù)通道(Channel)的狀態(tài),所以叫多路復(fù)用。
信號驅(qū)動
異步I/O
用戶線程發(fā)起read調(diào)用的同事注冊一個回調(diào)函數(shù)责语,read立即返回炮障,等內(nèi)核將數(shù)據(jù)準(zhǔn)備好后,再調(diào)用指定的回調(diào)函數(shù)完成處理坤候。在這個過程中胁赢,用戶線程一直沒有阻塞。