一. POSIX對同步、異步I/O的定義
我們先大致看看POSIX對同步、異步的定義,不用細究,重點看我標紅的部分就行。
同步I/O會導致請求進程阻塞,直到I/O操作完成;
異步I/O不會導致請求進程阻塞。
二. 同步、異步,阻塞、非阻塞
個人理解同步與否與阻塞與否只是看待問題的不同維度,不用過于追究同步和阻塞有什么區別、以及異步和非阻塞有什么區別。
我用小明購買火車票的例子大致先講述下同步、異步,阻塞、非阻塞這幾種情況的組合。
同步阻塞,小明去火車站買票。首先,他需要在某一個售票窗口排隊,當輪到他買票時,他需要告訴售票員他需要一張去上海的火車票,然后售票員需要去系統查詢是否還有余票,有的話再收款出票,最后再把票給小明。在火車票到手之前,小明都不能做其他的事情,這種情況我們可以理解為阻塞。
同步非阻塞,小明委托黃牛幫忙買火車票,然后小明可以做其他事情,但是需要每隔10分鐘就打電話去詢問黃牛票是否買到。黃牛買到票后,打電話通知小明說票已經買到,小明再去黃牛那里取火車票。這里的非阻塞指的是黃牛在買票的過程中,小明是不用等待的,他可以做其他事情,只是需不時地去詢問黃牛票是否買好。但是,在小明去黃牛那里取票的過程中,小明還是不能做其他事情。
異步阻塞,基本上沒有這個說法。
異步非阻塞,小明委托黃牛幫忙買火車票,然后小明可以做其他事情,黃牛買好票后會自動把票送到小明的家里。在這整個過程中,小明都可以做他自己想做的事情,不會被阻塞。
三. Unix中的I/O模型
OK,有了上面的基礎過后,我們可以開始講I/O模型了。
在網絡Socket的輸入操作中,I/O大致可以分為兩個階段,這個兩個階段大家務必掌握:
數據從網絡中抵達,然后數據被復制到系統內核的緩沖區;
系統內核將內核緩沖區中的數據復制到用戶進程的緩沖區中。
在Unix中有5種I/O模型,它們是:
阻塞式I/O
非阻塞式I/O
多路復用I/O
信號驅動I/O
異步I/O
下面,我們逐一分析每種I/O模型。
1.阻塞式I/O
阻塞式I/O,即Blocking I/O。用戶發起一個recvfrom系統調用,內核會等待數據從網絡中到達。一旦數據準備就緒,系統內核將把自己的緩沖區中的數據拷貝到用戶進程的緩沖區。在系統內核等待數據、復制數據的過程中,用戶進程是不能做其他任何事情的,只能等待內核完成上述一系列的操作。
2.非阻塞式I/O
與阻塞式I/O不同,非阻塞式I/O中,用戶進程在發起recvfrom系統調用后可以立即返回,但是用戶進程需要不時地循環詢問系統內核數據是否已經準備就緒,即輪詢(polling)。輪詢往往會消耗大量的CPU時間。
下圖中,用戶進程發起recvfrom系統調用,由于系統內核中數據尚未就緒,內核會立即返回EWOULDBLOCK錯誤碼,防止用戶進程阻塞。如此往復,直到系統內核中數據準備就緒。在數據就緒前,用戶進程是非阻塞的,這也就是為什么這種模型叫非阻塞式I/O的原因。數據就緒后,和阻塞式I/O一樣,內核將數據拷貝至用戶進程,在數據拷貝的過程中,用戶進程是阻塞的。
3.多路復用I/O
多路復用I/O的關鍵函數為select或者poll。我們以select函數為例,當我們調用該函數時,用戶進程將阻塞,直到系統內核中的數據準備好。數據就緒后,系統會通知用戶進程數據已經可讀,然后用戶進程會發起recvfrom系統調用,將數據從內核拷貝到用戶進程,在數據拷貝期間,用戶進程是阻塞的。
使用多路復用的優勢是我們可以等待多個描述符就緒,對應到Java NIO多路復用模型中就是我們可以使用一個線程監聽多個Channel的請求。
4.信號驅動I/O
信號驅動I/O模型主要是讓內核在描述符就緒的時候發送SIGIO信號通知用戶進程,據我的了解,這種I/O模式運用的并不多,這里就不多描述,直接看圖吧。
5.異步I/O
用戶進程在調用異步I/O函數后會立即返回,并且會讓內核在完成所有操作后通知用戶進程。在內核進行I/O操作的期間,我們的用戶進程不會阻塞。特別需要注意的是,和前面四中I/O模型不同,異步I/O模型在內核將數據拷貝到用戶進程時,我們的用戶進程不會阻塞。
四. I/O模型對比
對比上述5中I/O模型我們可以發現,前面4種模型的區別主要在第一階段,而第二階段都是一樣的,即將數據從內核拷貝到用戶進程時都會阻塞。根據POSIX對同步、異步I/O的定義,可以得出前4種模型都屬于同步I/O。而第5種I/O,即異步I/O,兩個階段的操作都是由系統內核來處理的,用戶進程并沒有介入。
-
網絡
+關注
關注
14文章
7597瀏覽量
89110 -
UNIX
+關注
關注
0文章
296瀏覽量
41540 -
Posix
+關注
關注
0文章
36瀏覽量
9508
原文標題:Unix 中的 I/O 模型
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論