EPOLL 7 2021

中文man手册

EPOLL

åç§°
æ¦è¦
说æ
水平触åä¸è¾¹ç¼è§¦å
ç³»ç»èªå¨ç¡ç çå¤ç
/proc æ¥å£
示ä¾ï¼å»ºè®®çä½¿ç¨ epoll çæ¹å¼
epoll åé®
å¯è½çé·é±åé¿åçæ¹æ³
çæ¬
éç¨äº
注
å¦è¯·åé
è·

åç§°

epoll - I/O äºä»¶éç¥è®¾æ½

æ¦è¦

#include <sys/epoll.h>

说æ

epoll API çä»»å¡ä¸ poll(2) 类似ï¼çæ§å¤ä¸ªæä»¶æè¿°ç¬¦ï¼æ¾åºå¶ä¸- å¯ä»¥è¿è¡I/O çæä»¶æè¿°ç¬¦ã epoll API æ¢å¯ä»¥ä½ä¸ºè¾¹ç¼è§¦åï¼edge-triggeredï¼çæ¥å£ä½¿ç¨ï¼ä¹å¯ä»¥ä½ä¸ºæ°´å¹³è§¦åï¼level-triggeredï¼çæ¥å£ä½¿ç¨ï¼å¹¶è½å¾å¥½å°æ©å±ï¼çè§å¤§éæä»¶æè¿°ç¬¦ã

epoll API çæ ¸å¿æ¦å¿µæ¯ epoll å®ä¾ï¼epoll instanceï¼ï¼è¿æ¯åæ¸çä¸ä¸ªå鍿°æ®ç»æï¼ä»ç¨æ·ç©ºé´çè§åº¦çï¼å®å¯ä»¥è¢«çä½ä¸ä¸ªåå«ä¸¤ä¸ªå表ç容å¨ï¼

å´è¶£å表ï¼interest listï¼ææ¶ä¹ç§°ä¸º epoll éï¼epoll setï¼ï¼ï¼è¿ç¨æ³¨åäºâçæ§å´è¶£âçæä»¶æè¿°ç¬¦çéåã

就绪å表ï¼ready listï¼ï¼âåå¤å¥½âè¿è¡ I/O çæä»¶æè¿°ç¬¦çéåã就绪å表æ¯å´è¶£å表ä¸çæä»¶æè¿°ç¬¦çå- éï¼æèæ´åç¡®å°è¯´ï¼æ¯å¶å¼ç¨çéåï¼ãåæ ¸ä¼æ ¹æ®è¿äºæä»¶æè¿°ç¬¦ä¸ç I/O æ´»å¨å¨æå°å¡«å就绪å表ã

ä¸åç³»ç»è°ç¨å¯ç¨äºå建å管ç epoll å®ä¾ï¼

epoll_create(2) ä¼å建ä¸ä¸ªæ°ç epoll å®ä¾ï¼å¹¶è¿åä¸ä¸ªæå该å®ä¾çæä»¶æè¿°ç¬¦ãï¼ææ°ç epoll_create1(2) æ©å±äº epoll_create(2) çåè½ãï¼

epoll_ctl(2) è½å epoll å®ä¾çå´è¶£å表ä¸- æ·»å é¡¹ç®ï¼æ³¨å对ç¹å®æä»¶æè¿°ç¬¦çå´è¶£ã

epoll_wait(2) ä¼çå¾ I/O äºä»¶ï¼å¦æå½å没æäºä»¶å¯ç¨ï¼åé»å¡è°ç¨å®ç线ç¨ãï¼æ¤ç³»ç»è°ç¨å¯è¢«çä½ä» epoll å®ä¾ç就绪å表ä¸è·å项ç®ãï¼

水平触åä¸è¾¹ç¼è§¦å

epoll äºä»¶çå忥壿¢å¯ä»¥è¡¨ç°ä¸ºè¾¹ç¼è§¦åï¼ETï¼ï¼ä¹å¯ä»¥è¡¨ç°ä¸ºæ°´å¹³è§¦åï¼LTï¼ãè¿ä¸¤ç§æºå¶çåºå«æè¿°å¦ä¸ãå设åçä¸åæåµï¼

1.

è¯»åæ¹å¨ epoll å®ä¾ä¸æ³¨å代表管é读å端ï¼rfdï¼çæä»¶æè¿°ç¬¦ã

2.

å奿¹å¨ç®¡éçåå¥ç«¯åå¥ 2 kB çæ°æ®ã

3.

è¯»åæ¹è°ç¨ epoll_wait(2)ï¼ rfd ä½ä¸ºä¸ä¸ªå°±ç»ªçæä»¶æè¿°ç¬¦è¢«è¿åã

4.

è¯»åæ¹åªä» rfd ä¸è¯»å 1 kB çæ°æ®ã

5.

è¯»åæ¹åæ¬¡è°ç¨ epoll_wait(2)ã

å¦æè¯»åæ¹æ·»å  rfd å° epoll æ¥å£æ¶ä½¿ç¨äº EPOLLET ï¼è¾¹ç¼è§¦åï¼æ å¿ä½ï¼é£ä¹çºµä½¿æ¤å»æä»¶è¾å¥ç¼å²åºä¸ä»æå¯ç¨çæ°æ®ï¼å©ä½ç1 KB æ°æ®ï¼ï¼æ¥éª¤5ä¸çepoll_wait(2) è°ç¨ä»å¯è½ä¼æèµ·ï¼ä¸æ- ¤åæ¶ï¼å奿¹å¯è½å¨çå¾è¯»åæ¹å¯¹å®åéçæ°æ®çååºãé æè¿ç§äºç¸ç- å¾çæå½¢çåå æ¯è¾¹ç¼è§¦å模å¼åªæå¨è¢«çæ§çæä»¶æè¿°ç¬¦åçååæ¶æä¼ééäºä»¶ãå æ- ¤ï¼å¨æ¥éª¤5ä¸ï¼è¯»åæ¹æç»å¯è½ä¼ä¸ºä¸äºå·²ç»å- å¨äºèªå·±è¾å¥ç¼å²åºåçæ°æ®ä¸ç´çä¸å»ãå¨ä¸é¢çä¾åä¸ï¼ç±äºå奿¹å¨ç¬¬2æ¥ä¸- è¿è¡äºåæä½ï¼ rfd ä¸äº§çäºä¸ä¸ªäºä»¶ï¼è¿ä¸ªäºä»¶å¨ç¬¬3æ¥ä¸- è¢«è¯»åæ¹æ¶èäºãä½è¯»åæ¹å¨ç¬¬4æ¥ä¸- è¿è¡ç读æä½å´æ²¡ææ¶è宿´ä¸ªç¼å²åºçæ°æ®ï¼å æ¤å¨ç¬¬5æ¥ä¸å¯¹epoll_wait(2) çè°ç¨å¯è½ä¼æ éæå°é»å¡ã

ä½¿ç¨ EPOLLET æå¿ä½çåºç¨ç¨åºåºå½ä½¿ç¨éé»å¡çæä»¶æè¿°ç¬¦ï¼ä»¥é¿åï¼å äºä»¶è¢«æ¶èèï¼ä½¿æ- £å¨å¤çå¤ä¸ªæä»¶æè¿°ç¬¦çä»»å¡å é»å¡ç读æåèåºç°é¥¥é¥¿ãå° epollç¨ä½è¾¹ç¼è§¦åï¼EPOLLETï¼çæ¥å£ï¼å»ºè®®çä½¿ç¨æ¹æ³å¦ä¸ï¼

a)

使ç¨éé»å¡çæä»¶æè¿°ç¬¦ï¼

b)

åªå¨ read(2) æ write(2) è¿å EAGAIN ååç徿°çäºä»¶ã

ç¸è¾èè¨ï¼å½ä½ä¸ºæ°´å¹³è§¦åçæ¥å£ä½¿ç¨æ¶ï¼é»è®¤æåµï¼æ²¡ææå® EPOLLETï¼ï¼ epollåªæ¯ä¸ä¸ªæ´å¿«ç poll(2)ï¼å¯ä»¥ç¨å¨ä»»ä½è½ä½¿ç¨ poll(2) çå°æ¹ï¼å ä¸ºæ¤æ¶ä¸¤èçè¯ä¹ç¸åã

å³ä½¿æ¯è¾¹ç¼è§¦åç epollï¼å¨æ¶å°å¤ä¸ªæ°æ®åæ¶ä¹å¯è½äº§çå¤ä¸ªäºä»¶ï¼å æ- ¤è°ç¨èå¯ä»¥æå® EPOLLONESHOT æ å¿ä½ï¼åè¯ epoll å¨èªå·±ç¨ epoll_wait(2)æ¶å°äºä»¶åç¦ç¨ç¸å³çæä»¶æè¿°ç¬¦ã彿å®äº EPOLLONESHOT æ å¿ä½æ¶ï¼è°ç¨èå¯ä½¿ç¨epoll_ctl(2) ä¸ EPOLL_CTL_MOD æ å¿ä½éè£ï¼rearmï¼ä¸ä¸ªè¢«ç¦ç¨çæä»¶æè¿°ç¬¦ï¼è¿æ¯è°ç¨èè䏿¯ epoll ç责任ã

妿å¤ä¸ªçº¿ç¨ï¼æè¿ç¨ï¼å¦æåè¿ç¨éè¿ fork(2) ç»§æ¿äº epoll æä»¶æè¿°ç¬¦ï¼ç- å¾åä¸ä¸ª epoll æä»¶æè¿°ç¬¦ï¼ä¸åæ¶å¨ epoll_wait(2) ä¸- 被é»å¡ï¼é£ä¹å½å´è¶£åè¡¨ä¸æä¸ªæ è®°ä¸ºè¾¹ç¼è§¦å (EPOLLET) éç¥çæä»¶æè¿°ç¬¦åå¤å°±ç»ªï¼è¿äºçº¿ç¨ï¼æè¿ç¨ï¼ä¸- åªä¼æä¸ä¸ªçº¿ç¨ï¼æè¿ç¨ï¼ä» epoll_wait(2) ä¸- 被å¤éãè¿ä¸ºé¿åæäºåºæ¯ä¸çâæç¾¤âï¼thundering herdï¼å¤éæä¾äºæç¨çä¼åã

ç³»ç»èªå¨ç¡ç çå¤ç

å¦æç³»ç»éè¿ /sys/power/autosleep å¤äº autosleep 模å¼ï¼é£ä¹å½æä¸ªäºä»¶çåçå°è®¾å¤ä»ç¡ç ä¸- å¤éæ¶ï¼è®¾å¤é©±å¨ç¨åºä»ä¼ä¿æè®¾å¤å¤éç´å°è¯¥äºä»¶å¥é为æ- ¢ãè¥æ³ä¿æè®¾å¤å¤éç´å°äºä»¶è¢«å¤ç宿¯ï¼åéä½¿ç¨ epoll_ctl(2) ç EPOLLWAKEUPæ å¿ä½ã

å½å¨ struct epoll_event ç»æä½ç events 段ä¸è®¾ç½® EPOLLWAKEUPæ å¿ä½æ¶ï¼ä»äºä»¶å¥éçé£ä¸å»èµ·ï¼å° epoll_wait(2) è°ç¨è¿åäºä»¶ï¼åä¸ç´å°ä¸ä¸æ¬¡ epoll_wait(2) è°ç¨ä¹åï¼ç³»ç»ä¼ä¸ç´ä¿æå¤éãè¥è¦è®©äºä»¶ä¿æç³»ç»å¤éçæ¶é´è¶è¿è¿ä¸ªæ¶é´ï¼é£ä¹å¨ç¬¬äºæ¬¡ epoll_wait(2) è°ç¨ä¹åï¼åºå½è®¾ç½®ä¸ä¸ªåç¬çwake_lockã

/proc æ¥å£

以䏿¥å£å¯ä»¥ç¨æ¥éå¶ epoll æ¶èçåæ ¸ååçéã
/proc/sys/fs/epoll/max_user_watches
ï¼ä» Linux 2.6.28 å¼å§ï¼

æ¤æ¥å£æå®äºåä¸ªç¨æ·å¨ç³»ç»åææ epoll å®ä¾ä¸- å¯ä»¥æ³¨åçæä»¶æè¿°ç¬¦çæ»æ°éå¶ãè¿ä¸ªéå¶æ¯é对æ¯ä¸ªçå®ç¨æ·IDçãæ¯ä¸ªæ³¨åçæä»¶æè¿°ç¬¦å¨32ä½åæ¸ä¸å¤§çº¦éè¦90个å- èï¼å¨64ä½åæ ¸ä¸å¤§çº¦éè¦160个åèãç®åï¼ max_user_watches çé»è®¤å¼æ¯å¯ç¨ä½ååç1/25ï¼4%ï¼é¤ä»¥æ³¨åçç©ºé´ææ¬ï¼ä»¥åè计ï¼ã

示ä¾ï¼å»ºè®®çä½¿ç¨ epoll çæ¹å¼

epoll ä½ä¸ºæ°´å¹³è§¦åæ¥å£çç¨æ³ä¸ poll(2) å·æç¸åçè¯- ä¹ï¼ä½è¾¹ç¼è§¦åçç¨æ³éè¦æ´å¤ç说æï¼ä»¥é¿ååºç¨ç¨åºäºä»¶å¾ªç¯çåæ»ãå¨ä¸é¢çä¾å- ä¸ï¼è°ç¨äº listen(2)æ¥çå¬ listenerï¼ä¸ä¸ªéé»å¡ç奿¥åã彿° do_use_fd() ä½¿ç¨æ°å°±ç»ªçæä»¶æè¿°ç¬¦ï¼ç´å° read(2) æ write(2) è¿å EAGAINãä¸ä¸ªäºä»¶é©±å¨çç¶ææºåºç¨ç¨åºå¨æ¥æ¶å° EAGAIN åï¼åºè¯¥è®°å½å®çå½åç¶æï¼è¿æ ·å¨ä¸ä¸æ¬¡è°ç¨do_use_fd() æ¶ï¼å®å°±è½ä»ä¹ååä¸çå°æ¹ç»§ç» read(2) æ write(2)ã

#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;

/* Code to set up listening socket, 'listen_sock',
(socket(), bind(), listen()) omitted. */

epollfd = epoll_create1(0);
if (epollfd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}

ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}

for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}

for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &addr, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].data.fd);
}
}
}

å½ä½ä¸ºè¾¹ç¼è§¦åçæ¥å£ä½¿ç¨æ¶ï¼åºäºæ§è½èèï¼å¯å¨æ·»åæä»¶æè¿°ç¬¦ï¼EPOLL_CTL_ADDï¼æ¶æå® (EPOLLIN|EPOLLOUT)ãè¿æ ·å¯ä»¥é¿ååå¤è°ç¨ epoll_ctl(2) ä¸EPOLL_CTL_MOD å¨ EPOLLIN å EPOLLOUT ä¹é´æ¥å忢ã

epoll åé®

0.

ç¨ä»ä¹åºåå´è¶£åè¡¨ä¸æ³¨åçæä»¶æè¿°ç¬¦ï¼

æä»¶æè¿°ç¬¦çæ°å¼åæå¼æä»¶æè¿°ï¼open file descriptionï¼åç§°âopen file handleâï¼å核对æå¼çæä»¶çåé¨è¡¨ç¤ºï¼çç»åã

1.

妿å¨åä¸ä¸ª epoll å®ä¾ä¸å¤æ¬¡æ³¨åç¸åçæä»¶æè¿°ç¬¦ä¼ææ ·ï¼

ä½ å¯è½ä¼å¾å° EEXISTãç¶èï¼å¨åä¸ä¸ªepollå®ä¾ä¸æ·»å éå¤çï¼dup(2),dup2(2), fcntl(2) F_DUPFDï¼æä»¶æè¿°ç¬¦æ¯å¯è½çã妿éå¤çæä»¶æè¿°ç¬¦æ¯ç¨ä¸åçäºä»¶æ©çï¼events maskï¼æ³¨åçï¼é£ä¹è¿ä¼æä¸ºè¿æ»¤äºä»¶çä¸ä¸ªå®ç¨æå·§ã

2.

å¤ä¸ª epoll å®ä¾è½ç- å¾åä¸ä¸ªæä»¶æè¿°ç¬¦åï¼å¦æå¯ä»¥ï¼äºä»¶ä¼è¢«æ¥åç»ææçè¿äºepoll æä»¶æè¿°ç¬¦åï¼

è½ï¼èä¸äºä»¶ä¼è¢«æ¥åç»ææçå®ä¾ãä½ä½ å¯è½éè¦å°å¿ä»ç»å°ç¼ç¨æè½æ- £ç¡®å°å®ç°è¿ä¸ç¹ã

3.

epoll æä»¶æè¿°ç¬¦æ¬èº« poll/epoll/selectable åï¼

æ¯çï¼å¦æä¸ä¸ª epoll æä»¶æè¿°ç¬¦æäºä»¶å¨çå¾ï¼é£ä¹å®å°æ¾ç¤ºä¸ºå¯è¯»ã

4.

妿è¯å¾æ epoll æä»¶æè¿°ç¬¦æ¾å°å®èªå·±çæä»¶æè¿°ç¬¦éåä¸ä¼åçä»ä¹ï¼

epoll_ctl(2) è°ç¨ä¼å¤±è´¥ï¼EINVALï¼ãä½ä½ å¯ä»¥å°ä¸ä¸ª epoll æä»¶æè¿°ç¬¦æ·»å å°å¦ä¸ä¸ª epoll æä»¶æè¿°ç¬¦éåä¸ã

5.

æå¯ä»¥éè¿ UNIX å奿¥ååéä¸ä¸ª epoll æä»¶æè¿°ç¬¦å°å¦ä¸ä¸ªè¿ç¨åï¼

å¯ä»¥ï¼ä½è¿æ ·åæ¯æ²¡ææä¹çï¼å ä¸ºæ¥æ¶è¿ç¨ä¸ä¼å¾å°å´è¶£å表ä¸- æä»¶æè¿°ç¬¦ç坿¬ã

6.

å³éä¸ä¸ªæä»¶æè¿°ç¬¦ä¼å°å®ä»ææ epoll å´è¶£å表ä¸ç§»é¤åï¼

ä¼ï¼ä½è¦æ³¨æå ç¹ãæä»¶æè¿°ç¬¦æ¯å¯¹æå¼æä»¶æè¿°ï¼open file descriptionï¼çå¼ç¨ï¼è§ open(2)ï¼ãæ¯å½éè¿ dup(2), dup2(2), fcntl(2) F_DUPFDfork(2) å¤å¶æä¸ªæä»¶æè¿°ç¬¦æ¶ï¼é½ä¼å建ä¸ä¸ªæ°çæä»¶æè¿°ç¬¦ï¼å¼ç¨åä¸ä¸ªæå¼æä»¶æè¿°ãä¸ä¸ªæå¼æä»¶æè¿°ä¼å¨ææå¼ç¨å®çæä»¶æè¿°ç¬¦è¢«å³é- ä¹åä¸ç´åå¨ã

ä¸ä¸ªæä»¶æè¿°ç¬¦åªæå¨æææåå¶ä¾èµçæå¼æä»¶æè¿°çæä»¶æè¿°ç¬¦é½è¢«å³é- åæä¼ä»å´è¶£å表ä¸- ç§»é¤ãè¿æå³çï¼å³ä½¿å´è¶£å表åçæä¸ªæä»¶æè¿°ç¬¦è¢«å³é- äºï¼å¦æå¼ç¨å䏿件æè¿°çå¶ä»æä»¶æè¿°ç¬¦ä»ç¶å¼çï¼å该æä»¶æè¿°ç¬¦çäºä»¶ä»å¯è½ä¼éç¥ã为äºé²æ- ¢è¿ç§æåµåçï¼å¨å¤å¶æä»¶æè¿°ç¬¦åï¼å¿é¡»æ¾å¼å°å°å¶ä»å´è¶£å表ä¸- ç§»é¤ï¼ä½¿ç¨epoll_ctl(2) EPOLL_CTL_DELï¼ãæèåºç¨ç¨åºå¿é¡»è½ç¡®ä¿ææçæä»¶æè¿°ç¬¦é½è¢«å³é- ï¼å¦ææä»¶æè¿°ç¬¦æ¯è¢«ä½¿ç¨ dup(2) æ fork(2) çåºå½æ°éå¼å¤å¶ç,è¿ä¸ç¹å¯è½ä¼å¾é¾ä¿è¯ï¼ã

7.

妿å¨ä¸¤æ¬¡ epoll_wait(2) è°ç¨ä¹é´åçäºä¸æ- ¢ä¸ä¸ªäºä»¶ï¼å®ä»¬æ¯ä¼ä¸èµ·æ¥åè¿æ¯ä¼å弿¥åï¼

å®ä»¬ä¼ä¸èµ·æ¥åã

8.

对æä»¶æè¿°ç¬¦çæä½ä¼å½±åå·²ç»æ¶éå°ä½å°æªæ¥åçäºä»¶åï¼

ä½å¯ä»¥å¯¹æä¸ªç°æçæä»¶æè¿°ç¬¦ååé¤åä¿®æ¹ä¸¤ç§æä½ï¼åé¤ï¼å¯¹è¿ç§æåµæ²¡ææä¹ï¼ä¿®æ¹ï¼å°éæ°è¯»åå¯ç¨ç I/Oã

9.

å½ä½¿ç¨ EPOLLET æ å¿ä½ï¼è¾¹ç¼è§¦åè¡ä¸ºï¼æ¶ï¼æéè¦æç»- 读/åæä»¶æè¿°ç¬¦ï¼ç´å°EAGAIN åï¼

ä» epoll_wait(2) æ¶å°çäºä»¶ä¼æç¤ºä½ ï¼å¯¹åºçæä»¶æè¿°ç¬¦å·²ç»åå¤å¥½è¿è¡æè¦æ±çI/O æä½ãç´å°ä¸ä¸æ¬¡ï¼éé»å¡çï¼è¯»/å产ç EAGAIN ä¹åï¼æ- ¤æä»¶æè¿°ç¬¦é½åºè¢«è®¤ä¸ºæ¯å°±ç»ªçã使¶åå¦ä½ä½¿ç¨è¯¥æä»¶æè¿°ç¬¦å®å¨åå³äºä½ã

对äºé¢åæ°æ®å/令ççæä»¶ï¼å¦æ°æ®æ¥å¥æ¥åãå¸å模å¼ï¼canonical modeï¼ä¸çç»ç«¯ï¼,æç¥è¯»/å I/O 空é´å°½å¤´çå¯ä¸æ¹æ³æ¯æç»è¯»/åç´å° EAGAINã

对äºé¢åæµçæä»¶ï¼å¦ç®¡éãFIFOãæµå¥æ¥å- ï¼ï¼ä¹å¯éè¿æ£æ¥ä»ç®æ æä»¶æè¿°ç¬¦è¯»/åçæ°æ®éæ¥æ£æµè¯»/å I/O ç©ºé´æ¶è´¹å®çæåµãä¾å¦ï¼å¦æä½ å¨è°ç¨ read(2) æ¶æå®äºææè¯»åçåèæ°ï¼ä½ read(2) è¿åçå®é读ååèæ°è¾å°ï¼ä½ å°±å¯ä»¥ç¡®å®æä»¶æè¿°ç¬¦ç读 I/O 空é´å·²ç»æ¶è´¹å®äºãå¨ä½¿ç¨ write(2) å奿¶åçãï¼ä½å¦æä½ä¸è½ä¿è¯è¢«çè§çæä»¶æè¿°ç¬¦æ»æ¯æåä¸ä¸ªé¢åæµçæä»¶ï¼é£ä¹å°±åºå½é¿å使ç¨è¿ä¸æå·§ï¼

å¯è½çé·é±åé¿åçæ¹æ³

o è¾¹ç¼è§¦åä¸ç饥饿

妿æä¸ªå°±ç»ªçæä»¶å¯ç¨ç I/O 空é´å¾å¤§ï¼è¯å¾ç©·å°½å®å¯è½ä¼å¯¼è´å¶ä»æä»¶å¾ä¸å°å¤çï¼éæé¥¥é¥¿ã(ä½è¿ä¸ªé®é¢å¹¶ä¸æ¯ epoll ç¹æçï¼ã

è§£å³æ¹æ¡æ¯ç»´æ¤ä¸ä¸ªå°±ç»ªå表ï¼å¹¶å¨å¶å³èçæ°æ®ç»æä¸å°æ- ¤æä»¶æè¿°ç¬¦æè®°ä¸ºå°±ç»ªï¼ä»è使åºç¨ç¨åºå¨è®°ä½åªäºæä»¶éè¦è¢«å¤ççåæ¶ä»è½å¾ªç¯éåææå°±ç»ªçæä»¶ãè¿ä¹ä½¿ä½å¯ä»¥å¿½ç¥æ¶å°çå·²ç»å°±ç»ªçæä»¶æè¿°ç¬¦çåç»- äºä»¶ã
o å¦æä½¿ç¨äºäºä»¶ç¼å...

å¦æä½ ä½¿ç¨äºäºä»¶ç¼åææåäºææä» epoll_wait(2) è¿åçæä»¶æè¿°ç¬¦ï¼é£ä¹ä¸å®è¦ææç§æ¹æ³æ¥å¨æå°æ è®°è¿äºæä»¶æè¿°ç¬¦çå³é- ï¼ä¾å¦å ååçäºä»¶å¤çå¼èµ·çæä»¶æè¿°ç¬¦å³éï¼ãåè®¾ä½ ä» epoll_wait(2) æ¶å°äº100个äºä»¶ï¼å¨äºä»¶#47ä¸ï¼æä¸ªæ¡ä»¶å¯¼è´äºä»¶#13被å³é- ã妿你å é¤æ°æ®ç»æå¹¶å³é- ï¼close(2)ï¼äºä»¶#13çæä»¶æè¿°ç¬¦ï¼é£ä¹ä½ çäºä»¶ç¼å- å¯è½ä»ç¶ä¼è¯´äºä»¶#13çæä»¶æè¿°ç¬¦æäºä»¶å¨çå¾èé æè¿·æã

对åºçä¸ä¸ªè§£å³æ¹æ¡æ¯ï¼å¨å¤çäºä»¶47çè¿ç¨ä¸ï¼è°ç¨ epoll_ctl(EPOLL_CTL_DEL)æ¥å é¤å¹¶å³é- ï¼close(2)ï¼æä»¶æè¿°ç¬¦13ï¼ç¶åå°å¶ç¸å³çæ°æ®ç»ææè®°ä¸ºå·²åé¤ï¼å¹¶å°å¶é¾æ¥å°ä¸ä¸ªæ¸çå表ã妿ä½å¨æ¹å¤çä¸- åç°äºæä»¶æè¿°ç¬¦13çå¦ä¸ä¸ªäºä»¶ï¼ä½ä¼åç°æä»¶æè¿°ç¬¦13åå已被åé¤ï¼è¿æ·å°±ä¸ä¼æä»»ä½æ··æ·ã

çæ¬

epoll API å¨ Linux åæ ¸2.5.44ä¸å¼å¥ã2.3.2çæ¬ç glibc å å¥äºå¯¹å¶çæ¯æã

éç¨äº

epoll API æ¯ Linux ç¹æçãå¶ä»çä¸äºç³»ç»ä¹æä¾ç±»ä¼¼çæºå¶ï¼ä¾å¦ FreeBSDæ kqueueï¼ Solaris æ /dev/pollã

注

å¯ä»¥éè¿è¿ç¨å¯¹åºç /proc/[pid]/fdinfo ç®å½ä¸ç epoll æä»¶æè¿°ç¬¦æ¡ç®æ¥çepoll æä»¶æè¿°ç¬¦æçè§çæä»¶æè¿°ç¬¦çéåã详æè§ proc(5)ã

kcmp(2) ç KCMP_EPOLL_TFD æä½å¯ä»¥ç¨æ¥æ£æ¥ä¸ä¸ª epoll å®ä¾ä¸æ¯å¦å- å¨æä¸ªæä»¶æè¿°ç¬¦ã

å¦è¯·åé

epoll_create(2), epoll_create1(2), epoll_ctl(2), epoll_wait(2), poll(2), select(2)

è·

æ¬é¡µé¢ä¸æçç±ä¸æ man æå页计åæä¾ã
䏿 man æå页计åï¼https://github.com/man-pages-zh/manpages-zh