以ä¸ä¸ªçæ´»ä¸çä¾åæ¥è§£é.
åè®¾ä½ å¨å¤§å¦ä¸è¯»ä¹¦,è¦çå¾
ä¸ä¸ªæåæ¥è®¿,èè¿ä¸ªæååªç¥éä½ å¨Aå·æ¥¼,ä½æ¯ä¸ç¥éä½ å
·ä½ä½å¨åªé,äºæ¯ä½ 们约好äºå¨Aå·æ¥¼é¨å£è§é¢.
å¦æä½ ä½¿ç¨çé»å¡IO模åæ¥å¤çè¿ä¸ªé®é¢,é£ä¹ä½ å°±åªè½ä¸ç´å®åå¨Aå·æ¥¼é¨å£çå¾
æåçå°æ¥,å¨è¿æ®µæ¶é´éä½ ä¸è½åå«çäºæ
,ä¸é¾ç¥é,è¿ç§æ¹å¼çæçæ¯ä½ä¸ç.
è¿ä¸æ¥è§£éselectåepoll模åçå·®å¼.
selectç大å¦åçæ¯å¦ä¸çäºæ
:æ¯å¦åå¦ç²çæåæ¥äº,selectç大å¦æ¯è¾ç¬¨,她带çæåæ¨ä¸ªæ¿é´è¿è¡æ¥è¯¢è°æ¯åå¦ç²,ä½ ççæåæ¥äº,äºæ¯å¨å®é
ç代ç ä¸,selectç大å¦åçæ¯ä»¥ä¸çäºæ
:
int n = select(&readset,NULL,NULL,100); for (int i = 0; n > 0; ++i) { if (FD_ISSET(fdarray[i], &readset)) { do_something(fdarray[i]); --n; } }epollç大å¦å°±æ¯è¾å
è¿äº,她记ä¸äºåå¦ç²çä¿¡æ¯,æ¯å¦è¯´ä»çæ¿é´å·,é£ä¹çåå¦ç²çæåå°æ¥æ¶,åªéè¦åè¯è¯¥æååå¦ç²å¨åªä¸ªæ¿é´å³å¯,ä¸ç¨èªå·±äº²èªå¸¦ç人满大楼çæ¾äººäº.äºæ¯epollç大å¦åçäºæ
å¯ä»¥ç¨å¦ä¸ç代ç 表示:
n = epoll_wait(epfd,events,20,500); for(i=0;i<n;++i) { do_something(events[n]); } å¨epollä¸,å
³é®çæ°æ®ç»æepoll_eventå®ä¹å¦ä¸:
typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; å¯ä»¥çå°,epoll_dataæ¯ä¸ä¸ªunionç»æä½,å®å°±æ¯epollç大å¦ç¨äºä¿ååå¦ä¿¡æ¯çç»æä½,å®å¯ä»¥ä¿åå¾å¤ç±»åçä¿¡æ¯:fd,æé,çç.æäºè¿ä¸ªç»æä½,epoll大å¦å¯ä»¥ä¸ç¨å¹ç°ä¹åå°±å¯ä»¥å®ä½å°åå¦ç².
å«å°çäºè¿äºæççæé«,å¨ä¸ä¸ªå¤§è§æ¨¡å¹¶åçæå¡å¨ä¸,轮询IOæ¯æèæ¶é´çæä½ä¹ä¸.ååå°é£ä¸ªä¾åä¸,å¦ææ¯å°æ¥ä¸ä¸ªæå楼管大å¦é½è¦å
¨æ¥¼çæ¥è¯¢åå¦,é£ä¹å¤ççæçå¿
ç¶å°±ä½ä¸äº,è¿ä¸ä¹
楼åºå°±æä¸å°ç人äº.
对æ¯ææ©ç»åºçé»å¡IOçå¤ç模å, å¯ä»¥çå°éç¨äºå¤è·¯å¤ç¨IOä¹å, ç¨åºå¯ä»¥èªç±çè¿è¡èªå·±é¤äºIOæä½ä¹å¤çå·¥ä½, åªæå°IOç¶æåçååçæ¶åç±å¤è·¯å¤ç¨IOè¿è¡éç¥, ç¶ååéåç¸åºçæä½, èä¸ç¨ä¸ç´é»å¡çå¾
IOç¶æåçååäº.
ä»ä¸é¢çåæä¹å¯ä»¥çåº,epollæ¯selectçæé«å®é
ä¸æ¯ä¸ä¸ªç¨ç©ºé´æ¢æ¶é´ææ³çå
·ä½åºç¨.
äºãæ·±å
¥ç解epollçå®ç°åçï¼å¼åé«æ§è½ç½ç»ç¨åºæ¶ï¼windowså¼åè
们è¨å¿
称iocpï¼linuxå¼åè
们åè¨å¿
称epollã大家é½æç½epollæ¯ä¸ç§IOå¤è·¯å¤ç¨ææ¯ï¼å¯ä»¥é常é«æçå¤çæ°ä»¥ç¾ä¸è®¡çsocketå¥æï¼æ¯èµ·ä»¥åçselectåpollæçé«å¤§åäºãæ们ç¨èµ·epollæ¥é½æè§æºç½ï¼ç¡®å®å¿«ï¼é£ä¹ï¼å®å°åºä¸ºä»ä¹å¯ä»¥é«éå¤çè¿ä¹å¤å¹¶åè¿æ¥å¢ï¼ å
ç®åå顾ä¸å¦ä½ä½¿ç¨Cåºå°è£
ç3个epollç³»ç»è°ç¨å§ãint epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); 使ç¨èµ·æ¥å¾æ¸
æ°ï¼é¦å
è¦è°ç¨epoll_create建ç«ä¸ä¸ªepoll对象ãåæ°sizeæ¯å
æ ¸ä¿è¯è½å¤æ£ç¡®å¤ççæ大å¥ææ°ï¼å¤äºè¿ä¸ªæ大æ°æ¶å
æ ¸å¯ä¸ä¿è¯ææã
epoll_ctlå¯ä»¥æä½ä¸é¢å»ºç«çepollï¼ä¾å¦ï¼å°å建ç«çsocketå å
¥å°epollä¸è®©å
¶çæ§ï¼æè
æ epollæ£å¨çæ§çæ个socketå¥æ移åºepollï¼ä¸åçæ§å®ççã
epoll_waitå¨è°ç¨æ¶ï¼å¨ç»å®çtimeoutæ¶é´å
ï¼å½å¨çæ§çææå¥æä¸æäºä»¶åçæ¶ï¼å°±è¿åç¨æ·æçè¿ç¨ã
ä»ä¸é¢çè°ç¨æ¹å¼å°±å¯ä»¥çå°epollæ¯select/pollçä¼è¶ä¹å¤ï¼å 为åè
æ¯æ¬¡è°ç¨æ¶é½è¦ä¼ éä½ æè¦çæ§çææsocketç»select/pollç³»ç»è°ç¨ï¼è¿æå³çéè¦å°ç¨æ·æçsocketå表copyå°å
æ ¸æï¼å¦æ以ä¸è®¡çå¥æä¼å¯¼è´æ¯æ¬¡é½è¦copyå åå ç¾KBçå
åå°å
æ ¸æï¼é常ä½æãèæ们è°ç¨epoll_waitæ¶å°±ç¸å½äºä»¥å¾è°ç¨select/pollï¼ä½æ¯è¿æ¶å´ä¸ç¨ä¼ ésocketå¥æç»å
æ ¸ï¼å 为å
æ ¸å·²ç»å¨epoll_ctlä¸æ¿å°äºè¦çæ§çå¥æå表ã
æ以ï¼å®é
ä¸å¨ä½ è°ç¨epoll_createåï¼å
æ ¸å°±å·²ç»å¨å
æ ¸æå¼å§åå¤å¸®ä½ åå¨è¦çæ§çå¥æäºï¼æ¯æ¬¡è°ç¨epoll_ctlåªæ¯å¨å¾å
æ ¸çæ°æ®ç»æéå¡å
¥æ°çsocketå¥æã
å¨å
æ ¸éï¼ä¸åçæ件ãæ以ï¼epollåå
æ ¸æ³¨åäºä¸ä¸ªæ件系ç»ï¼ç¨äºåå¨ä¸è¿°ç被çæ§socketãå½ä½ è°ç¨epoll_createæ¶ï¼å°±ä¼å¨è¿ä¸ªèæçepollæ件系ç»éå建ä¸ä¸ªfileç»ç¹ãå½ç¶è¿ä¸ªfileä¸æ¯æ®éæ件ï¼å®åªæå¡äºepollãepollå¨è¢«å
æ ¸åå§åæ¶ï¼æä½ç³»ç»å¯å¨ï¼ï¼åæ¶ä¼å¼è¾åºepollèªå·±çå
æ ¸é«écacheåºï¼ç¨äºå®ç½®æ¯ä¸ä¸ªæ们æ³çæ§çsocketï¼è¿äºsocketä¼ä»¥çº¢é»æ çå½¢å¼ä¿åå¨å
æ ¸cacheéï¼ä»¥æ¯æå¿«éçæ¥æ¾ãæå
¥ãå é¤ãè¿ä¸ªå
æ ¸é«écacheåºï¼å°±æ¯å»ºç«è¿ç»çç©çå
å页ï¼ç¶åå¨ä¹ä¸å»ºç«slabå±ï¼ç®åç说ï¼å°±æ¯ç©çä¸åé
å¥½ä½ æ³è¦çsizeçå
å对象ï¼æ¯æ¬¡ä½¿ç¨æ¶é½æ¯ä½¿ç¨ç©ºé²çå·²åé
好ç对象ãstatic int __init eventpoll_init(void) { ... ... /* Allocates slab cache used to allocate "struct epitem" items */ epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem), 0, SLAB_HWCACHE_ALIGN|EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); /* Allocates slab cache used to allocate "struct eppoll_entry" */ pwq_cache = kmem_cache_create("eventpoll_pwq", sizeof(struct eppoll_entry), 0, EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); ... ... epollçé«æå°±å¨äºï¼å½æ们è°ç¨epoll_ctlå¾éå¡å
¥ç¾ä¸ä¸ªå¥ææ¶ï¼epoll_waitä»ç¶å¯ä»¥é£å¿«çè¿åï¼å¹¶ææçå°åçäºä»¶çå¥æç»æ们ç¨æ·ãè¿æ¯ç±äºæ们å¨è°ç¨epoll_createæ¶ï¼å
æ ¸é¤äºå¸®æ们å¨epollæ件系ç»é建äºä¸ªfileç»ç¹ï¼å¨å
æ ¸cacheé建äºä¸ªçº¢é»æ ç¨äºåå¨ä»¥åepoll_ctlä¼ æ¥çsocketå¤ï¼è¿ä¼å建ç«ä¸ä¸ªlisté¾è¡¨ï¼ç¨äºåå¨åå¤å°±ç»ªçäºä»¶ï¼å½epoll_waitè°ç¨æ¶ï¼ä»
ä»
è§å¯è¿ä¸ªlisté¾è¡¨éæ没ææ°æ®å³å¯ãææ°æ®å°±è¿åï¼æ²¡ææ°æ®å°±sleepï¼çå°timeoutæ¶é´å°åå³ä½¿é¾è¡¨æ²¡æ°æ®ä¹è¿åãæ以ï¼epoll_waité常é«æã
é£ä¹ï¼è¿ä¸ªåå¤å°±ç»ªlisté¾è¡¨æ¯æä¹ç»´æ¤çå¢ï¼å½æ们æ§è¡epoll_ctlæ¶ï¼é¤äºæsocketæ¾å°epollæ件系ç»éfile对象对åºç红é»æ ä¸ä¹å¤ï¼è¿ä¼ç»å
æ ¸ä¸æå¤çç¨åºæ³¨åä¸ä¸ªåè°å½æ°ï¼åè¯å
æ ¸ï¼å¦æè¿ä¸ªå¥æçä¸æå°äºï¼å°±æå®æ¾å°åå¤å°±ç»ªlisté¾è¡¨éãæ以ï¼å½ä¸ä¸ªsocketä¸ææ°æ®å°äºï¼å
æ ¸å¨æç½å¡ä¸çæ°æ®copyå°å
æ ¸ä¸åå°±æ¥æsocketæå
¥å°åå¤å°±ç»ªé¾è¡¨éäºã
å¦æ¤ï¼ä¸é¢çº¢é»æ ï¼ä¸å¼ åå¤å°±ç»ªå¥æé¾è¡¨ï¼å°éçå
æ ¸cacheï¼å°±å¸®æ们解å³äºå¤§å¹¶åä¸çsocketå¤çé®é¢ãæ§è¡epoll_createæ¶ï¼å建äºçº¢é»æ å就绪é¾è¡¨ï¼æ§è¡epoll_ctlæ¶ï¼å¦æå¢å socketå¥æï¼åæ£æ¥å¨çº¢é»æ ä¸æ¯å¦åå¨ï¼åå¨ç«å³è¿åï¼ä¸åå¨åæ·»å å°æ å¹²ä¸ï¼ç¶ååå
æ ¸æ³¨ååè°å½æ°ï¼ç¨äºå½ä¸æäºä»¶æ¥ä¸´æ¶ååå¤å°±ç»ªé¾è¡¨ä¸æå
¥æ°æ®ãæ§è¡epoll_waitæ¶ç«å»è¿ååå¤å°±ç»ªé¾è¡¨éçæ°æ®å³å¯ã
æåççepollç¬æç两ç§æ¨¡å¼LTåETãæ 论æ¯LTåET模å¼ï¼é½éç¨äºä»¥ä¸æ说çæµç¨ãåºå«æ¯ï¼LT模å¼ä¸ï¼åªè¦ä¸ä¸ªå¥æä¸çäºä»¶ä¸æ¬¡æ²¡æå¤çå®ï¼ä¼å¨ä»¥åè°ç¨epoll_waitæ¶æ¬¡æ¬¡è¿åè¿ä¸ªå¥æï¼èET模å¼ä»
å¨ç¬¬ä¸æ¬¡è¿åã
è¿ä»¶äºæä¹åå°çå¢ï¼å½ä¸ä¸ªsocketå¥æä¸æäºä»¶æ¶ï¼å
æ ¸ä¼æ该å¥ææå
¥ä¸é¢æ说çåå¤å°±ç»ªlisté¾è¡¨ï¼è¿æ¶æ们è°ç¨epoll_waitï¼ä¼æåå¤å°±ç»ªçsocketæ·è´å°ç¨æ·æå
åï¼ç¶åæ¸
空åå¤å°±ç»ªlisté¾è¡¨ï¼æåï¼epoll_waitå¹²äºä»¶äºï¼å°±æ¯æ£æ¥è¿äºsocketï¼å¦æä¸æ¯ET模å¼ï¼å°±æ¯LT模å¼çå¥æäºï¼ï¼å¹¶ä¸è¿äºsocketä¸ç¡®å®ææªå¤ççäºä»¶æ¶ï¼åæ该å¥ææ¾åå°ååæ¸
空çåå¤å°±ç»ªé¾è¡¨äºãæ以ï¼éETçå¥æï¼åªè¦å®ä¸é¢è¿æäºä»¶ï¼epoll_waitæ¯æ¬¡é½ä¼è¿åãèET模å¼çå¥æï¼é¤éææ°ä¸æå°ï¼å³ä½¿socketä¸çäºä»¶æ²¡æå¤çå®ï¼ä¹æ¯ä¸ä¼æ¬¡æ¬¡ä»epoll_waitè¿åçãä¸ãæ©å±é
读ï¼epollä¸ä¹åå
¶ä»ç¸å
³ææ¯çæ¯è¾ï¼ï¼ Linuxæä¾äºselectãpollãepollæ¥å£æ¥å®ç°IOå¤ç¨ï¼ä¸è
çååå¦ä¸æ示ï¼æ¬æä»åæ°ãå®ç°ãæ§è½çæ¹é¢å¯¹ä¸è
è¿è¡å¯¹æ¯ã int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int poll(struct pollfd *fds, nfds_t nfds, int timeout); int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); selectãpollãepoll_waitåæ°åå®ç°å¯¹æ¯ 1ï¼ selectç第ä¸ä¸ªåæ°nfds为fdsetéåä¸æ大æ述符å¼å 1ï¼fdsetæ¯ä¸ä¸ªä½æ°ç»ï¼å
¶å¤§å°éå¶ä¸º__FD_SETSIZEï¼1024ï¼ï¼ä½æ°ç»çæ¯ä¸ä½ä»£è¡¨å
¶å¯¹åºçæ述符æ¯å¦éè¦è¢«æ£æ¥ã selectç第äºä¸å个åæ°è¡¨ç¤ºéè¦å
³æ³¨è¯»ãåãé误äºä»¶çæ件æ述符ä½æ°ç»ï¼è¿äºåæ°æ¢æ¯è¾å
¥åæ°ä¹æ¯è¾åºåæ°ï¼å¯è½ä¼è¢«å
æ ¸ä¿®æ¹ç¨äºæ 示åªäºæ述符ä¸åçäºå
³æ³¨çäºä»¶ãæ以æ¯æ¬¡è°ç¨selectåé½éè¦éæ°åå§åfdsetã timeoutåæ°ä¸ºè¶
æ¶æ¶é´ï¼è¯¥ç»æä¼è¢«å
æ ¸ä¿®æ¹ï¼å
¶å¼ä¸ºè¶
æ¶å©ä½çæ¶é´ã select对åºäºå
æ ¸ä¸çsys_selectè°ç¨ï¼sys_selecté¦å
å°ç¬¬äºä¸å个åæ°æåçfd_setæ·è´å°å
æ ¸ï¼ç¶å对æ¯ä¸ªè¢«SETçæ述符è°ç¨è¿è¡pollï¼å¹¶è®°å½å¨ä¸´æ¶ç»æä¸ï¼fdsetï¼ï¼å¦ææäºä»¶åçï¼selectä¼å°ä¸´æ¶ç»æåå°ç¨æ·ç©ºé´å¹¶è¿åï¼å½è½®è¯¢ä¸éå没æä»»ä½äºä»¶åçæ¶ï¼å¦ææå®äºè¶
æ¶æ¶é´ï¼åselectä¼ç¡ç å°è¶
æ¶ï¼ç¡ç ç»æååè¿è¡ä¸æ¬¡è½®è¯¢ï¼å¹¶å°ä¸´æ¶ç»æåå°ç¨æ·ç©ºé´ï¼ç¶åè¿åã selectè¿ååï¼éè¦éä¸æ£æ¥å
³æ³¨çæ述符æ¯å¦è¢«SETï¼äºä»¶æ¯å¦åçï¼ã 2ï¼ pollä¸selectä¸åï¼éè¿ä¸ä¸ªpollfdæ°ç»åå
æ ¸ä¼ ééè¦å
³æ³¨çäºä»¶ï¼æ
没ææ述符个æ°çéå¶ï¼pollfdä¸çeventså段åreventsåå«ç¨äºæ 示å
³æ³¨çäºä»¶ååççäºä»¶ï¼æ
pollfdæ°ç»åªéè¦è¢«åå§åä¸æ¬¡ã pollçå®ç°æºå¶ä¸select类似ï¼å
¶å¯¹åºå
æ ¸ä¸çsys_pollï¼åªä¸è¿pollåå
æ ¸ä¼ épollfdæ°ç»ï¼ç¶å对pollfdä¸çæ¯ä¸ªæ述符è¿è¡pollï¼ç¸æ¯å¤çfdsetæ¥è¯´ï¼pollæçæ´é«ã pollè¿ååï¼éè¦å¯¹pollfdä¸çæ¯ä¸ªå
ç´ æ£æ¥å
¶reventså¼ï¼æ¥å¾æäºä»¶æ¯å¦åçã 3ï¼ epolléè¿epoll_createå建ä¸ä¸ªç¨äºepoll轮询çæ述符ï¼éè¿epoll_ctlæ·»å /ä¿®æ¹/å é¤äºä»¶ï¼éè¿epoll_waitæ£æ¥äºä»¶ï¼epoll_waitç第äºä¸ªåæ°ç¨äºåæ¾ç»æã epollä¸selectãpollä¸åï¼é¦å
ï¼å
¶ä¸ç¨æ¯æ¬¡è°ç¨é½åå
æ ¸æ·è´äºä»¶æè¿°ä¿¡æ¯ï¼å¨ç¬¬ä¸æ¬¡è°ç¨åï¼äºä»¶ä¿¡æ¯å°±ä¼ä¸å¯¹åºçepollæ述符å
³èèµ·æ¥ãå¦å¤epollä¸æ¯éè¿è½®è¯¢ï¼èæ¯éè¿å¨çå¾
çæ述符ä¸æ³¨ååè°å½æ°ï¼å½äºä»¶åçæ¶ï¼åè°å½æ°è´è´£æåççäºä»¶åå¨å¨å°±ç»ªäºä»¶é¾è¡¨ä¸ï¼æååå°ç¨æ·ç©ºé´ã
温馨提示:答案为网友推荐,仅供参考