操作系統之 UNIX I/O 模型

1. 基本概念

  • 同步:所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。就是我調用一個功能,該功能沒有結束前,我死等結果。
  • 異步:當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。就是我調用一個功能,不需要知道該功能結果,該功能有結果後通知我(回調通知)。
  • 阻塞:阻塞調用函數是指調用結果返回之前,當前線程會被掛起,函數只有在得到結果之後纔會返回。也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。 例如,我們在socket 中調用 recv 函數,如果緩衝區中沒有數據,這個函數就會一直等待,直到有數據才返回。而此時,當前線程還會繼續處理各種各樣的消息。
  • 非阻塞:非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。通過 select 或 poll 或 epoll 通知調用者。

同步與異步是對應的,它們是線程之間的關係,兩個線程之間要麼是同步的,要麼是異步的。
阻塞與非阻塞是對同一個線程來說的,在某個時刻,線程要麼處於阻塞,要麼處於非阻塞。

2. 五大 I/O 模型

阻塞 I/O(blocking I/O),非阻塞 I/O (nonblocking I/O),I/O 複用(I/O multiplexing)、信號驅動I/O (signal driven I/O (SIGIO))、異步I/O (asynchronous I/O)。前4種是同步的後一種的異步的。

首先明白一個輸入操作通常包含兩個過程:等待數據準備好,從內核向進程複製數據。對於套接字上的輸入操作,第一步涉及等待數據從網絡中到達,被複制到內核中的某個緩衝區;第二步就是從內核緩衝區拷貝進應用進程緩衝區。

2.1 阻塞 I/O

進程會一直阻塞,直到數據拷貝完成。應用程序調用一個 IO 函數,導致應用程序阻塞,等待數據準備好。 如果數據沒有準備好,一直等待….數據準備好了,從內核拷貝到用戶空間,IO 函數返回成功指示。
阻塞I/O模型圖:在調用recv()/recvfrom() 函數時,發生在內核中等待數據和複製數據的過程。
在這裏插入圖片描述

2.2 非阻塞 I/O 模型

非阻塞IO通過進程反覆調用IO函數(輪詢,多次系統調用,並馬上返回)。我們把一個SOCKET 接口設置爲非阻塞就是告訴內核,當所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤(EWOULDBLOCK)。這樣我們的 I/O 操作函數將不斷的測試數據是否已經準備好,如果沒有準備好,繼續測試,直到數據準備好爲止。在這個不斷測試的過程中,會大量的佔用CPU的時間。

一個非阻塞模式套接字多次調用 recv() 函數的過程。前三次調用 recv() 函數時,內核數據還沒有準備好。因此,該函數立即返回 EWOULDBLOCK 錯誤代碼。第四次調用 recv() 函數時,數據已經準備好,被複制到應用程序的緩衝區中,recv() 函數返回成功指示,應用程序開始處理數據。
在這裏插入圖片描述

2.3 I/O 複用模型

在這裏插入圖片描述
能實現同時對多個IO端口進行監聽。調用阻塞在系統調用selcte上,而不是在 recv 真正的 IO 調用上面,內核數據準備好了,通知應用程序,然後調用 recv 將數據從內核空間拷貝到用戶空間處理。

2.4 信號驅動式 I/O 模型

使用信號,讓內核在描述符準備就緒的時候發送 SIGIO 信號通知我們,然後在信號回調函數裏面,將數據拷貝到用戶空間。
在這裏插入圖片描述
這種模型的優勢在於等待數據報到達期間進程不被阻塞。主循環可以繼續執行,只要等待來自信號處理函數的通知。

2.5 異步 I/O 模型

告知內核啓動某個操作,並讓內核在整個操作(包括將數據從內核複製到我們自己的緩衝區)完成後通知我們。這種模型與信號驅動模型的主要區別在於信號驅動式 I/O 是由內核通知我們何時可以啓動一個 I/O 操作,而異步 I/O 模型是由內核通知我們 I/O 操作何時完成。
在這裏插入圖片描述

3. 5大 I/O 模型比較

在這裏插入圖片描述
前4種模型的主要區別在於第一階段,因爲它們的第二階段是一樣的:在數據從內核複製到調用者的緩衝區期間,進程阻塞於 recvfrom 調用。相反,異步 I/O 模型在這兩個階段都要處理,從而不同於其他4種模型。
前4種模型一一阻塞式 I/O 模型、非阻塞式 I/O 模型、 I/O 複用模型和信號驅動式 I/O 模型都是同步 I/O 模型,因爲其中真正的 I/O 操作 (recvfrom) 將阻塞進程。只有異步 I/O 模型與 posrx定義的異步 I/O 相匹配。

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