Unix下IO模型及他們之間的區別

目錄
一:Unix下5種IO模型
二:他們之間的區別


一:Unix下5種IO模型

  • 阻塞式IO
  • 非阻塞式IO
  • IO多路複用(select和poll)
  • 信號驅動式IO(SIGIO)
  • 異步IO

對於一個套接字上的輸入操作,兩個階段:
1)等待數據從網絡中到達,被複制到內核中的某個緩衝區;
2)將數據從內核緩衝區複製到應用進程緩衝區;

  1. 阻塞式IO模型

     

    進程調用recvfrom,其系統調用直到數據報到達且被拷貝到應用進程的緩衝區中或者發生錯誤才返回。最常見的錯誤是系統調用被信號中斷。我們說進程在從調用recvfrom開始到它返回的整段時間內是被阻塞的。recvfrom成功返回後,應用進程開始處理數據。

  2. 非阻塞式IO
    進程把一個套接口設置成非阻塞是在通知內核:當所請求的I/O操作非得把本進程投入睡眠才能完成時,不要把本進程投入睡眠,而是返回一個錯誤。下圖展示了非阻塞I/O模型。

    前三次調用recvfrom時沒有數據可返回,因此內核轉而立即返回一個EWOULDBLOCK錯誤。第四次調用 recvfrom時已有數據報準備好,它被拷貝到應用進程緩衝區,recvfrom於是成功返回。我們接着處理數據。

    當一個應用進程像這樣對一個非阻塞描述字循環調用recvfrom時,我們稱之爲輪詢(polling)。應用進程持續輪詢內核,以查看某個操作是否就緒。這麼做往往耗費大量CPU時間,不過這種模型偶爾也會遇到,通常是在只專門提供某種功能的系統中才有。

  3. IO多路複用
    有了I/O複用(I/O multiplexing),我們就可以調用select或poll,阻塞在這兩個系統調用中的某一個之上,而不是阻塞在真正的I/O系統調用上。下圖展示了I/O複用模型。

    我們阻塞於select調用,等待數據報套接口變爲可讀。當select返回套接口可讀這一條件時,我們調用recvfrom把所讀數據報拷貝到應用進程緩衝區。

    與I/O複用密切相關的另一種I/O模型是在多線程中使用阻塞I/O。這種模型與I/O複用模型極爲相似,代替使用select阻塞在多個文件描述字上的是,使用多個線程(每個文件描述字一個線程),這樣每個線程都可以自由地調用諸如recvfrom之類的阻塞式I/O系統調用了。

  4. 信號驅動式IO(SIGIO)
    我們也可以用信號,讓內核在描述字就緒時發送SIGIO信號通知我們。

    我們首先開啓套接口的信號驅動I/O功能,並通過sigaction系統調用安裝一個信號處理函數。該系統調用立即返回,我們的進程繼續工作,也就是說它沒有被阻塞。當數據報準備好讀取時,內核就爲該進程產生一個SIGIO信號。我們隨後既可以在信號處理函數中調用recvfrom讀取數據報,並通知主循環數據已準備好待處理,也可以立即通知主循環,讓它讀取數據報

  5. 異步IO
    一般地說,這些函數的工作機制是:告知內核啓動某個操作,並讓內核在整個操作(包括將數據從內核拷貝到我們自己的緩衝區)完成後通知我們。
    這種模型與信號驅動模型的主要區別在於:信號驅動I/O是由內核通知我們何時啓動一個I/O操作,而異步I/O模型是由內核通知我們I/O操作何時完成。

二 :IO模型的比較

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章