å人çepollãã
ä»äºæãããããããã«ããµã¤ãºã®ãã¡ã¤ã«ã¢ãããã¼ãã¨ããpreforkã§ããã¹ããããªããããã¤ãã³ãã¢ãã«ãããªãã¨å³ãããã¨ããããªè©±ããããã¨ããã£ã¦ãã確ãã«preforkã ã¨ãã®å ´åããããã»ã¹ãåã¾ã£ã¡ããã¾ããããã¨ãèªåãåãã£ããããªãã¨ãè¨ãã®ã ãã©ããè£å´ã®ãã¨ã¯ç¹ã«ã¯ã£ããã¨çè§£ãã¦ããããã§ãªããã¤ãã³ãã¢ãã«ã ã¨1ããã»ã¹ã§å¤§ä¸å¤«ã ã¨ãã䏿ã«ãããã¯ãã¡ããã¨æ»ããããã¨ããèãããã£ãã ãã®ç¥èã§ãããããã¨ãä½ã¨ãªãèªã£ã¦ãã¾ãèªåã«ä¸æã«èçãã¾ãã¨ããããã®ãããªãã¨ãç§ã®å¤é·ã«ã¯ãããã¾ãã
ãã®ãããªè¯å¿ã®åé¡ã¨ã¯ç¹ã«é¢ä¿ãªããããããæ¼æµãã¦ã»ã©ãããµã³ãã«ãè¦ã¤ããã®ã§ãµãããã¨ããèªåç¨ã®ã¡ã¢ã
http://www.oreilly.co.jp/community/blog/2010/03/pthread-epoll-inet-server-part1.html
http://www.oreilly.co.jp/community/blog/2010/03/pthread-epoll-inet-server-part2.html
å ¨ä½çã«
epfdãã¨ã«ãç£è¦ãããfdã®ãªã¹ãã¿ãããªãã®ãã²ãã¥ãï¼ããã¯ããããã«ã¼ãã«ç©ºéã«å®éã«ããï¼ãfdã®ãªã¹ãã«å¯¾ãã¦ãepoll_ctlã§ç£è¦ãããfdã追å /åé¤ãªã©ãããepoll_waitã«epoll_eventã®æ§é ä½ã®ãã¤ã³ã¿ã渡ããepoll_waitã¯ã¤ãã³ããèµ·ãã£ãfdã®æ°ãè¿ãã®ã§ãããã使ã£ã¦å ç¨epoll_waitã«æ¸¡ãããã¤ã³ã¿ï¼é åï¼ãã«ã¼ããã¦å¯¾å¿ããå¦çããããï¼ãã®ã対å¿ããå¦çããã¤ãã³ãã«å¯¾ããã³ã¼ã«ããã¯ã¨ã¿ãªããï¼
epoll_create -> epoll_ctl -> epoll_waitãã¡ã¤ã³ã®æµãã ããepoll_waitã«ããã¤ãã³ãã«ã¼ãã®å¦çéç¨ã§epoll_ctlã§ç£è¦ãªã¹ãã«æ°ããfdã追å ãããã¨ããæ¢åã®fdãåé¤ããã¨ããå½ç¶ããã
以ä¸ãçè§£ãã¦ããªãç¹
* epfdã¨é常ã®fdã®ç©ºéãå¥ãªã®ãã©ãã
epoll_create(int size)
epollç¨ã®fdãè¿ãã以ä¸ãããã使ã£ã¦epoll_waitããepoll_ctlãã³ã¼ã«ãããsizeã¯ç¾å¨ã¯ç¡è¦ããããããã
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
opã§fdã®è¿½å ããåé¤ãããæå®ãããfdã¯ä»®æ³çãªfdãªã¹ãã«è¿½å ãããfdãã®ãã®ããµã³ãã«ãè¦ãéãã§ã¯event.data.fdã«ãfdãçªã£è¾¼ãã®ãæ®éã£ã½ãã®ã§ããªãã ããããåé·ãªæ°ããããevent.eventsã§ç£è¦ãããã¤ãã³ãã®ç¨®é¡ãæå®ããã
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
ããã©ãããã®ã§çç¥ãã¨ããããå ¨ä½çã«ãã«æ¸ãã
以ä¸ãã¼ãããã¨èãããã¨
* AnyEventã®AE::cv->recvã£ã¦ãwhile(1) { nfd = epoll_wait(); } ãªã¤ãã³ãã«ã¼ãã«çªå ¥ããããã®ãã®ã ã¨ããã¨ç´å¾ã§ããï¼ãã¡ããå é¨çã«ã¯libevã§ã©ããããã¦ããã¯ãã ããããããã®ã¾ã¾æ£è§£ã¨ããã®ã¯ããããªãï¼
* nginxã£ã¦workerã®æ°ã®è¨å®ã¨ããããã©ãåèè¨äºã®äºçªç®ã«ãããããªfdãããã»ã¹éã§åãæ¸¡ãã¦ããepoll_waitãããããªã¢ãã«(5epoll-multi.c)ãªã®ããããã¨ãåã«1ããã»ã¹ã§ããã¢ãã«(4epoll.c)ãªã®ãããããã¯ãã«ãããã»ã¹ã ãã©5epoll-multi.cã¨ã¯ã¾ãéãã¢ãã«ãªã®ãã
* è¦æ¨¡ã¯éãã©eventã¢ãã«ã®ãµã¼ããwhile(1) { epoll_wait(); } ã®ãããªå½¢ã®ã¤ãã³ãã«ã¼ããä¸å¿ã«æ®ãã¦ä½ããããã®ã ã¨ããã°ããã®ã©ããã«ãã¼ã£ã¨ãããã¯ãããããªåä½ãå ¥ã£ã¦ãã¾ãã¨ãããããªããã®ã¯ç´å¾ã§ããï¼ã ã£ã¦ä¸èº«ã¯whileã«ã¼ãã ããâ¦)