高級IO:
五種典型IO:
阻塞IO/非阻塞IO/信號驅動IO/異步IO/IO多路轉接
IO多路轉接模型:select/poll/epoll
五種典型IO
阻塞IO
IO操作的流程:等待IO操作條件具備,然后進行數據拷貝
為了完成IO操作發起調用,若當前不具備IO操作條件,則等待,直到條件具備,完成IO操作后調用返回
釣魚的時候,手里一直握著魚竿,等待?上鉤。
非阻塞IO
為了完成IO操作發起調用,若當前不具備IO操作條件,則立即報錯返回;可以干點其他的事情,循環過來進行判斷
把魚竿放下去,去做其他事情,隔一段時間過來看一次,缺點:回來時?跑了。所以出現信號驅動IO
非阻塞IO往往需要程序員循環的方式反復嘗試讀寫文件描述符, 這個過程稱為輪詢. 這對CPU來說是較大的浪費, 一 般只有特定場景下才使用.
信號驅動IO
提前對IO信號自定義處理方式,當IO條件具備時,操作系統通過信號通知進程,這時候IO條件已經具備,直接發起調用進行數據拷貝
釣魚的時候,拋出魚竿,在魚竿上綁上一個鈴鐺,如果?咬鉤了,就能及時知道了
異步IO
IO操作條件的等待與數據拷貝都由操作系統來進行等待與操作,等到IO操作完成后,通過信號通知進程,進程直接對數據進行操作
釣魚的時候,拋出魚竿,找個人幫你釣魚,調到?了,叫一下你
總結
IO幾種操作中,IO操作效率越來越高,但是流程控制越來越復雜
高級IO重要概念
阻塞與非阻塞
- 阻塞:當前不具備操作條件時,調用掛起等待,直到條件具備,完成操作后調用返回
- 非阻塞:當前不具備操作條件,調用直接報錯返回
- 阻塞與非阻塞:關注的并不是操作是否完成,而是調用是否立即返回
同步通信 vs 異步通信
同步:當前不具備操作條件時,調用掛起等待,直到條件具備,完成操作后調用返回
異步:發起操作的調用,這個操作并不由自己完成,由別人完成
同步與異步:關注的是操作是否由自己完成
同步通常是阻塞的;但是異步有阻塞也有非阻塞
-
異步阻塞:發起調用完成功能,功能由操作系統完成,但是進程自身一直等待操作系統完成完成,完成之后返回
-
異步非阻塞:發起調用完成功能,功能由操作系統完成,進程自身立即返回
-
所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回. 但是一旦調用返回,就得 到返回值了; 換句話說,就是由調用者主動等待這個調用的結果;
-
異步則是相反,調用在發出之后,這個調用就直接返回了,所以沒有返回結果; 換句話說,當一個異步 過程調用發出后,調用者不會立刻得到結果; 而是在調用發出后,被調用者通過狀態、通知來通知調用 者,或通過回調函數處理這個調用.
同步和異步關注的是消息通信機制.
了解Linux下的AIO—異步IO
https://blog.csdn.net/brucexu1978/article/details/7085924
IO多路轉接/IO多路復用
對大量描述符進行事件監控(可讀事件/可寫事件/異常事件)監控
作用
- 前邊基本的tcp服務器只能與一個客戶端通信一次
- 因為服務器端不知道新的客戶端連接請求以及客戶端數據什么時候到來,因此程序流程只能寫死,導致程序會卡死在accept/recv這里
- 假設服務端若是知道什么時候新的客戶端連接起來,這時候再調用accept;程序流程就不會卡再accept這里,假若服務端知道什么時候客戶端的數據到來,然后再進行recv,程序流程就不會卡在recv這里
- 這時候服務端就可以實現并發操作,誰有數據到來就操作誰,否則不進行操作
IO多路轉接
替進程監控大量描述符什么時候有什么事件,進而進程可以針對發生了相應事件的描述符進行相應操作;
IO多路轉接模型
- select
- poll
- epoll