高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)
高級IO:
五種典型IO:
阻塞IO/非阻塞IO/信號驅(qū)動IO/異步IO/IO多路轉(zhuǎn)接
IO多路轉(zhuǎn)接模型:select/poll/epoll
五種典型IO
阻塞IO
IO操作的流程:等待IO操作條件具備,然后進(jìn)行數(shù)據(jù)拷貝
為了完成IO操作發(fā)起調(diào)用,若當(dāng)前不具備IO操作條件,則等待,直到條件具備,完成IO操作后調(diào)用返回
釣魚的時候,手里一直握著魚竿,等待?上鉤。
非阻塞IO
為了完成IO操作發(fā)起調(diào)用,若當(dāng)前不具備IO操作條件,則立即報錯返回;可以干點其他的事情,循環(huán)過來進(jìn)行判斷
把魚竿放下去,去做其他事情,隔一段時間過來看一次,缺點:回來時?跑了。所以出現(xiàn)信號驅(qū)動IO
非阻塞IO往往需要程序員循環(huán)的方式反復(fù)嘗試讀寫文件描述符, 這個過程稱為輪詢. 這對CPU來說是較大的浪費, 一 般只有特定場景下才使用.
信號驅(qū)動IO
提前對IO信號自定義處理方式,當(dāng)IO條件具備時,操作系統(tǒng)通過信號通知進(jìn)程,這時候IO條件已經(jīng)具備,直接發(fā)起調(diào)用進(jìn)行數(shù)據(jù)拷貝
釣魚的時候,拋出魚竿,在魚竿上綁上一個鈴鐺,如果?咬鉤了,就能及時知道了
異步IO
IO操作條件的等待與數(shù)據(jù)拷貝都由操作系統(tǒng)來進(jìn)行等待與操作,等到IO操作完成后,通過信號通知進(jìn)程,進(jìn)程直接對數(shù)據(jù)進(jìn)行操作
釣魚的時候,拋出魚竿,找個人幫你釣魚,調(diào)到?了,叫一下你
總結(jié)
IO幾種操作中,IO操作效率越來越高,但是流程控制越來越復(fù)雜
高級IO重要概念
阻塞與非阻塞
- 阻塞:當(dāng)前不具備操作條件時,調(diào)用掛起等待,直到條件具備,完成操作后調(diào)用返回
- 非阻塞:當(dāng)前不具備操作條件,調(diào)用直接報錯返回
- 阻塞與非阻塞:關(guān)注的并不是操作是否完成,而是調(diào)用是否立即返回
同步通信 vs 異步通信
同步:當(dāng)前不具備操作條件時,調(diào)用掛起等待,直到條件具備,完成操作后調(diào)用返回
異步:發(fā)起操作的調(diào)用,這個操作并不由自己完成,由別人完成
同步與異步:關(guān)注的是操作是否由自己完成
同步通常是阻塞的;但是異步有阻塞也有非阻塞
-
異步阻塞:發(fā)起調(diào)用完成功能,功能由操作系統(tǒng)完成,但是進(jìn)程自身一直等待操作系統(tǒng)完成完成,完成之后返回
-
異步非阻塞:發(fā)起調(diào)用完成功能,功能由操作系統(tǒng)完成,進(jìn)程自身立即返回
-
所謂同步,就是在發(fā)出一個調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回. 但是一旦調(diào)用返回,就得 到返回值了; 換句話說,就是由調(diào)用者主動等待這個調(diào)用的結(jié)果;
-
異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果; 換句話說,當(dāng)一個異步 過程調(diào)用發(fā)出后,調(diào)用者不會立刻得到結(jié)果; 而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)、通知來通知調(diào)用 者,或通過回調(diào)函數(shù)處理這個調(diào)用.
同步和異步關(guān)注的是消息通信機(jī)制.
了解Linux下的AIO—異步IO
https://blog.csdn.net/brucexu1978/article/details/7085924
IO多路轉(zhuǎn)接/IO多路復(fù)用
對大量描述符進(jìn)行事件監(jiān)控(可讀事件/可寫事件/異常事件)監(jiān)控
作用
- 前邊基本的tcp服務(wù)器只能與一個客戶端通信一次
- 因為服務(wù)器端不知道新的客戶端連接請求以及客戶端數(shù)據(jù)什么時候到來,因此程序流程只能寫死,導(dǎo)致程序會卡死在accept/recv這里
- 假設(shè)服務(wù)端若是知道什么時候新的客戶端連接起來,這時候再調(diào)用accept;程序流程就不會卡再accept這里,假若服務(wù)端知道什么時候客戶端的數(shù)據(jù)到來,然后再進(jìn)行recv,程序流程就不會卡在recv這里
- 這時候服務(wù)端就可以實現(xiàn)并發(fā)操作,誰有數(shù)據(jù)到來就操作誰,否則不進(jìn)行操作
IO多路轉(zhuǎn)接
替進(jìn)程監(jiān)控大量描述符什么時候有什么事件,進(jìn)而進(jìn)程可以針對發(fā)生了相應(yīng)事件的描述符進(jìn)行相應(yīng)操作;
IO多路轉(zhuǎn)接模型
- select
- poll
- epoll
總結(jié)
以上是生活随笔為你收集整理的高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使命召唤手游an94毁灭浪潮怎么获得
- 下一篇: 在部署依赖比较多的包,例如angular