国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

IO多路復(fù)用之Select、Poll、Epoll

存儲(chǔ) 存儲(chǔ)軟件
I/O多路復(fù)用(multiplexing)的本質(zhì)是通過一種機(jī)制(系統(tǒng)內(nèi)核緩沖I/O數(shù)據(jù)),讓單個(gè)進(jìn)程可以監(jiān)視多個(gè)文件描述符,一旦某個(gè)描述符就緒(一般是讀就緒或?qū)懢途w),能夠通知程序進(jìn)行相應(yīng)的讀寫操作。

 [[402481]]

本文轉(zhuǎn)載自微信公眾號「搬運(yùn)工來架構(gòu)」,作者cocodroid。轉(zhuǎn)載本文請聯(lián)系搬運(yùn)工來架構(gòu)公眾號。

I/O多路復(fù)用(multiplexing)的本質(zhì)是通過一種機(jī)制(系統(tǒng)內(nèi)核緩沖I/O數(shù)據(jù)),讓單個(gè)進(jìn)程可以監(jiān)視多個(gè)文件描述符,一旦某個(gè)描述符就緒(一般是讀就緒或?qū)懢途w),能夠通知程序進(jìn)行相應(yīng)的讀寫操作。

01select

  1. int select (int n, fd_set *readfds, fd_set *writefds,  
  2.                    fd_set *exceptfds, struct timeval *timeout); 
  3.  
  4. // fd_set 結(jié)構(gòu)體簡化為: 
  5. typedef struct{ 
  6.     long int fds_bits[32]; 
  7. }fd_set; 

select 函數(shù)監(jiān)視的文件描述符分3類,分別是writefds、readfds、和exceptfds。調(diào)用后select函數(shù)會(huì)阻塞,直到有描述符就緒(有數(shù)據(jù) 可讀、可寫、或者有except),或者超時(shí)(timeout指定等待時(shí)間,如果立即返回設(shè)為null即可),函數(shù)返回。當(dāng)select函數(shù)返回后,可以通過遍歷fdset,來找到就緒的描述符。

select本質(zhì)上是通過設(shè)置或者檢查存放fd標(biāo)志位的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行下一步處理。

缺點(diǎn):

1、 單個(gè)進(jìn)程可監(jiān)視的fd數(shù)量被限制,即能監(jiān)聽端口的大小有限。

一般來說這個(gè)數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大,具體數(shù)目可以cat /proc/sys/fs/file-max察看。32位機(jī)默認(rèn)是1024個(gè)。64位機(jī)默認(rèn)是2048.

2、 對socket進(jìn)行掃描時(shí)是線性掃描,即采用輪詢的方法,效率較低:

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

3、需要維護(hù)一個(gè)用來存放大量fd的數(shù)據(jù)結(jié)構(gòu),每次調(diào)用select時(shí)把fd集合從用戶態(tài)拷貝到內(nèi)核態(tài),這樣會(huì)使得用戶空間和內(nèi)核空間在傳遞該結(jié)構(gòu)時(shí)復(fù)制開銷大。

02poll

  1. int poll (struct pollfd *fds, unsigned int nfds, int timeout); 
  2.  
  3. struct pollfd { 
  4.     int fd; /* file descriptor */ 
  5.     short events; /* requested events to watch */ // 請求監(jiān)視的事件 
  6.     short revents; /* returned events witnessed */ // 返回發(fā)生的事件 
  7. }; 

和select沒有區(qū)別,它將用戶傳入的數(shù)組拷貝到內(nèi)核空間,然后查詢每個(gè)fd對應(yīng)的設(shè)備狀態(tài),如果設(shè)備就緒則在設(shè)備等待隊(duì)列中加入一項(xiàng)并繼續(xù)遍歷,如果遍歷完所有fd后沒有發(fā)現(xiàn)就緒設(shè)備,則掛起當(dāng)前進(jìn)程,直到設(shè)備就緒或者主動(dòng)超時(shí),被喚醒后它又要再次遍歷fd。這個(gè)過程經(jīng)歷了多次無謂的遍歷。

它沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲(chǔ)的。

缺點(diǎn):

1、大量的fd的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核地址空間之間,而不管這樣的復(fù)制是不是有意義。

2、poll還有一個(gè)特點(diǎn)是“水平觸發(fā)”,如果報(bào)告了fd后,沒有被處理,那么下次poll時(shí)會(huì)再次報(bào)告該fd。

LT模式:level trigger。當(dāng)epoll_wait檢測到描述符事件發(fā)生并將此事件通知應(yīng)用程序,

應(yīng)用程序可以不立即處理該事件。下次調(diào)用epoll_wait時(shí),會(huì)再次響應(yīng)應(yīng)用程序并通知此事件。

ET模式:edge trigger。當(dāng)epoll_wait檢測到描述符事件發(fā)生并將此事件通知應(yīng)用程序,

應(yīng)用程序必須立即處理該事件。如果不處理,下次調(diào)用epoll_wait時(shí),不會(huì)再次響應(yīng)應(yīng)用程序并通知此事件。

03epoll

  1. int epoll_create(int size); 
  2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 
  3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); 

epoll_create:創(chuàng)建一個(gè)epoll的句柄,size用來告訴內(nèi)核這個(gè)監(jiān)聽的數(shù)目一共有多大。參數(shù)size并不是限制了epoll所能監(jiān)聽的描述符最大個(gè)數(shù),只是對內(nèi)核初始分配內(nèi)部數(shù)據(jù)結(jié)構(gòu)的一個(gè)建議。

epoll_ctl:對指定描述符fd執(zhí)行op操作。

-epfd:是epoll_create()的返回值。

-op操作:對應(yīng)宏:添加EPOLL_CTL_ADD,刪除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD,對應(yīng)添加、刪除和修改對fd的監(jiān)聽事件。

- fd:是需要監(jiān)聽的fd(文件描述符)。

- epoll_event:是告訴內(nèi)核需要監(jiān)聽什么事件(讀、寫事件等)。

epoll_wait:等待epfd上的io事件,最多返回maxevents個(gè)事件。

-events:用來從內(nèi)核得到事件的集合,

-maxevents:告之內(nèi)核這個(gè)events有多大,這個(gè)maxevents的值不能大于創(chuàng)建epoll_create()時(shí)的size,

-timeout:是超時(shí)時(shí)間。

epoll有EPOLLLT和EPOLLET兩種觸發(fā)模式,LT是默認(rèn)的模式,ET是“高速”模式。LT模式下,只要這個(gè)fd還有數(shù)據(jù)可讀,每次 epoll_wait都會(huì)返回它的事件,提醒用戶程序去操作,而在ET(邊緣觸發(fā))模式中,它只會(huì)提示一次,直到下次再有數(shù)據(jù)流入之前都不會(huì)再提示了,無論fd中是否還有數(shù)據(jù)可讀。所以在ET模式下,read一個(gè)fd的時(shí)候一定要把它的buffer讀光,也就是說一直讀到read的返回值小于請求值,或者遇到EAGAIN錯(cuò)誤。還有一個(gè)特點(diǎn)是,epoll使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內(nèi)核就會(huì)采用類似callback的回調(diào)機(jī)制來激活該fd,epoll_wait便可以收到通知。

epoll為什么要有EPOLLET觸發(fā)模式?

如果采用EPOLLLT模式的話,系統(tǒng)中一旦有大量你不需要讀寫的就緒文件描述符,它們每次調(diào)用epoll_wait都會(huì)返回,這樣會(huì)大大降低處理程序檢索自己關(guān)心的就緒文件描述符的效率.。而采用EPOLLET這種邊沿觸發(fā)模式的話,當(dāng)被監(jiān)控的文件描述符上有可讀寫事件發(fā)生時(shí),epoll_wait()會(huì)通知處理程序去讀寫。如果這次沒有把數(shù)據(jù)全部讀寫完(如讀寫緩沖區(qū)太小),那么下次調(diào)用epoll_wait()時(shí),它不會(huì)通知你,也就是它只會(huì)通知你一次,直到該文件描述符上出現(xiàn)第二次可讀寫事件才會(huì)通知你!!!這種模式比水平觸發(fā)效率高,系統(tǒng)不會(huì)充斥大量你不關(guān)心的就緒文件描述符。

epoll優(yōu)點(diǎn):

1、沒有最大并發(fā)連接的限制,能打開的FD的上限遠(yuǎn)大于1024(1G的內(nèi)存上能監(jiān)聽約10萬個(gè)端口);

2、效率提升,不是輪詢的方式,不會(huì)隨著FD數(shù)目的增加效率下降。只有活躍可用的FD才會(huì)調(diào)用callback函數(shù);

即Epoll最大的優(yōu)點(diǎn)就在于它只管你“活躍”的連接,而跟連接總數(shù)無關(guān),因此在實(shí)際的網(wǎng)絡(luò)環(huán)境中,Epoll的效率就會(huì)遠(yuǎn)遠(yuǎn)高于select和poll。

3、 內(nèi)存拷貝,利用mmap()文件映射內(nèi)存加速與內(nèi)核空間的消息傳遞;即epoll使用mmap減少復(fù)制開銷。

04區(qū)別

0、底層數(shù)據(jù)結(jié)構(gòu)

select:數(shù)組,poll:鏈表,epoll:紅黑樹。

1、支持一個(gè)進(jìn)程所能打開的最大連接數(shù)

select 單個(gè)進(jìn)程所能打開的最大連接數(shù)有FD_SETSIZE宏定義,其大小是32個(gè)整數(shù)的大小(在32位的機(jī)器上,大小就是32*32,同理64位機(jī)器上FD_SETSIZE為32*64),當(dāng)然我們可以對進(jìn)行修改,然后重新編譯內(nèi)核,但是性能可能會(huì)受到影響,這需要進(jìn)一步的測試。

poll本質(zhì)上和select沒有區(qū)別,但是它沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲(chǔ)的。

epoll 雖然連接數(shù)有上限,但是很大,1G內(nèi)存的機(jī)器上可以打開10萬左右的連接,2G內(nèi)存的機(jī)器可以打開20萬左右的連接。

2、FD劇增后帶來的IO效率問題

select/poll 因?yàn)槊看握{(diào)用時(shí)都會(huì)對連接進(jìn)行線性遍歷,所以隨著FD的增加會(huì)造成遍歷速度慢的“線性下降性能問題”。

epoll 因?yàn)閑poll內(nèi)核中實(shí)現(xiàn)是根據(jù)每個(gè)fd上的callback函數(shù)來實(shí)現(xiàn)的,只有活躍的socket才會(huì)主動(dòng)調(diào)用callback,所以在活躍socket較少的情況下,使用epoll沒有前面兩者的線性下降的性能問題,但是所有socket都很活躍的情況下,可能會(huì)有性能問題。

3、消息傳遞方式

select/poll 內(nèi)核需要將消息傳遞到用戶空間,都需要內(nèi)核拷貝動(dòng)作。

epoll通過內(nèi)核和用戶空間共享一塊內(nèi)存來實(shí)現(xiàn)的。

select、poll與epoll之間的區(qū)別總結(jié)圖:

歷史背景:

1)select出現(xiàn)是1984年在BSD里面實(shí)現(xiàn)的。

2)14年之后也就是1997年才實(shí)現(xiàn)了poll,其實(shí)拖那么久也不是效率問題, 而是那個(gè)時(shí)代的硬件實(shí)在太弱,一臺服務(wù)器處理1千多個(gè)鏈接簡直就是神一樣的存在了,select很長段時(shí)間已經(jīng)滿足需求 。

3)2002, 大神 Davide Libenzi 實(shí)現(xiàn)了epoll。

參考資料:

https://www.cnblogs.com/Anker/p/3265058.html

https://www.cnblogs.com/aspirant/p/9166944.html

https://www.cnblogs.com/dhcn/p/12731883.html

 

責(zé)任編輯:武曉燕 來源: 搬運(yùn)工來架構(gòu)
相關(guān)推薦

2023-03-01 14:32:31

redisIOEpoll

2025-06-06 00:33:00

2023-01-09 10:04:47

IO多路復(fù)用模型

2020-10-14 09:11:44

IO 多路復(fù)用實(shí)現(xiàn)機(jī)

2025-01-07 00:07:17

2025-04-24 10:05:51

2023-12-06 07:16:31

Go語言語句

2024-08-08 14:57:32

2023-12-06 07:28:47

阻塞IO異步IO

2022-09-12 06:33:15

Select多路復(fù)用

2023-11-07 08:19:35

IO多路復(fù)用磁盤、

2022-08-26 00:21:44

IO模型線程

2023-12-13 09:45:49

模型程序

2024-12-30 00:00:05

2024-09-26 16:01:52

2020-10-13 07:51:03

五種IO模型

2011-12-08 10:51:25

JavaNIO

2009-06-29 18:09:12

多路復(fù)用Oracle

2022-02-22 08:55:29

SelectPoll/ Epoll

2021-05-11 08:22:32

Epoll 監(jiān)聽I
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

在线观看日产精品| 四虎5151久久欧美毛片| 日本亚洲三级在线| 茄子视频成人在线| 91欧美在线视频| 一区二区视频在线| 免费高清在线观看免费| 国产欧美日韩一级| 欧美一区在线直播| 成人在线视频你懂的| 欧美日韩一区精品| 久久久国产一区二区| 亚州成人av在线| 粉嫩喷白浆久久| 94色蜜桃网一区二区三区| 官网99热精品| 欧美日韩一区二区综合| heyzo在线播放| 久久精品亚洲麻豆av一区二区 | 99aiav| 在线观看视频污| 欧美一性一交| 国产麻豆午夜三级精品| 日韩无一区二区| 日本亚洲欧美成人| 欧美老女人性开放| 午夜精品电影| 亚洲伊人久久大香线蕉av| 欧州一区二区三区| 在线观看欧美日韩国产| 久草中文在线| 精品久久久网站| а√天堂资源地址在线下载| 色婷婷激情综合| 你懂的视频在线播放| 欧美日韩一区成人| 欧美精品日韩少妇| 精品久久久久久久久久久院品网| 在线播放麻豆| 亚洲跨种族黑人xxx| 五月天色综合| 日本一区二区在线播放| 欧美全黄视频| 亚欧精品在线| 国产欧美一区二区三区在线看蜜臀 | 一区二区三区 日韩| 日韩欧国产精品一区综合无码| 免费观看日韩电影| 中日韩午夜理伦电影免费 | 精品日韩欧美一区| 成人黄色在线观看| 一区二区黄色| av免费中文字幕| 欧美日韩美女一区二区| 台湾成人免费视频| 久久男女视频| 中文字幕第一页亚洲| 国产日韩欧美一区二区三区乱码 | 日本黄网站免费| 欧美三区在线观看| 亚洲综合色婷婷在线观看| 精品国产一区二区三区日日嗨| 99久久精品情趣| 1stkiss在线漫画| 91精品久久久久久久久久入口 | 欧美成人亚洲成人| 老司机精品福利视频| 亚州色图欧美色图| 欧美一区二区大胆人体摄影专业网站| 蜜臀av性久久久久蜜臀aⅴ | ****av在线网毛片| 国产精品第8页| 91免费精品国自产拍在线不卡| 超碰在线无需免费| 粉嫩av免费一区二区三区| 国产精品69久久久久水密桃| jizzjizz亚洲| 国产一区二区三区四区五区加勒比| 成人欧美一区二区三区黑人麻豆| www成人在线视频| 日韩中文字幕亚洲精品欧美| 日韩一区二区精品| 日韩精品电影一区亚洲| 2019中文字幕在线电影免费| 在线观看一区二区三区三州| 日韩一区二区三区在线观看| 欧美日本一区二区视频在线观看 | 国产精品日韩在线一区| 亚洲一区二区三区中文字幕在线 | 中文字幕一区二区日韩精品绯色| 日韩成人免费av| 亚洲国产成人va在线观看麻豆| 欧美激情va永久在线播放| 91免费看`日韩一区二区| 蜜桃精品wwwmitaows| 亚洲欧美在线免费| 国产成人免费视频网站| 精品国产乱码久久久久久樱花| 国产一二三区av| 国产日韩欧美综合精品| 欧美成人乱码一区二区三区| 国产不卡视频一区二区三区| 成人短视频软件网站大全app| 波多野结衣在线中文| 国产精品成人一区二区三区| 日韩精品中文字幕有码专区| 91丨porny丨蝌蚪视频| 欧美日本中文| 成人在线视频www| 一二三四社区在线视频| 日韩国产欧美一区| 97热精品视频官网| 日韩欧美国产成人一区二区| 久久日一线二线三线suv| 精品久久91| 中韩乱幕日产无线码一区| 96久久久久久| 日韩不卡视频一区二区| 国产精品露出视频| 久久久久久久av| 亚洲美女av电影| 欧美亚洲国产一区二区三区| 久久青草欧美一区二区三区| 久久国产欧美日韩精品| 天天射天天综合网| 日本免费精品| a一区二区三区| 青青草原av在线| 日本韩国精品一区二区| 日韩肉感妇bbwbbwbbw| 亚洲五码在线观看视频| 欧美日韩国产不卡在线看| 成人精品aaaa网站| 久久尤物视频| 欧美a级在线观看| 国产一级二级三级在线观看| 国内精品视频一区二区三区| 国产免费高清一区| 国产欧美婷婷中文| 亚久久调教视频| 99成人在线视频| 99久久.com| 久久人人99| 亚洲欧美色图| 国产精品网址| 欧洲杯足球赛直播| 91精品观看| 国产精品毛片在线看| 欧美精品一线| 小嫩嫩精品导航| 国产欧美一区二区色老头 | 91豆花精品一区| 久久久久久久国产精品| 久久久国产精品一区| 欧美超级免费视 在线| 97超级碰碰人国产在线观看| 欧洲成人免费视频| 成人性生交xxxxx网站| 91久久久久久| 亚洲欧洲一区二区| 国产欧美123| 国产熟人av一二三区| 3344永久| 菠萝菠萝蜜在线视频免费观看| segui88久久综合9999| 精品久久亚洲| 亚洲经典自拍| 久久久久久97三级| 色天天综合久久久久综合片| 日韩三级在线免费观看| 欧美国产日韩一区二区在线观看| 人妖精品videosex性欧美| 超碰在线97av| www.99av.com| 91高清在线| 欧美性生活一级| 自产国语精品视频| 精品一区二区免费在线观看| 免费观看日韩电影| 亚洲综合在线免费观看| 日韩电影中文字幕在线| 国产精品一区二区3区| 福利视频免费在线观看| 黄色影院在线播放| 国产乱人伦精品一区| 亚洲高清久久| 亚洲在线视频一区| 欧美黑人巨大精品一区二区| 台湾成人av| 日本中文字幕一区二区有码在线| 疯狂欧洲av久久成人av电影| 日韩影院精彩在线| 欧美日韩成人综合| 91亚洲精品在线观看| 日本加勒比高清在线| 国产视频网站一区二区三区| 国产精品一区不卡| 亚洲大胆美女视频| 一区二区三区国| av白虎一区|