5种网络IO模型介绍
5種網(wǎng)絡(luò)IO模型介紹
IO 模型分為以下幾種:
阻塞IO
非阻塞IO
信號驅(qū)動IO
IO多路復(fù)用
異步IO
前四個為同步IO
1 阻塞IO
一個IO操作需要兩步: 等待數(shù)據(jù)和拷貝數(shù)據(jù)。
blocking IO的特點就是在IO執(zhí)行的兩個階段(等待數(shù)據(jù)和拷貝數(shù)據(jù)兩個階段)都被block了。
一直阻塞,知道兩步完成
2 非阻塞IO
從圖中可以看出,當用戶進程發(fā)出read操作時,如果kernel中的數(shù)據(jù)還沒有準備好,那么它并不會block用戶進程,而是立刻返回一個error。從用戶進程角度講 ,它發(fā)起一個read操作后,并不需要等待,而是馬上就得到了一個結(jié)果。用戶進程判斷結(jié)果是一個error時,它就知道數(shù)據(jù)還沒有準備好,于是它可以再次發(fā)送read操作。一旦kernel中的數(shù)據(jù)準備好了,并且又再次收到了用戶進程的system call,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存,然后返回。
等待數(shù)據(jù)的不用阻塞,而是輪詢check,第二步阻塞。
所以,在非阻塞式IO中,用戶進程其實是需要不斷的主動詢問kernel數(shù)據(jù)準備好了沒有。
3 多路復(fù)用IO
和第二種一樣,調(diào)用system call之后,并不等待內(nèi)核的返回結(jié)果而是立即返回。雖然返回結(jié)果的調(diào)用函數(shù)是一個異步的方式,但應(yīng)用程序會被像select、poll和epoll等具有多個文件描述符的函數(shù)阻塞住,一直等到這個system call有結(jié)果返回了,再通知應(yīng)用程序。這種情況,從IO操作的實際效果來看,多路復(fù)用IO和第一種同步阻塞IO是一樣的,應(yīng)用程序都是一直等到IO操作成功之后(數(shù)據(jù)已經(jīng)被寫入或者讀取),才開始進行下面的工作。不同點在于多路復(fù)用IO用一個select函數(shù)可以為多個文件描述符提供通知,提供了并發(fā)性。舉個例子:例如有一萬個并發(fā)的read請求,但是網(wǎng)絡(luò)上仍然沒有數(shù)據(jù),此時這一萬個read會同時各自阻塞,現(xiàn)在用select、poll、epoll這樣的函數(shù)來專門負責(zé)阻塞同時監(jiān)聽這一萬個請求的狀態(tài),一旦有數(shù)據(jù)到達了就負責(zé)通知,這樣就將一萬個等待和阻塞轉(zhuǎn)化為一個專門的函數(shù)來負責(zé)與管理。
多路復(fù)用技術(shù)應(yīng)用于JAVA NIO的核心類庫多路復(fù)用器Selector中,目前支持I/O多路復(fù)用的系統(tǒng)調(diào)用有select、pselect、poll、epoll,在linux編程中有一段時間一直在使用select做輪詢和網(wǎng)絡(luò)事件通知的,但是select支持一個進程打開的socket描述符(FD)收到了限制,一般為1024,由于這一限制,現(xiàn)在使用了epoll代替了select,而epoll支持一個進程打開的FD不受限制。
和第二個一樣,只是select可以支持并發(fā)。
4 異步IO
用戶進程發(fā)起read操作之后,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到一個asynchronous read之后,首先它會立刻返回,所以不會對用戶進程產(chǎn)生任何block。然后,kernel會等待數(shù)據(jù)準備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存,當這一切都完成之后,kernel會給用戶進程發(fā)送一個signal,告訴它read操作完成了
實現(xiàn)了真正的非阻塞,從開始發(fā)起操作到最后讀取完成,都不需要阻塞。
5 信號驅(qū)動IO
應(yīng)用程序提交read請求,調(diào)用system call,然后內(nèi)核開始處理相應(yīng)的IO操作,而同時,應(yīng)用程序并不等內(nèi)核返回響應(yīng),就會開始執(zhí)行其他的處理操作(應(yīng)用程序沒有被IO阻塞),當內(nèi)核執(zhí)行完畢,返回read響應(yīng),就會產(chǎn)生一個信號或執(zhí)行一個基于線程的回調(diào)函數(shù)來完成這次IO處理過程。在這里IO的讀寫操作是在IO事件發(fā)生之后由應(yīng)用程序來完成。
6 同步和異步的區(qū)別
異步IO與同步IO的區(qū)別在于:同步IO是需要應(yīng)用程序主動地循環(huán)去詢問是否有數(shù)據(jù),而異步IO是通過像select等IO多路復(fù)用函數(shù)來同時檢測多個事件句柄來告知應(yīng)用程序是否有數(shù)據(jù)。
同步是需要主動等待消息通知,而異步則是被動接受消息通知,通過回調(diào)、通知、狀態(tài)等方式來被動獲取消息。IO多路復(fù)用在阻塞到select階段時,用戶進程是主動等待并調(diào)用select函數(shù)來獲取就緒狀態(tài)消息,并且其進程狀態(tài)為阻塞。所以IO多路復(fù)用是同步阻塞模式。
7 阻塞和非阻塞的區(qū)別
調(diào)用一個方法,一直到拿到結(jié)果為止等待,則為阻塞。
調(diào)用一個方法,直接給你結(jié)果,則為非阻塞。
這么看來,同步和阻塞,異步和非阻塞看起來意思是一樣的,但是其實不然,同步異步強調(diào)的是方法的結(jié)果如何返回,而阻塞非阻塞強調(diào)的是執(zhí)行方法的過程如何執(zhí)行。比如,你去餐館吃飯,你點了一盤菜,你是繼續(xù)等待還是出去等老板打電話給你說菜好了,這就是同步異步。而你時不時問老板說菜好了嗎,老板可以在你問了之后回答馬上好一直到最后說好了是非阻塞,而阻塞是你問了一次,老板不說話,直到菜好了端出來回答一句好了。
總結(jié)
以上是生活随笔為你收集整理的5种网络IO模型介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM方面知识
- 下一篇: 多路复用IO模型中的select和epo