日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5种网络IO模型介绍

發布時間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5种网络IO模型介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

5種網絡IO模型介紹

IO 模型分為以下幾種:

阻塞IO

非阻塞IO

信號驅動IO

IO多路復用

異步IO

前四個為同步IO

1 阻塞IO

一個IO操作需要兩步: 等待數據和拷貝數據。

blocking IO的特點就是在IO執行的兩個階段(等待數據和拷貝數據兩個階段)都被block了。

一直阻塞,知道兩步完成

2 非阻塞IO

從圖中可以看出,當用戶進程發出read操作時,如果kernel中的數據還沒有準備好,那么它并不會block用戶進程,而是立刻返回一個error。從用戶進程角度講 ,它發起一個read操作后,并不需要等待,而是馬上就得到了一個結果。用戶進程判斷結果是一個error時,它就知道數據還沒有準備好,于是它可以再次發送read操作。一旦kernel中的數據準備好了,并且又再次收到了用戶進程的system call,那么它馬上就將數據拷貝到了用戶內存,然后返回。

等待數據的不用阻塞,而是輪詢check,第二步阻塞。

所以,在非阻塞式IO中,用戶進程其實是需要不斷的主動詢問kernel數據準備好了沒有。

3 多路復用IO

和第二種一樣,調用system call之后,并不等待內核的返回結果而是立即返回。雖然返回結果的調用函數是一個異步的方式,但應用程序會被像select、poll和epoll等具有多個文件描述符的函數阻塞住,一直等到這個system call有結果返回了,再通知應用程序。這種情況,從IO操作的實際效果來看,多路復用IO和第一種同步阻塞IO是一樣的,應用程序都是一直等到IO操作成功之后(數據已經被寫入或者讀取),才開始進行下面的工作。不同點在于多路復用IO用一個select函數可以為多個文件描述符提供通知,提供了并發性。舉個例子:例如有一萬個并發的read請求,但是網絡上仍然沒有數據,此時這一萬個read會同時各自阻塞,現在用select、poll、epoll這樣的函數來專門負責阻塞同時監聽這一萬個請求的狀態,一旦有數據到達了就負責通知,這樣就將一萬個等待和阻塞轉化為一個專門的函數來負責與管理。

多路復用技術應用于JAVA NIO的核心類庫多路復用器Selector中,目前支持I/O多路復用的系統調用有select、pselect、poll、epoll,在linux編程中有一段時間一直在使用select做輪詢和網絡事件通知的,但是select支持一個進程打開的socket描述符(FD)收到了限制,一般為1024,由于這一限制,現在使用了epoll代替了select,而epoll支持一個進程打開的FD不受限制。

和第二個一樣,只是select可以支持并發。

4 異步IO

用戶進程發起read操作之后,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到一個asynchronous read之后,首先它會立刻返回,所以不會對用戶進程產生任何block。然后,kernel會等待數據準備完成,然后將數據拷貝到用戶內存,當這一切都完成之后,kernel會給用戶進程發送一個signal,告訴它read操作完成了

實現了真正的非阻塞,從開始發起操作到最后讀取完成,都不需要阻塞。

5 信號驅動IO

應用程序提交read請求,調用system call,然后內核開始處理相應的IO操作,而同時,應用程序并不等內核返回響應,就會開始執行其他的處理操作(應用程序沒有被IO阻塞),當內核執行完畢,返回read響應,就會產生一個信號或執行一個基于線程的回調函數來完成這次IO處理過程。在這里IO的讀寫操作是在IO事件發生之后由應用程序來完成。

6 同步和異步的區別

異步IO與同步IO的區別在于:同步IO是需要應用程序主動地循環去詢問是否有數據,而異步IO是通過像select等IO多路復用函數來同時檢測多個事件句柄來告知應用程序是否有數據。

同步是需要主動等待消息通知,而異步則是被動接受消息通知,通過回調、通知、狀態等方式來被動獲取消息。IO多路復用在阻塞到select階段時,用戶進程是主動等待并調用select函數來獲取就緒狀態消息,并且其進程狀態為阻塞。所以IO多路復用是同步阻塞模式。

7 阻塞和非阻塞的區別

調用一個方法,一直到拿到結果為止等待,則為阻塞。
調用一個方法,直接給你結果,則為非阻塞。

這么看來,同步和阻塞,異步和非阻塞看起來意思是一樣的,但是其實不然,同步異步強調的是方法的結果如何返回,而阻塞非阻塞強調的是執行方法的過程如何執行。比如,你去餐館吃飯,你點了一盤菜,你是繼續等待還是出去等老板打電話給你說菜好了,這就是同步異步。而你時不時問老板說菜好了嗎,老板可以在你問了之后回答馬上好一直到最后說好了是非阻塞,而阻塞是你問了一次,老板不說話,直到菜好了端出來回答一句好了。

總結

以上是生活随笔為你收集整理的5种网络IO模型介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。