基礎(chǔ)概念
通過I/O模型學(xué)習(xí)同步/異步、阻塞/非阻塞基礎(chǔ)概念,參考資料如下:
《Unix網(wǎng)絡(luò)編程》
《網(wǎng)絡(luò)編程釋疑之:同步闯两,異步褥伴,阻塞,非阻塞》
《Java NIO:淺析I/O模型》
《高性能IO模型淺析》基礎(chǔ)概念學(xué)習(xí)小結(jié)
- 系統(tǒng)I/O操作涉及用戶進(jìn)程和內(nèi)核進(jìn)程兩個(gè)通信主體漾狼,有四種常用I/O模型:阻塞I/O重慢,非阻塞I/O,I/O復(fù)用逊躁,異步I/O
- 從用戶進(jìn)程主體角度來看似踱,同步I/O請(qǐng)求操作分為兩個(gè)階段
- A:等待內(nèi)核準(zhǔn)備數(shù)據(jù),即數(shù)據(jù)完全到達(dá)內(nèi)核空間
- B:等待內(nèi)核將數(shù)據(jù)從內(nèi)核空間拷貝至用戶空間
- 阻塞和非阻塞I/O的區(qū)別發(fā)生在A階段稽煤,如用戶進(jìn)程始終等待A階段完成核芽,則為阻塞I/O,否則為非阻塞I/O酵熙,而在B階段轧简,都需要用戶進(jìn)程進(jìn)行數(shù)據(jù)讀寫操作
- 從用戶進(jìn)程主體角度來看,異步I/O請(qǐng)求操作不感知內(nèi)核主體的操作階段匾二,發(fā)送I/O請(qǐng)求后立即返回哮独,內(nèi)核會(huì)自動(dòng)完成A、B階段工作察藐,并通知用戶進(jìn)程進(jìn)行數(shù)據(jù)處理皮璧,此機(jī)制需要操作系統(tǒng)底層的支持,如下圖所示
多路復(fù)用模型(IO Multiplexing)
- 多路復(fù)用I/O模型是同步阻塞的分飞,這里是從單個(gè)I/O線程的角度來說
- 多路復(fù)用I/O阻塞在select悴务、epoll這樣的系統(tǒng)調(diào)用上,而不是阻塞在I/O系統(tǒng)調(diào)用recvfrom上
- 對(duì)于單個(gè)I/O操作浸须,多路復(fù)用并不比阻塞I/O有優(yōu)勢(shì)惨寿,反而增加了一次系統(tǒng)調(diào)用
- 多路復(fù)用I/O的優(yōu)勢(shì)體現(xiàn)在同時(shí)處理多個(gè)文件描述符輸入輸出操作、多個(gè)套接字操作的時(shí)候删窒,有任何一個(gè)準(zhǔn)備就緒裂垦,select就可以返回(從并發(fā)的角度看,也有人認(rèn)為這是“異步”肌索,但從單個(gè)用戶線程的角度看蕉拢,仍處于等待數(shù)據(jù)或者拷貝數(shù)據(jù)的狀態(tài))
- 多路復(fù)用I/O中,輪詢每個(gè)socket狀態(tài)是內(nèi)核在進(jìn)行的诚亚,這個(gè)效率要比用戶進(jìn)程要高的多晕换,因此性能強(qiáng)于非阻塞I/O在用戶進(jìn)程中的輪詢
- 多路復(fù)用的幾種系統(tǒng)調(diào)用之間的區(qū)別,參考《select、poll惧磺、epoll之間的區(qū)別總結(jié)》
容易發(fā)生混淆的坑
很多人將多路復(fù)用模型(IO Multiplexing)稱之為異步阻塞I/O蠕蚜,這種方式將引起誤解,為此夷家,澄清如下:
Synchronous I/O versus Asynchronous I/O
POSIX defines these two terms as follows:
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
An asynchronous I/O operation does not cause the requesting process to be blocked.
Using these definitions, the first four I/O models (blocking, nonblocking, I/O multiplexing, and signal-driven I/O) are all synchronous because the actual I/O operation (recvfrom) blocks the process. Only the asynchronous I/O model matches the asynchronous I/O definition.