5種網(wǎng)絡(luò)I/O模型-創(chuàng)新互聯(lián)

IO發(fā)生時涉及的對象和步驟:

臨海網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),臨海網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為臨海上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的臨海做網(wǎng)站的公司定做!

對象:

對于一個網(wǎng)絡(luò)IO,涉及到了兩個對象,一個是進程,另一個是系統(tǒng)內(nèi)核。當(dāng)一個read發(fā)生時,會進行一下步驟

步驟:

  1. 數(shù)據(jù)的準(zhǔn)備(即等待)

  2. 將數(shù)據(jù)從內(nèi)核拷貝到應(yīng)用進程中

幾種I/O模型的區(qū)別一般就在以上兩個階段有所不同

下面介紹了5種不同的I/O模型:

阻塞IO

非阻塞IO

多路復(fù)用IO

信號驅(qū)動IO

異步IO

以上5中IO中,前4種為同步IO,第5種為異步IO

1. 阻塞IO

 在linux中,默認(rèn)的socket都是阻塞的

 一個典型的讀操作的流程大概是這樣的:

 當(dāng)用戶進程調(diào)用recv/recvfrom系統(tǒng)調(diào)用時,會檢查內(nèi)核接收緩沖區(qū)是否準(zhǔn)備好了數(shù)據(jù),對于網(wǎng)絡(luò)IO 來說,很多時候數(shù)據(jù)在一開始的時候還沒有到達,所以進程會阻塞等待,直到內(nèi)核緩沖區(qū)數(shù)據(jù)準(zhǔn)備好了(對UDP來說要收到一個完整的數(shù)據(jù)報),內(nèi)核就把數(shù)據(jù)拷貝到用戶緩沖區(qū),然后內(nèi)核返回結(jié)果。

   所以,阻塞IO的特點就是在IO執(zhí)行的兩個階段都被block了

2.非阻塞IO

 在linux中,socket可以通過參數(shù)被設(shè)置為非阻塞的

 同樣,一個典型的阻塞讀操作的流程大是這樣的:

 當(dāng)調(diào)用recv/recvfrom系統(tǒng)調(diào)用時,檢查內(nèi)核是否準(zhǔn)備好了數(shù)據(jù),如果沒有就直接返回一個error,并 不會阻塞等待數(shù)據(jù),用戶可以循環(huán)調(diào)用recv/recvfrom,這樣的話,如果內(nèi)核一直沒有準(zhǔn)備好數(shù)據(jù), 函數(shù)就會一直返回一個error,直到數(shù)據(jù)準(zhǔn)備好,才會把數(shù)據(jù)拷貝到用戶緩沖區(qū),并返回

   所以,用戶進程其實是需要不斷的主動詢問內(nèi)核數(shù)據(jù)好了沒有。

3. 多路復(fù)用IO

 系統(tǒng)提供select函數(shù)和epoll來實現(xiàn)多路復(fù)用輸入/輸出模型,select/epoll可以用單個進程來處理多個網(wǎng)絡(luò)接口的IO,它的基本原理就是這兩個函數(shù)會不斷的輪詢它所負(fù)責(zé)的所有socket,當(dāng)有任何一個  socket收到數(shù)據(jù)就會返回通知用戶,此時用戶調(diào)用recv/recvfrom,將數(shù)據(jù)從內(nèi)核拷貝到用戶內(nèi)存用戶進程其實也是一直被阻塞的,但和阻塞IO不同,該方式是select函數(shù)進行阻塞,而阻塞IO是recv函數(shù)進行阻塞,另外,select的優(yōu)勢是可以同時處理多個連接

4. 信號驅(qū)動IO

 使用信號驅(qū)動I/O時,當(dāng)網(wǎng)絡(luò)套接字可讀后,內(nèi)核通過發(fā)送SIGIO信號通知應(yīng)用進程,于是應(yīng)用可以開 始讀取數(shù)據(jù)。該方式并不是異步I/O,因為實際讀取數(shù)據(jù)到應(yīng)用進程緩存的工作仍然是由應(yīng)用自己負(fù)責(zé)的。

5. 異步IO

 當(dāng)用戶進程發(fā)起一個read操作后,內(nèi)核收到該read操作后,首先它會立刻返回,所以不會對用戶進程 阻塞,然后它會等待數(shù)據(jù)的準(zhǔn)備完成,再把數(shù)據(jù)拷貝到用戶內(nèi)存,完成之后,它會給用戶進程發(fā)送一個信號,告訴用戶進程read操作完成了

下面來思考這兩個問題:

1.阻塞IO與非阻塞IO的區(qū)別:

調(diào)用阻塞IO的時候進程會一直阻塞直到數(shù)據(jù)準(zhǔn)備好,并且拷貝完成才解除阻塞

而非阻塞IO不會阻塞對應(yīng)進程,盡管數(shù)據(jù)還沒準(zhǔn)備好,也會立刻返回

2.同步IO與異步IO的區(qū)別:

兩者的區(qū)別在于,同步IO在IO操作的時候會阻塞,這里的IO操作是真正意義上的IO操作,也就是非阻塞IO中的recv/recvfrom系統(tǒng)調(diào)用,當(dāng)內(nèi)核準(zhǔn)備好數(shù)據(jù)后,recvfrom會將數(shù)據(jù)從內(nèi)核拷貝到用戶中,這段時間內(nèi),進程是被阻塞的。

而異步IO則不一樣,當(dāng)進程發(fā)起IO操作后,就直接返回,剩下的工作全部交給內(nèi)核來完成,知道內(nèi)核給用戶進程發(fā)送一個信號告訴它IO完成,整個過程中進程沒有被阻塞

非阻塞IO和異步IO:

在非阻塞IO中,雖然進程大部分時間都不會被阻塞i,但是它仍然要求進程去主動的check,并且當(dāng)數(shù)據(jù)準(zhǔn)備完成以后,也需要進程主動的再次調(diào)用recvfrom來將數(shù)據(jù)拷貝到用戶內(nèi)存。而異步IO則完全不同。它就像是用戶進程將整個IO操作交給了他人(內(nèi)核)完成,然后他人做完后發(fā)信號通知。在此期間,用戶進程不需要去檢查IO操作的狀態(tài),也不需要主動的去拷貝數(shù)據(jù)。

《完》

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章名稱:5種網(wǎng)絡(luò)I/O模型-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article32/dseosc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站制作、網(wǎng)站收錄品牌網(wǎng)站制作、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)