UNIX網絡編程讀書筆記:I/O模型(阻塞、非阻塞、I/O複用、信號驅動、異步)

I/O模型

UNIX下可用的5種I/O模型:網絡

(1)阻塞I/O多線程

(2)非阻塞I/O異步

(3)I/O複用(select和poll)async

(4)信號驅動I/O(SIGIO)函數

(5)異步I/O線程

對於一個套接口上的輸入操做,第一步一般涉及等待數據從網絡中到達。當所等待分組到達時,它被拷貝到內核中的某個緩衝區。第二步就是把數據從內核緩衝區拷貝到應用進程緩衝區。3d

一、阻塞I/O模型

最流行的I/O模型是阻塞I/O(blocking I/O)模型。缺省狀況下,全部套接口都是阻塞的。指針

以數據報套接口做爲例子,咱們有下圖所示的情形:blog

image

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

二、非阻塞I/O模型

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

image

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

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

三、I/O複用模型

有了I/O複用(I/O multiplexing),咱們就能夠調用select或poll,阻塞在這兩個系統調用中的某一個之上,而不是阻塞在真正的I/O系統調用上。下圖展現了I/O複用模型。

image

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

比較I/O複用模型和阻塞I/O模型,I/O複用並無顯示出什麼優點,事實上因爲使用select須要使用兩個而不是單個系統調用,I/O複用還稍有劣勢。使用select的優點在於咱們能夠等待多個描述字就緒。

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

四、信號驅動I/O模型

咱們也能夠用信號,讓內核在描述字就緒時發送SIGIO信號通知咱們。咱們稱這種模型爲信號驅動I/O(signal-driven I/O),以下圖所示:

image

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

不管如何處理SIGIO信號,這種模型的優點在於等待數據報到達期間,進程不被阻塞。主循環能夠繼續執行,只要不時等待來自信號處理函數的通知:既能夠是數據已準備好被處理,也能夠是數據報已準備好被讀取。

五、異步I/O模型

異步I/O(asynchronous I/O)由POSIX規範定義。通常地說,這些函數的工做機制是:告知內核啓動某個操做,並讓內核在整個操做(包括將數據從內核拷貝到咱們本身的緩衝區)完成後通知咱們。這種模型與信號驅動模型的主要區別在於:信號驅動I/O是由內核通知咱們什麼時候啓動一個I/O操做,而異步I/O模型是由內核通知咱們I/O操做什麼時候完成。

image

咱們調用aio_read函數(POSIX異步I/O函數以aio_或lio_開頭),給內核傳遞描述字、緩衝區指針、緩衝區大小(與read相同的三個參數)、文件偏移(與lseek相似),並告訴內核當整個操做完成時如何通知咱們。該系統調用當即返回,在等待I/O完成期間,咱們的進程不被阻塞。

六、各類模型的比較

image

七、同步I/O和異步I/O

POSIX把這兩個術語定義以下:

  • 同步I/O操做(synchronous I/O operation)致使請求進程阻塞,直到I/O操做完成。
  • 異步I/O操做(asynchronous I/O operation)不致使請求進程阻塞。

根據上述定義,咱們的前4種模型——阻塞I/O模型、非阻塞I/O模型、I/O複用模型和信號驅動I/O模型都是同步I/O模型,由於其中真正的I/O操做(recvfrom)將阻塞進程。只有異步I/O模型與POSIX定義的異步I/O相匹配。

相關文章
相關標籤/搜索