IO發(fā)生時涉及的對象和步驟:
對象:
對于一個網(wǎng)絡(luò)IO,涉及到了兩個對象,一個是進程,另一個是系統(tǒng)內(nèi)核。當一個read發(fā)生時,會進行一下步驟
步驟:
數(shù)據(jù)的準備(即等待)
將數(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中,默認的socket都是阻塞的
一個典型的讀操作的流程大概是這樣的:
當用戶進程調(diào)用recv/recvfrom系統(tǒng)調(diào)用時,會檢查內(nèi)核接收緩沖區(qū)是否準備好了數(shù)據(jù),對于網(wǎng)絡(luò)IO 來說,很多時候數(shù)據(jù)在一開始的時候還沒有到達,所以進程會阻塞等待,直到內(nèi)核緩沖區(qū)數(shù)據(jù)準備好了(對UDP來說要收到一個完整的數(shù)據(jù)報),內(nèi)核就把數(shù)據(jù)拷貝到用戶緩沖區(qū),然后內(nèi)核返回結(jié)果。
所以,阻塞IO的特點就是在IO執(zhí)行的兩個階段都被block了
2.非阻塞IO
在linux中,socket可以通過參數(shù)被設(shè)置為非阻塞的
同樣,一個典型的阻塞讀操作的流程大是這樣的:
當調(diào)用recv/recvfrom系統(tǒng)調(diào)用時,檢查內(nèi)核是否準備好了數(shù)據(jù),如果沒有就直接返回一個error,并 不會阻塞等待數(shù)據(jù),用戶可以循環(huán)調(diào)用recv/recvfrom,這樣的話,如果內(nèi)核一直沒有準備好數(shù)據(jù), 函數(shù)就會一直返回一個error,直到數(shù)據(jù)準備好,才會把數(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ù)會不斷的輪詢它所負責的所有socket,當有任何一個 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時,當網(wǎng)絡(luò)套接字可讀后,內(nèi)核通過發(fā)送SIGIO信號通知應(yīng)用進程,于是應(yīng)用可以開 始讀取數(shù)據(jù)。該方式并不是異步I/O,因為實際讀取數(shù)據(jù)到應(yīng)用進程緩存的工作仍然是由應(yīng)用自己負責的。
5. 異步IO
當用戶進程發(fā)起一個read操作后,內(nèi)核收到該read操作后,首先它會立刻返回,所以不會對用戶進程 阻塞,然后它會等待數(shù)據(jù)的準備完成,再把數(shù)據(jù)拷貝到用戶內(nèi)存,完成之后,它會給用戶進程發(fā)送一個信號,告訴用戶進程read操作完成了
下面來思考這兩個問題:
1.阻塞IO與非阻塞IO的區(qū)別:
調(diào)用阻塞IO的時候進程會一直阻塞直到數(shù)據(jù)準備好,并且拷貝完成才解除阻塞
而非阻塞IO不會阻塞對應(yīng)進程,盡管數(shù)據(jù)還沒準備好,也會立刻返回
2.同步IO與異步IO的區(qū)別:
兩者的區(qū)別在于,同步IO在IO操作的時候會阻塞,這里的IO操作是真正意義上的IO操作,也就是非阻塞IO中的recv/recvfrom系統(tǒng)調(diào)用,當內(nèi)核準備好數(shù)據(jù)后,recvfrom會將數(shù)據(jù)從內(nèi)核拷貝到用戶中,這段時間內(nèi),進程是被阻塞的。
而異步IO則不一樣,當進程發(fā)起IO操作后,就直接返回,剩下的工作全部交給內(nèi)核來完成,知道內(nèi)核給用戶進程發(fā)送一個信號告訴它IO完成,整個過程中進程沒有被阻塞
非阻塞IO和異步IO:
在非阻塞IO中,雖然進程大部分時間都不會被阻塞i,但是它仍然要求進程去主動的check,并且當數(shù)據(jù)準備完成以后,也需要進程主動的再次調(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://jinyejixie.com/article32/dseosc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站制作、網(wǎng)站收錄、品牌網(wǎng)站制作、標簽優(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)
猜你還喜歡下面的內(nèi)容