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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

select poll epoll IO操作多路复用及猴子补丁

發(fā)布時(shí)間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 select poll epoll IO操作多路复用及猴子补丁 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:select(能監(jiān)控?cái)?shù)量有限,不能告訴用戶程序具體那個(gè)連接有數(shù)據(jù))

select目前幾乎所有的平臺(tái)都支持,其良好的跨平臺(tái)支持也是一個(gè)優(yōu)點(diǎn)
select的缺點(diǎn)在于單個(gè)進(jìn)程能夠監(jiān)控的文件描述的數(shù)量存在最大限制(在liunx上一般是1024)
select監(jiān)控socket連接是不能準(zhǔn)確告訴用戶是哪個(gè)

二:poll(和select一樣,僅僅去除了最大監(jiān)控?cái)?shù)量)

poll和select在本質(zhì)上沒有太大差別,但是poll沒有最大文件描述限制

三:epoll(不僅沒有最大監(jiān)控?cái)?shù)量限制,還能告訴用戶哪個(gè)連接有活躍)

epoll沒有最大文件描述數(shù)量限制,還可以直接告訴用戶程序是哪一個(gè)

四. epoll能實(shí)現(xiàn)高并發(fā)原理

  • epoll() 中內(nèi)核則維護(hù)一個(gè)鏈表,epoll_wait 直接檢查鏈表是不是空就知道是否有文件描述符準(zhǔn)備好了。
  • 在內(nèi)核實(shí)現(xiàn)中 epoll 是根據(jù)每個(gè) sockfd 上面的與設(shè)備驅(qū)動(dòng)程序建立起來的回調(diào)函數(shù)實(shí)現(xiàn)的。
  • 某個(gè) sockfd 上的事件發(fā)生時(shí),與它對(duì)應(yīng)的回調(diào)函數(shù)就會(huì)被調(diào)用,把這個(gè) sockfd 加入鏈表。
  • epoll上面鏈表中獲取文件描述,這里使用內(nèi)存映射(mmap)技術(shù), 避免了復(fù)制大量文件描述符帶來的開銷
    內(nèi)存映射(mmap):內(nèi)存映射文件,是由一個(gè)文件到一塊內(nèi)存的映射,將不必再對(duì)文件執(zhí)行I/O操作
  • 五.epoll和select,poll還有一個(gè)本質(zhì)的區(qū)別的就是:

    select 和 poll 只有在下次在循環(huán)回來,再去操作系統(tǒng)獲取文件描述符
    epoll 會(huì)直接告訴程序,我們這里已經(jīng)就緒了,你可以接受數(shù)據(jù)了,等下一次協(xié)程去調(diào)用 epoll_wait 的時(shí)候就可以直接拿到就緒的文件描述符

    IO操作

    服務(wù)器端編程經(jīng)常需要構(gòu)造高性能的IO模型,常見的IO模型有四種:

    • (1)同步阻塞IO(Blocking IO):即傳統(tǒng)的IO模型
    • (2)同步非阻塞IO(Non-blocking IO):默認(rèn)創(chuàng)建的socket都是阻塞的,非阻塞IO要求socket被設(shè)置為NONBLOCK。注意這里所說的NIO并非Java的NIO(New IO)庫
    • (3)IO多路復(fù)用(IO Multiplexing):即經(jīng)典的Reactor設(shè)計(jì)模式,有時(shí)也稱為異步阻塞IO,Java中的Selector和Linux中的epoll都是這種模型
    • (4)異步IO(Asynchronous IO):即經(jīng)典的Proactor設(shè)計(jì)模式,也稱為異步非阻塞IO

    同步和異步的概念描述的是用戶線程內(nèi)核的交互方式:

    同步是指用戶線程發(fā)起IO請(qǐng)求后需要等待或者輪詢內(nèi)核IO操作完成后才能繼續(xù)執(zhí)行

    異步是指用戶線程發(fā)起IO請(qǐng)求后仍繼續(xù)執(zhí)行,當(dāng)內(nèi)核IO操作完成后會(huì)通知用戶線程,或者調(diào)用用戶線程注冊(cè)的回調(diào)函數(shù)。

    阻塞和非阻塞的概念描述的是用戶線程調(diào)用內(nèi)核IO操作的方式:

    阻塞是指IO操作需要徹底完成后才返回到用戶空間

    非阻塞是指IO操作被調(diào)用后立即返回給用戶一個(gè)狀態(tài)值,無需等到IO操作徹底完成

    I/O的實(shí)質(zhì)是什么?

    I/O的實(shí)質(zhì)是將硬盤中的數(shù)據(jù),或收到的數(shù)據(jù)實(shí)現(xiàn)從內(nèi)核態(tài) copy到 用戶態(tài)的過程

    用戶態(tài) & 內(nèi)核態(tài)
    系統(tǒng)空間分為兩個(gè)部分,一部分是內(nèi)核態(tài),一部分是用戶態(tài)的部分
    內(nèi)核態(tài):內(nèi)核態(tài)的空間資源只有操作系統(tǒng)能夠訪問
    用戶態(tài):我們寫的普通程序使用的空間

    IO多路復(fù)用

    IO多路復(fù)用:

    • I/O是指網(wǎng)絡(luò)I/O
    • 多路指多個(gè)TCP連接(即socket或者channel)
    • 復(fù)用指復(fù)用一個(gè)或幾個(gè)線程
    • 意思說一個(gè)或一組線程處理多個(gè)TCP連接
    • 最大優(yōu)勢(shì)是減少系統(tǒng)開銷,不必創(chuàng)建過多的進(jìn)程/線程,也不必維護(hù)這些進(jìn)程/線程

    IO多路復(fù)用使用兩個(gè)系統(tǒng)調(diào)用(select/poll/epoll和recvfrom)

    • blocking IO只調(diào)用了recvfrom
    • select/poll/epoll 核心是可以同時(shí)處理多個(gè)connection(連接)
    • 多路復(fù)用模型中,每一個(gè)socket,設(shè)置為non-blocking,阻塞是被select這個(gè)函數(shù)block,而不是被socket阻塞的

    六.猴子補(bǔ)丁

    即在運(yùn)行時(shí)對(duì)方法 / 類 / 屬性 / 功能進(jìn)行修改,把新的代碼作為解決方案代替原有的程序,也就是為其打上補(bǔ)丁。

    在使用gevent模塊的使用會(huì)遇到猴子補(bǔ)丁import gevent.monkeygevent.monkey.patch_all()

    注解:使用猴子補(bǔ)丁的方式,gevent能夠修改標(biāo)準(zhǔn)庫里面大部分的阻塞式系統(tǒng)調(diào)用,包括socket、ssl、threading和 select等模塊,而變?yōu)閰f(xié)作式運(yùn)行。也就是通過猴子補(bǔ)丁的monkey.patch_xxx()來將python標(biāo)準(zhǔn)庫中模塊或函數(shù)改成gevent中的響應(yīng)的具有協(xié)程的協(xié)作式對(duì)象。這樣在不改變?cè)写a的情況下,將應(yīng)用的阻塞式方法,變成協(xié)程式的。

    總結(jié)

    以上是生活随笔為你收集整理的select poll epoll IO操作多路复用及猴子补丁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。