老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

小編給大家分享一下IO模型及select、poll、epoll和kqueue的區(qū)別有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比延川網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式延川網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋延川地區(qū)。費用合理售后完善,十載實體公司更值得信賴。

  • blocking I/O

  • nonblocking I/O

  • I/O multiplexing (select and poll)

  • signal driven I/O (SIGIO)

  • asynchronous I/O (the POSIX aio_functions)—————異步IO模型最大的特點是 完成后發(fā)回通知。

    阻塞與否,取決于實現(xiàn)IO交換的方式。

         異步阻塞是基于select,select函數(shù)本身的實現(xiàn)方式是阻塞的,而采用select函數(shù)有個好處就是它可以同時監(jiān)聽多個文件句柄.

         異步非阻塞直接在完成后通知,用戶進(jìn)程只需要發(fā)起一個IO操作然后立即返回,等IO操作真正的完成以后,應(yīng)用程序會得到IO操作完成的通知,此時用戶進(jìn)程只需要對數(shù)據(jù)進(jìn)行處理就好了,不需要進(jìn)行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經(jīng)由內(nèi)核完成了。

1 blocking I/O 

這個不用多解釋吧,阻塞套接字。下圖是它調(diào)用過程的圖示:

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

重點解釋下上圖,下面例子都會講到。首先application調(diào)用 recvfrom()轉(zhuǎn)入kernel,注意kernel有2個過程,wait for data和copy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此過程一直是阻塞的。

2 nonblocking I/O: 

與blocking I/O對立的,非阻塞套接字,調(diào)用過程圖如下:

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

可以看見,如果直接操作它,那就是個輪詢。。直到內(nèi)核緩沖區(qū)有數(shù)據(jù)。

3 I/O multiplexing (select and poll) 

最常見的I/O復(fù)用模型,select。

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

select先阻塞,有活動套接字才返回。與blocking I/O相比,select會有兩次系統(tǒng)調(diào)用,但是select能處理多個套接字。

4 signal driven I/O (SIGIO) 

只有UNIX系統(tǒng)支持,感興趣的課查閱相關(guān)資料

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

I/O multiplexing (select and poll)相比,它的優(yōu)勢是,免去了select的阻塞與輪詢,當(dāng)有活躍套接字時,由注冊的handler處理。

5 asynchronous I/O (the POSIX aio_functions) 

很少有*nix系統(tǒng)支持,windows的IOCP則是此模型

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

完全異步的I/O復(fù)用機制,因為縱觀上面其它四種模型,至少都會在由kernel copy data to appliction時阻塞。而該模型是當(dāng)copy完成后才通知application,可見是純異步的。好像只有windows的完成端口是這個模型,效率也很出色。

6 下面是以上五種模型的比較

IO模型及select、poll、epoll和kqueue的區(qū)別有哪些

可以看出,越往后,阻塞越少,理論上效率也是最優(yōu)。

=====================分割線==================================

5種模型的比較比較清晰了,剩下的就是把select,epoll,iocp,kqueue按號入座那就OK了。

select和iocp分別對應(yīng)第3種與第5種模型,那么epoll與kqueue呢?其實也于select屬于同一種模型,只是更高級一些,可以看作有了第4種模型的某些特性,如callback機制。

為什么epoll,kqueue比select高級? 

答案是,他們無輪詢。因為他們用callback取代了。想想看,當(dāng)套接字比較多的時候,每次select()都要通過遍歷FD_SETSIZE個Socket來完成調(diào)度,不管哪個Socket是活躍的,都遍歷一遍。這會浪費很多CPU時間。如果能給套接字注冊某個回調(diào)函數(shù),當(dāng)他們活躍時,自動完成相關(guān)操作,那就避免了輪詢,這正是epoll與kqueue做的。

windows or *nix (IOCP or kqueue/epoll)?

誠然,Windows的IOCP非常出色,目前很少有支持asynchronous I/O的系統(tǒng),但是由于其系統(tǒng)本身的局限性,大型服務(wù)器還是在UNIX下。而且正如上面所述,kqueue/epoll 與 IOCP相比,就是多了一層從內(nèi)核copy數(shù)據(jù)到應(yīng)用層的阻塞,從而不能算作asynchronous I/O類。但是,這層小小的阻塞無足輕重,kqueue與epoll已經(jīng)做得很優(yōu)秀了。

提供一致的接口,IO Design Patterns

實際上,不管是哪種模型,都可以抽象一層出來,提供一致的接口,廣為人知的有ACE,Libevent(基于reactor模式)這些,他們都是跨平臺的,而且他們自動選擇最優(yōu)的I/O復(fù)用機制,用戶只需調(diào)用接口即可。說到這里又得說說2個設(shè)計模式,Reactor and Proactor。見:Reactor模式--VS--Proactor模式。Libevent是Reactor模型,ACE提供Proactor模型。實際都是對各種I/O復(fù)用機制的封裝。

Java nio包是什么I/O機制?

 現(xiàn)在可以確定,目前的java本質(zhì)是select()模型,可以檢查/jre/bin/nio.dll得知。至于java服務(wù)器為什么效率還不錯。。我也不得而知,可能是設(shè)計得比較好吧。。-_-。

=====================分割線==================================

總結(jié)一些重點:

  1. 只有IOCP是asynchronous I/O,其他機制或多或少都會有一點阻塞。

  2. select低效是因為每次它都需要輪詢。但低效也是相對的,視情況而定,也可通過良好的設(shè)計改善

  3. epoll, kqueue、select是Reacor模式,IOCP是Proactor模式。

  4. java nio包是select模型。。

(二)epoll 與select的區(qū)別

1. 使用多進(jìn)程或者多線程,但是這種方法會造成程序的復(fù)雜,而且對與進(jìn)程與線程的創(chuàng)建維護(hù)也需要很多的開銷。(Apache服務(wù)器是用的子進(jìn)程的方式,優(yōu)點可以隔離用戶)  (同步阻塞IO)

 

2.一種較好的方式為I/O多路轉(zhuǎn)接(I/O multiplexing)(貌似也翻譯多路復(fù)用),先構(gòu)造一張有關(guān)描述符的列表(epoll中為隊列),然后調(diào)用一個函數(shù),直到這些描述符中的一個準(zhǔn)備好時才返回,返回時告訴進(jìn)程哪些I/O就緒。select和epoll這兩個機制都是多路I/O機制的解決方案,select為POSIX標(biāo)準(zhǔn)中的,而epoll為Linux所特有的。

 

區(qū)別(epoll相對select優(yōu)點)主要有三:

1.select的句柄數(shù)目受限,在linux/posix_types.h頭文件有這樣的聲明:#define __FD_SETSIZE    1024  表示select最多同時監(jiān)聽1024個fd。而epoll沒有,它的限制是最大的打開文件句柄數(shù)目。

 

2.epoll的最大好處是不會隨著FD的數(shù)目增長而降低效率,在selec中采用輪詢處理,其中的數(shù)據(jù)結(jié)構(gòu)類似一個數(shù)組的數(shù)據(jù)結(jié)構(gòu),而epoll是維護(hù)一個隊列,直接看隊列是不是空就可以了。epoll只會對"活躍"的socket進(jìn)行操作---這是因為在內(nèi)核實現(xiàn)中epoll是根據(jù)每個fd上面的callback函數(shù)實現(xiàn)的。那么,只有"活躍"的socket才會主動的去調(diào)用 callback函數(shù)(把這個句柄加入隊列),其他idle狀態(tài)句柄則不會,在這點上,epoll實現(xiàn)了一個"偽"AIO。但是如果絕大部分的I/O都是“活躍的”,每個I/O端口使用率很高的話,epoll效率不一定比select高(可能是要維護(hù)隊列復(fù)雜)。

 

3.使用mmap加速內(nèi)核與用戶空間的消息傳遞。無論是select,poll還是epoll都需要內(nèi)核把FD消息通知給用戶空間,如何避免不必要的內(nèi)存拷貝就很重要,在這點上,epoll是通過內(nèi)核于用戶空間mmap同一塊內(nèi)存實現(xiàn)的。

關(guān)于epoll工作模式ET,LT    

epoll有兩種工作方式

ET:Edge Triggered,邊緣觸發(fā)。僅當(dāng)狀態(tài)發(fā)生變化時才會通知,epoll_wait返回。換句話,就是對于一個事件,只通知一次。且只支持非阻塞的socket。

LT:Level Triggered,電平觸發(fā)(默認(rèn)工作方式)。類似select/poll,只要還有沒有處理的事件就會一直通知,以LT方式調(diào)用epoll接口的時候,它就相當(dāng)于一個速度比較快的poll.支持阻塞和不阻塞的socket。

三 Linux并發(fā)網(wǎng)絡(luò)編程模型

    1  Apache 模型,簡稱 PPC ( Process Per Connection ,):為每個連接分配一個進(jìn)程。主機分配給每個連接的時間和空間上代價較大,并且隨著連接的增多,大量進(jìn)程間切換開銷也增長了。很難應(yīng)對大量的客戶并發(fā)連接。

    2  TPC 模型( Thread Per Connection ):每個連接一個線程。和PCC類似。

    3  select 模型:I/O多路復(fù)用技術(shù)。

       .1 每個連接對應(yīng)一個描述。select模型受限于 FD_SETSIZE即進(jìn)程最大打開的描述符數(shù)linux2.6.35為1024,實際上linux每個進(jìn)程所能打開描數(shù)字的個數(shù)僅受限于內(nèi)存大小,然而在設(shè)計select的系統(tǒng)調(diào)用時,卻是參考FD_SETSIZE的值。可通過重新編譯內(nèi)核更改此值,但不能根治此問題,對于百萬級的用戶連接請求  即便增加相應(yīng) 進(jìn)程數(shù), 仍顯得杯水車薪呀。

      .2select每次都會掃描一個文件描述符的集合,這個集合的大小是作為select第一個參數(shù)傳入的值。但是每個進(jìn)程所能打開文件描述符若是增加了 ,掃描的效率也將減小。

      .3內(nèi)核到用戶空間,采用內(nèi)存復(fù)制傳遞文件描述上發(fā)生的信息。 

  4 poll 模型:I/O多路復(fù)用技術(shù)。poll模型將不會受限于FD_SETSIZE,因為內(nèi)核所掃描的文件 描述符集合的大小是由用戶指定的,即poll的第二個參數(shù)。但仍有掃描效率和內(nèi)存拷貝問題。

 5 pselect模型:I/O多路復(fù)用技術(shù)。同select。

 6 epoll模型:

    .1)無文件描述字大小限制僅與內(nèi)存大小相關(guān)

   .2)epoll返回時已經(jīng)明確的知道哪個socket fd發(fā)生了什么事件,不用像select那樣再一個個比對。

  .3)內(nèi)核到用戶空間采用共享內(nèi)存方式,傳遞消息。

四 :FAQ  

1、單個epoll并不能解決所有問題,特別是你的每個操作都比較費時的時候,因為epoll是串行處理的。 所以你有還是必要建立線程池來發(fā)揮更大的效能。 

2、如果fd被注冊到兩個epoll中時,如果有時間發(fā)生則兩個epoll都會觸發(fā)事件。

3、如果注冊到epoll中的fd被關(guān)閉,則其會自動被清除出epoll監(jiān)聽列表。
4、如果多個事件同時觸發(fā)epoll,則多個事件會被聯(lián)合在一起返回。
5、epoll_wait會一直監(jiān)聽epollhup事件發(fā)生,所以其不需要添加到events中。
6、為了避免大數(shù)據(jù)量io時,et模式下只處理一個fd,其他fd被餓死的情況發(fā)生。linux建議可以在fd聯(lián)系到的結(jié)構(gòu)中增加ready位,然后epoll_wait觸發(fā)事件之后僅將其置位為ready模式,然后在下邊輪詢ready fd列表。

看完了這篇文章,相信你對“IO模型及select、poll、epoll和kqueue的區(qū)別有哪些”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


本文標(biāo)題:IO模型及select、poll、epoll和kqueue的區(qū)別有哪些
文章地址:http://www.xueling.net.cn/article/gddicj.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 最新av免费观看 | 在线观看亚洲av每日更新 | 亚洲精品久久久久9999吃药 | 成年视频在线观看 | 久久99精品国产99久久6尤物 | 亚洲午夜精品久久久久久高潮 | 亚洲成人中文在线 | 99热这里只有精品5 曼谷av女郎 | 国产亚洲精品久久久久久豆腐 | 视频一区二区中文字幕 | 韩国三级hd中文字幕叫床 | 九九九九九少妇爽黄大片 | 日本岛国片在线观看一区二区 | 色婷婷综合和线在线 | 一区二区三区成人 | 加勒比aⅴ| 日本高清123 | 午夜精品久久久久久99热软件 | 国产精品日本一区二区在线播放 | 日本欧美大码A在线观看 | 81国产精品久久久久久久久久 | 无码字幕av一区二区三区 | 97色偷偷色噜噜狠狠爱网站97 | 国产精品久久久久久无码不卡 | 亚洲精品久久国产高清情趣图文 | 国产一区在线精品 | 国内盗摄视频一区二区三区 | 欧美日韩一区在线播放 | 久久免费看少妇高潮a片特黄网站 | 欧美性另类69xxxx最新章节 | 奇米超碰在线 | 性69无遮挡免费视频 | av黑人| 免费无码av片 | 日本三级黄色网址 | 91日韩精品久久久久身材苗条 | 在线影院一区 | 亚洲Av纯肉无码精品动漫 | 亚洲精品成人网站在线 | 伦一区二区三区中文字幕v亚洲 | 日本大片免a费观看视频 |