傳奇sf 新開網(wǎng)站百度博客收錄提交入口
高級IO
1. 五種IO模型
-
阻塞IO:在內(nèi)核將數(shù)據(jù)準(zhǔn)備好之前,系統(tǒng)調(diào)用會(huì)一直等待。 所有的套接字,默認(rèn)都是阻塞方式。阻塞IO是最常見的IO模型。
-
非阻塞IO:如果內(nèi)核還未將數(shù)據(jù)準(zhǔn)備好,系統(tǒng)調(diào)用仍然會(huì)直接返回,并且返回
EWOULDBLOCK
錯(cuò)誤碼。非阻塞IO往往需要程序員循環(huán)的方式反復(fù)嘗試讀寫文件描述符,這個(gè)過程稱為輪詢。這對CPU來說是較大的浪費(fèi),一般只有特定場景下才使用。
-
信號驅(qū)動(dòng)IO:內(nèi)核將數(shù)據(jù)準(zhǔn)備好的時(shí)候,使用SIGIO信號通知應(yīng)用程序進(jìn)行IO操作。
-
IO多路轉(zhuǎn)接:雖然從流程圖上看起來和阻塞IO類似。實(shí)際上最核心在于IO多路轉(zhuǎn)接能夠同時(shí)等待多個(gè)文件描述符的就緒狀態(tài)。
-
異步IO:由內(nèi)核在數(shù)據(jù)拷貝完成時(shí),通知應(yīng)用程序(而信號驅(qū)動(dòng)是告訴應(yīng)用程序何時(shí)可以開始拷貝數(shù)據(jù))。
小結(jié):
任何IO過程中,都包含兩個(gè)步驟。第一是等待,第二是拷貝。而且在實(shí)際的應(yīng)用場景中,等待消耗的時(shí)間往往都遠(yuǎn)遠(yuǎn)高于拷貝的時(shí)間。讓IO更高效,最核心的辦法就是讓等待的時(shí)間盡量少。
2. 高級IO重要概念
2.1 同步通信 vs 異步通信
同步和異步關(guān)注的是消息通信機(jī)制:
- 所謂同步,就是在發(fā)出一個(gè)調(diào)用時(shí),在沒有得到結(jié)果之前,該調(diào)用就不返回。但是一旦調(diào)用返回,就得到返回值了;換句話說,就是由調(diào)用者主動(dòng)等待這個(gè)調(diào)用的結(jié)果;
- 異步則是相反,調(diào)用在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒有返回結(jié)果;換句話說,當(dāng)一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果;而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。
另外, 多線程的時(shí)候也提到同步和互斥,這里的同步通信和進(jìn)程之間的同步是完全不同的概念:
進(jìn)程/線程同步也是進(jìn)程/線程之間直接的制約關(guān)系是為完成某種任務(wù)而建立的兩個(gè)或多個(gè)線程,這個(gè)線程需要在某些位置上協(xié)調(diào)他們的工作次序而等待、傳遞信息所產(chǎn)生的制約關(guān)系. 尤其是在訪問臨界資源的時(shí)候
2.2 阻塞 vs 非阻塞
阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時(shí)的狀態(tài)。
- 阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回。
- 非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。
2.3 其他高級IO
非阻塞IO,紀(jì)錄鎖,系統(tǒng)V流機(jī)制,I/O多路轉(zhuǎn)接(也叫I/O多路復(fù)用),readv和writev函數(shù)以及存儲(chǔ)映射IO(mmap),這些統(tǒng)稱為高級IO。