1. 程式人生 > >Linux IO模型

Linux IO模型

進程 mage com 開燈 回調 blocking 錯誤 事件 非阻塞

概述

I/O類型:

同步和異步:synchronous, asyncrhonous

關註的是消息通知機制
同步:調用發出不會立即返回,但一旦返回就可以返回最終結果;
異步:調用發出之後,被調用方立即返回消息,但返回的非最終結果;被調用者通過狀態、通知機制來通知調者,或通過回調函數來處理結果;

阻塞和非阻塞:block, nonblock

關註的是調用等調用結果(消息、返回值)時的狀態

阻塞:調用結果返回之前,調用者(調用線程)會被掛起;調用者只有在得到結果之後才會返回;
非阻塞:調用結果返回之前,調用不會阻塞當前線程;

講故事

事件:燒開水。
出場人物
:你,水壺兩把(普通水壺,簡稱水壺;電水壺:加電指示燈亮,水開,燈滅並發出嘀嘀聲)。 1.你把水壺放到火上,立等水開。(同步阻塞) 2.你把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞) 3.你用電水壺燒水,插電指示燈亮,水開燈滅並發出提示聲,中途就是不走,立等水開。(異步阻塞) 4.你覺得你傻,然後電水壺指示燈亮,就去去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞) 對號入座: 所謂同步異步,只是對於水壺而言。 普通水壺,同步;電水壺,異步。 雖然都能幹活,但電水壺可以在自己完工之後,提示你水開了。這是普通水壺所不能及的。同步只能讓調用者去輪詢自己(情況2中),造成你效率的低下。 所謂阻塞非阻塞,僅僅對於你而言
。 立等的你,阻塞;看電視的你,非阻塞。情況1和情況3中你就是阻塞的,媳婦喊你都不知道。 雖然3中電水壺是異步的,可對於立等的你沒有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發揮異步的效用。

Unix下的5中IO模型

  1. blocking IO
  2. nonblocking IO
  3. IO multiplexing(IO復用)
  4. signal driven IO(事件驅動IO)
  5. asyncrhonous IO(異步IO)

一個read操作:

  1. 等數據準備好;
  2. 從內核向進程復制數據;

技術分享

ps:進程發出系統調用recvfrom,內核將data-->內核空間-->用戶空間,這個過程完成後才返回recvfrom這個指令,整個過程進程處於等待狀態。

技術分享

ps:非阻塞IO:內核與進程間持續交互,數據為準備好時就返回一個錯誤。

技術分享

ps:IO多路復用是阻塞在select上,而未阻塞在真正的IO系統調用之上 ,如recvfrom。

技術分享

ps:事件驅動IO

  水平觸發:多次返回

  邊緣觸發:一次返回

技術分享

ps:真正的異步IO,進程一次通知,繼續執行,不用等待,內核完成data-->內核空間-->進程空間這個過程,然後通知進程。其他4中模型仍然是阻塞IO,都有至少一個過程是阻塞的。

技術分享

Linux IO模型