IO類型與IO模型
IO類型
同步與異步(synchronous,asynchronous):關注消息通知機制
同步:進程發出系統調用之后,不會立即有返回信息,但是一旦有返回信息,則一定是最終結果. 異步:進程發出系統調用之后,會有立即返回結果,但不是最終的結果,當內核處理完成之后,內核通過通知機制通知進程,該系統調用已完成.
阻塞與非阻塞(blocking,nonblocking):關注系統調用完成時,調用者的狀態
阻塞:調用者在返回結果之前,一直處于被掛起狀態,直到有調用結果返回時才能繼續工作. 非阻塞:調用者在調用結果返回之前,并不會被掛起,即系統調用這個動作不會阻塞調用者.
IO模型的分類
-
阻塞I/O
-
非阻塞I/O
-
復用I/O
-
事件驅動I/O
-
異步I/O
自己畫的
畫完之后參考網上的
阻塞I/O模型
當用戶進程發起系統調用之后,在內核還沒有完成該調用任務時,進程會一直被掛起,直到內核將調用完成(內核將數據從磁盤取出到內核內存做處理,處理完之后在將數據轉移至進程內存),這時進程才可以繼續工作.
非阻塞I/O模型
當用戶進程發起系統調用之后,該進程不會被掛起,先是處于盲等待狀態,反復向內核確認該調用是否完成,當內核將數據從磁盤取出到內核內存處理完成時,該進程會被掛起,并且內核會將處理的數據轉移至進程內存,這時進程來能繼續工作(該進程在數據從內核內存轉移至進程內存時,是被掛起).
復用I/O模型
當用戶進程發起系統調用之后,該進程可以發送多個處理請求交給內核處理,select,poll,epoll都是IO多路復用的機制。I/O多路復用就是通過一種機制,一個進程可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實現會負責把數據從內核拷貝到用戶空間.
事件驅動I/O模型
當用戶進程發起系統調用之后,內核會立即返回一個信號,表示該調用已經收到,接下來該進程可以去處理其他工作,當內核將數據在內核內存中準備好之后,就會通知該進程,進程這個時候就會被掛起,等待內核將數據轉移至進程內存,進程才可以繼續工作.
異步I/O模型
當用戶進程發起系統調用之后,內核會立即返回一個信號,表示該調用已經收到,進程可以自由活動,接下來內核處理數據,當內核將數據轉移至進程內存之后,會通知該進程數據已經準備好,此時進程只要去進程內存接著處理就OK.
原創文章,作者:nice_neo_linux,如若轉載,請注明出處:http://www.www58058.com/19860