Rechercher une page de manuel
epoll
Langue: ja
Version: 2002-10-23 (openSuse - 09/10/07)
Section: 7 (Divers)
Sommaire
̾Á°
epoll - I/O ¥¤¥Ù¥ó¥ÈÄÌÃε¡Ç½½ñ¼°
#include <sys/epoll.h>ÀâÌÀ
epoll ¤Ï poll(2) ¤Î°ì¼ï¤Ç¤¢¤ê¡¢¥¨¥Ã¥¸¥È¥ê¥¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È ¥ì¥Ù¥ë¥È¥ê¥¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤É¤Á¤é¤È¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¡¢ ´Æ»ë¤¹¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¿ô¤¬Â¿¤¤¾ì¹ç¤Ë¤â»ÈÍѤǤ¤ë¡£ epoll ½¸¹ç¤òÀßÄꤷ¤¿¤êÀ©¸æ¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢ ¼¡¤Î 3 ¤Ä¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë: epoll_create(2), epoll_ctl(2), epoll_wait(2).epoll ½¸¹ç¤Ï epoll_create(2) ¤ÇºîÀ®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ËÀܳ¤µ¤ì¤ë¡£ ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ËÂФ¹¤ë´Æ»ëÆâÍƤò epoll_ctl(2) ¤ÇÅÐÏ¿¤¹¤ë¡£ ºÇ¸å¤Ë epoll_wait(2) ¤Ç¼ÂºÝ¤Î¥¤¥Ù¥ó¥ÈÂÔ¤Á¤ò³«»Ï¤¹¤ë¡£
¥ì¥Ù¥ë¥È¥ê¥¬¤È¥¨¥Ã¥¸¥È¥ê¥¬
epoll ¥¤¥Ù¥ó¥ÈÇÛÁ÷ (distribution) ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢ ¥¨¥Ã¥¸¥È¥ê¥¬ (ET) ¤È¤·¤Æ¤â¥ì¥Ù¥ë¥È¥ê¥¬ (LT) ¤È¤·¤Æ¤âÆ°ºî¤µ¤»¤ë¤³¤È¤¬¤Ç¤¤ë¡£ ET ¥¤¥Ù¥ó¥ÈÇÛÁ÷µ¡¹½¤È LT ¥¤¥Ù¥ó¥ÈÇÛÁ÷µ¡¹½¤Î°ã¤¤¤Ï¡¢¼¡¤Î¤è¤¦¤ËÀâÌÀ¤Ç¤¤ë¡£ ¤³¤Î¤è¤¦¤Ê¥·¥Ê¥ê¥ª¤¬µ¯¤³¤Ã¤¿¤È¤·¤è¤¦:- 1
- ¥Ñ¥¤¥×¤ÎÆɤ߹þ¤ß¦¤òɽ¤¹¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿ (RFD) ¤¬ epoll ¥Ç¥Ð¥¤¥¹¤ÎÆâÉô¤ËÄɲ䵤ì¤ë¡£
- 2
- ¥Ñ¥¤¥×¤Ø½ñ¤¹þ¤à¥×¥í¥°¥é¥à¤¬ 2Kb ¤Î¥Ç¡¼¥¿¤ò¥Ñ¥¤¥×¤Î½ñ¤¹þ¤ß¦¤Ø½ñ¤¹þ¤à¡£
- 3
- epoll_wait(2) ¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Æɤ߹þ¤ß²Äǽ (ready) ¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤È¤·¤Æ RFD ¤¬Ê֤롣
- 4
- ¥Ñ¥¤¥×¤«¤éÆɤ߽Ф¹¥×¥í¥°¥é¥à¤¬¡¢1Kb ¤Î¥Ç¡¼¥¿¤ò RFD ¤«¤éÆɤ߽Ф¹¡£
- 5
- epoll_wait(2) ¤Î¸Æ¤Ó½Ð¤·¤¬¹Ô¤ï¤ì¤ë¡£
RFD ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬ EPOLLET ¥Õ¥é¥°¤ò»È¤Ã¤Æ epoll ¤ËÄɲ䵤ì¤Æ¤¤¤ë¤È¡¢ ÍøÍѲÄǽ¤Ê¥Ç¡¼¥¿¤¬¥Õ¥¡¥¤¥ëÆþÎϥХåե¡¤Ë¤Þ¤À¸ºß¤·¡¢ ¥ê¥â¡¼¥È¤ÎÀܳÀè (peer) ¤¬´û¤ËÁ÷¤é¤ì¤¿¥Ç¡¼¥¿¤Ë´ð¤Å¤¤¤Æ ±þÅú¤ò´üÂÔ¤·¤Æ¤¤¤ë¤¿¤á¤Ë¡¢¥¹¥Æ¥Ã¥× 5 ¤Î epoll_wait(2) ¤Î¸Æ¤Ó½Ð¤·¤Ç¥Ï¥ó¥°¤¹¤ë²ÄǽÀ¤¬¤¢¤ë¡£ ¤³¤ì¤Ï¡¢¥¨¥Ã¥¸¥È¥ê¥¬¥¤¥Ù¥ó¥ÈÇÛÁ÷¤Ç¤Ï¡¢¥â¥Ë¥¿¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤Ç ¥¤¥Ù¥ó¥È¤¬µ¯¤Ã¤¿¤È¤¤Ë¤Î¤ß¥¤¥Ù¥ó¥È¤¬ÇÛÁ÷¤µ¤ì¤ë¤¿¤á¤Ç¤¢¤ë¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥¹¥Æ¥Ã¥× 5 ¤Ç¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤Ï·ë²ÌŪ¤Ë ÆþÎϥХåե¡Æâ¤Ë¤¹¤Ç¸ºß¤¹¤ë¥Ç¡¼¥¿¤òÂԤĤ³¤È¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Ê¤¤¡£ ¾åµ¤ÎÎã¤Ç¤Ï¡¢ 2 ¤Ç¹Ô¤ï¤ì¤¿½ñ¤¹þ¤ß¤Ë¤è¤Ã¤Æ RFD ¤Ë´Ø¤¹¤ë¥¤¥Ù¥ó¥È¤¬À¸À®¤µ¤ì¡¢ 3 ¤Ç¥¤¥Ù¥ó¥È¤¬¾ÃÈñ (consume) ¤µ¤ì¤ë¡£ 4 ¤Ç¹Ô¤ï¤ì¤ëÆɤ߹þ¤ßÁàºî¤Ç¤Ï¡¢Á´Éô¤Î¥Ð¥Ã¥Õ¥¡¥Ç¡¼¥¿¤ò¾ÃÈñ¤·¤Ê¤¤¤Î¤Ç¡¢ ¥¹¥Æ¥Ã¥× 5 ¤Ç¹Ô¤ï¤ì¤ë epoll_wait(2) ¤Î¸Æ¤Ó½Ð¤·¤¬ ̵´ü¸Â¤Ë¥í¥Ã¥¯¤¹¤ë¤«¤â¤·¤ì¤Ê¤¤¡£ EPOLLET ¥Õ¥é¥° (¥¨¥Ã¥¸¥È¥ê¥¬) ¤È¶¦¤Ë»ÈÍѤ¹¤ë¾ì¹ç¡¢ epoll ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¥Ö¥í¥Ã¥¯¤·¤Ê¤¤¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò»È¤¦¤Ù¤¤Ç¤¢¤ë¡£ ¤³¤ì¤Ï¡¢¥Ö¥í¥Ã¥¯¤µ¤ì¤ëÆɤ߹þ¤ß¤ä½ñ¤¹þ¤ß¤Ë¤è¤Ã¤Æ¡¢ Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò°·¤¦¥¿¥¹¥¯¤ò µ²¤¨ (starve) ¤µ¤»¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ç¤¢¤ë¡£ epoll ¤ò¥¨¥Ã¥¸¥È¥ê¥¬ (EPOLLET) ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¤·¤Æ»È¤¦¤¿¤á¤ËÄó°Æ¤µ¤ì¤ëÊýË¡¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¢¤ê¡¢ ¤¢¤ê¤¬¤Á¤ÊÍî¤È¤··ê¤òÈò¤±¤ëÊýË¡¤â³¤±¤Æ½Ò¤Ù¤ë¡£
È¿ÂФ˥ì¥Ù¥ë¥È¥ê¥¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¤·¤Æ»È¤¦¾ì¹ç¤Ï¡¢ epoll ¤ÏÀµ¤Ë¤è¤ê¹â®¤Ê poll(2) ¤Ç¤¢¤ê¡¢»È¤¤Êý¤¬Æ±¤¸¤Ê¤Î¤Ç¡¢ poll(2) ¤¬»È¤ï¤ì¤Æ¤¤¤ë¤È¤³¤í¤Ç¤Ï¤É¤³¤Ç¤â»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£ ¥¨¥Ã¥¸¥È¥ê¥¬¤ò»È¤Ã¤¿¾ì¹ç¤Ç¤â¡¢Ê£¿ô¤Î¥Ç¡¼¥¿¤ò¼õ¿®¤¹¤ë¤ÈÊ£¿ô¤Î epoll ¥¤¥Ù¥ó¥È¤¬À¸À®¤µ¤ì¤ë¤Î¤Ç¡¢ ¸Æ¤Ó½Ð¤·Â¦¤Ë¤Ï EPOLLONESHOT ¥Õ¥é¥°¤ò»ØÄꤹ¤ë¥ª¥×¥·¥ç¥ó¤¬¤¢¤ë¡£ ¤³¤Î¥Õ¥é¥°¤Ï epoll ¤ËÂФ·¤Æ¡¢ epoll_wait(2) ¤Ë¤è¤ë¥¤¥Ù¥ó¥È¤ò¼õ¿®¤·¤¿¸å¤Ç¡¢´ØÏ¢¤¹¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò̵¸ú¤Ë¤µ¤»¤ë¡£ EPOLLONESHOT ¥Õ¥é¥°¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢ epoll_ctl(2) ¤Ë EPOLL_CTL_MOD ¤ò»ØÄꤷ¤Æ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òºÆÅÙ»ÈÍѤǤ¤ë¤è¤¦¤Ë¤¹¤ë¤Î¤Ï¡¢ ¸Æ¤Ó½Ð¤·Â¦¤ÎÀÕǤ¤Ç¤¢¤ë¡£
¤ª¤¹¤¹¤á¤Ê»ÈÍÑÎã
¥ì¥Ù¥ë¥È¥ê¥¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¤·¤Æ»ÈÍѤ¹¤ë¤È¤¤Î epoll ¤Î»È¤¤Êý¤Ï poll(2) ¤ÈƱ¤¸¤Ç¤¢¤ë¡£ ¤·¤«¤·¥¨¥Ã¥¸¥È¥ê¥¬¤È¤·¤Æ»È¤¦¾ì¹ç¤Ï¡¢ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¤¥Ù¥ó¥È¥ë¡¼¥×¤Ç¥¹¥È¡¼¥ë (stall) ¤·¤Ê¤¤¤è¤¦¤Ë¡¢ »È¤¤Êý¤ò¤è¤êÌÀ³Î¤Ë¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¡£ ¤³¤ÎÎã¤Ç¤Ï¡¢¥ê¥¹¥Ê¤Ï¥Ö¥í¥Ã¥¯¤·¤Ê¤¤¥½¥±¥Ã¥È¤Ç¤¢¤ê¡¢ listen(2) ¤¬¸Æ¤Ð¤ì¤Æ¤¤¤ë¡£ ´Ø¿ô do_use_fd() ¤Ï¡¢ read(2) ¤Þ¤¿¤Ï write(2) ¤Ë¤è¤Ã¤Æ EAGAIN ¤¬ÊÖ¤µ¤ì¤ë¤Þ¤Ç¤Ï¡¢ ¿·¤·¤¤½àÈ÷ºÑ¤ß¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò»È¤¦¡£ ¥¤¥Ù¥ó¥È¶îÆ°¥¹¥Æ¡¼¥È¥Þ¥·¥ó¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢ EAGAIN ¤ò¼õ¿®¤·¤¿¸å¡¢¥«¥ì¥ó¥È¤Î¾õÂÖ¤òµÏ¿¤·¤Æ¤ª¤¯¤Ù¤¤Ç¤¢¤ë¡£ ¤³¤ì¤Ë¤è¤ê¡¢¼¡¤Î do_use_fd() ¸Æ¤Ó½Ð¤·¤Î¤È¤¤Ë¡¢°ÊÁ°¤ËÄä»ß¤·¤¿¤È¤³¤í¤«¤é read(2) ¤Þ¤¿¤Ï write(2) ¤ò·Ñ³¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£struct epoll_event ev, *events; for(;;) { nfds = epoll_wait(kdpfd, events, maxevents, -1); for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listener) { client = accept(listener, (struct sockaddr *) &local, &addrlen); if(client < 0){ perror("accept"); continue; } setnonblocking(client); ev.events = EPOLLIN | EPOLLET; ev.data.fd = client; if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) { fprintf(stderr, "epoll set insertion error: fd=%d\n", client); return -1; } } else { do_use_fd(events[n].data.fd); } } }
¥¨¥Ã¥¸¥È¥ê¥¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¤·¤Æ»È¤¦¾ì¹ç¡¢Àǽ¾å¤ÎÍýͳ¤Ë¤è¤ê¡¢ °ìÅÙ (EPOLLIN|EPOLLOUT) ¤ò»ØÄꤷ¤Æ¤«¤é (EPOLL_CTL_ADD) ¤Ç¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò epoll ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ËÄɲ乤뤳¤È¤¬¤Ç¤¤ë¡£ ¤³¤ì¤Ë¤è¤ê¡¢ epoll_ctl(2) ¤Ë EPOLL_CTL_MOD ¤ò»ØÄꤷ¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤Ç EPOLLIN ¤È EPOLLOUT ¤ÎϢ³Ū¤ÊÀÚ¤êÂؤ¨¤¬Èò¤±¤é¤ì¤ë¡£
¼ÁÌä¤È²òÅú
- Q1
- Ʊ¤¸¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò 1 ¤Ä¤Î epoll_set ¤Ë 2 ²óÄɲ乤ë¤È¤É¤¦¤Ê¤ë¤«¡©
- A1
- ¤¿¤Ö¤ó EEXIST ¤ò¼õ¤±¼è¤ë¤À¤í¤¦¡£ ¤·¤«¤· 2 ¤Ä¤Î¥¹¥ì¥Ã¥É¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò 2 ²óÄɲ乤뤳¤È¤Ï²Äǽ¤Ç¤¢¤ë¡£ ¤³¤ì¤Ï̵³²¤Ê¾õÂ֤Ǥ¢¤ë¡£
- Q2
- 2 ¤Ä¤Î epoll ¥»¥Ã¥È¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òÂÔ¤Á¼õ¤±¤ë¤³¤È¤Ï²Äǽ¤«¡© ¤â¤·²Äǽ¤Ç¤¢¤ì¤Ð¡¢¥¤¥Ù¥ó¥È¤ÏξÊý¤Î epoll ¥»¥Ã¥È¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ËÊó¹ð¤µ¤ì¤ë¤«¡©
- A2
- ²Äǽ¤Ç¤¢¤ë¤¬¡¢¿ä¾©¤µ¤ì¤Ê¤¤¡£ ¤Þ¤¿¥¤¥Ù¥ó¥È¤ÏξÊý¤ËÊó¹ð¤µ¤ì¤ë¡£
- Q3
- epoll ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¼«¿È¤Ï poll/epoll/select ¤¬²Äǽ¤«¡©
- A3
- ²Äǽ¤Ç¤¢¤ë¡£
- Q4
- epoll ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¼«¿È¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¥»¥Ã¥È¤ËÆþ¤ì¤ë¤È ¤É¤¦¤Ê¤ë¤«¡©
- A4
- ¼ºÇÔ¤¹¤ë¤À¤í¤¦¡£ ¤¿¤À¤· epoll ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¾¤Î epoll ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¥»¥Ã¥È¤ÎÆâÉô¤ËÄɲ乤뤳¤È¤Ï²Äǽ¤Ç¤¢¤ë¡£
- Q5
- epoll ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò unix ¥½¥±¥Ã¥È¤Ç¾¤Î¥×¥í¥»¥¹¤ËÁ÷¤ë¤³¤È¤Ï²Äǽ¤«¡©
- A5
- ÉÔ²Äǽ¤Ç¤¢¤ë¡£
- Q6
- ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¥¯¥í¡¼¥º¤¹¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÏÁ´¤Æ¤Î epoll ¥»¥Ã¥È¤«¤é¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤ë¤«¡©
- A6
- ºï½ü¤µ¤ì¤ë¡£
- Q7
- 2 ¤Ä°Ê¾å¤Î¥¤¥Ù¥ó¥È¤¬ epoll_wait(2) ¥³¡¼¥ë¤Î´Ö¤ËÍ褿¾ì¹ç¡¢¤½¤ì¤é¤Ï¤Þ¤È¤á¤ÆÊó¹ð¤µ¤ì¤ë¤«¡¢ ¤½¤ì¤È¤âÊÌ¡¹¤ËÊó¹ð¤µ¤ì¤ë¤«¡©
- A7
- ¤Þ¤È¤á¤ÆÊó¹ð¤µ¤ì¤ë¤À¤í¤¦¡£
- Q8
- ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ËÂФ¹¤ëÁàºî¤Ï¡¢ ´û¤Ë½¸¤á¤é¤ì¤Æ¤¤¤ë¤¬¤Þ¤ÀÊó¹ð¤µ¤ì¤Æ¤¤¤Ê¤¤¥¤¥Ù¥ó¥È¤Ë±Æ¶Á¤¹¤ë¤«¡©
- A8
- ´û¸¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ËÂФ·¤Æ 2 ¤Ä¤ÎÁàºî¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤¤ë¡£ ¤³¤Î¾ì¹ç¡¢ºï½ü¤Ë¤Ï°ÕÌ£¤¬¤Ê¤¤¡£ Êѹ¹¤¹¤ë¤È¡¢»ÈÍѲÄǽ¤Ê I/O ¤¬ºÆ¤ÓÆɤ߹þ¤Þ¤ì¤ë¡£
- Q9
- EPOLLET ¥Õ¥é¥° (¥¨¥Ã¥¸¥È¥ê¥¬Æ°ºî) ¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢EAGAIN ¤ò¼õ¤±¼è¤ë¤Þ¤Ç¡¢ ·Ñ³¤·¤Æ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òÆɤ߽ñ¤¤¹¤ëɬÍפ¬¤¢¤ë¤«¡£
- A9
- ¤½¤ÎɬÍפϤʤ¤¡£ epoll_wait(2) ¤«¤é¥¤¥Ù¥ó¥È¤ò¼õ¤±¼è¤ë¤³¤È¤Ï¡¢ ¡Ö¤½¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬Í׵ᤵ¤ì¤¿ I/O Áàºî¤ËÂФ·¤Æ½àÈ÷ºÑ¤ß¤Ç¤¢¤ë¡× ¤È¤¤¤¦¤³¤È¤ò¥æ¡¼¥¶¤Ë¼¨¤¹¤â¤Î¤Ç¤¢¤ë¡£ ¡Ö¼¡¤Î EAGAIN ¤ò¼õ¤±¼è¤ë¤Þ¤Ç¤Ï¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ï½àÈ÷ºÑ¤ß¤Ç¤¢¤ë¡× ¤Èñ½ã¤Ë¹Í¤¨¤ë¤Ù¤¤Ç¤¢¤ë¡£ ¤½¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¤¤¤Ä¤É¤Î¤è¤¦¤Ë»È¤¦¤«¤Ï¡¢ Á´¤¯¥æ¡¼¥¶¤ËǤ¤µ¤ì¤Æ¤ë¡£ ¤Þ¤¿Æɤ߹þ¤ßÍÑ / ½ñ¤¹þ¤ßÍÑ I/O ¶õ´Ö¤¬»È¤¤¿Ô¤¯¤µ¤ì¤¿¾õÂ֤ϡ¢ ÂоݤȤʤë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤«¤éÆɤ߹þ¤ó¤À¥Ç¡¼¥¿Î̤ޤ¿¤Ï ½ñ¤¹þ¤ó¤À¥Ç¡¼¥¿Î̤ò¥Á¥§¥Ã¥¯¤¹¤ë¤³¤È¤Ç¸¡ÃΤǤ¤ë¡£ Î㤨¤Ð¡¢¤¢¤ëÆÃÄê¤ÎÎ̤Υǡ¼¥¿¤òÆɤ߹þ¤à¤¿¤á¤Ë read(2) ¤ò¸Æ¤ó¤À¤È¤¤Ë¡¢ read(2) ¤¬ÊÖ¤·¤¿¥Ð¥¤¥È¿ô¤¬¤½¤ì¤è¤ê¾¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢ ¤½¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÎÆɤ߹þ¤ßÍÑ I/O ¶õ´Ö¤¬ »È¤¤¿Ô¤¯¤µ¤ì¤¿¤³¤È¤¬Ê¬¤«¤ë¡£ write(2) ´Ø¿ô¤ò»È¤Ã¤Æ½ñ¤¹þ¤ß¤ò¤¹¤ë¤È¤¤â¡¢Æ±¤¸¤³¤È¤¬¸À¤¨¤ë¡£
¤¢¤ê¤¬¤Á¤ÊÍî¤È¤··ê¤È²óÈòÊýË¡
- o µ²²î (starvation) (¥¨¥Ã¥¸¥È¥ê¥¬)
Âç¤¤Ê I/O ¶õ´Ö¤¬¤¢¤ë¾ì¹ç¡¢ ¤½¤Î I/O ¶õ´Ö¤Î¥Ç¡¼¥¿¤òÁ´¤Æ½èÍý (drain) ¤·¤è¤¦¤È¤¹¤ë¤È¡¢ ¾¤Î¥Õ¥¡¥¤¥ë¤¬½èÍý¤µ¤ì¤º¡¢µ²¤¨¤òȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤¢¤ë¡£ ¤³¤ì¤Ï epoll ¤Ë¸ÇͤΤâ¤Î¤Ç¤Ï¤Ê¤¤¡£
¤³¤ÎÌäÂê¤Î²ò·èË¡¤Ï¡¢½àÈ÷ºÑ¤ß¾õÂ֤Υꥹ¥È¤ò´ÉÍý¤·¤Æ¡¢ ´ØÏ¢¤¹¤ë data ¹½Â¤ÂΤÎÃæ¤Ç¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬ ÍøÍѲÄǽ¤Ç¤¢¤ë¤È¥Þ¡¼¥¯¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£ ¤½¤ì¤Ë¤è¤Ã¤Æ¡¢ÍøÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç ¤É¤Î¥Õ¥¡¥¤¥ë¤ò½èÍý¤¹¤ëɬÍפ¬¤¢¤ë¤«¤ò²±¤¨¤ë¤³¤È¤¬¤Ç¤¡¢ ¤·¤«¤â½çÈ֤˽èÍý (round robin) ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£ ´û¤ËÍøÍѲÄǽ¤Ç¤¢¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ËÂФ·¤Æ ¤½¤ì°Ê¸å¤Ë¼õ¤±¼è¤ë¥¤¥Ù¥ó¥È¤ò̵»ë¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡£
- o ¥¤¥Ù¥ó¥È¥¥ã¥Ã¥·¥å¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç
¥¤¥Ù¥ó¥È¥¥ã¥Ã¥·¥å¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢ ¤Þ¤¿¤Ï epoll_wait(2) ¤«¤éÊÖ¤µ¤ì¤¿Á´¤Æ¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò³ÊǼ¤·¤Æ¤¤¤ë¾ì¹ç¡¢ ¥¯¥í¡¼¥º¤µ¤ì¤¿¤³¤È¤òưŪ¤Ë¥Þ¡¼¥¯¤¹¤ë (¤Ä¤Þ¤êÁ°¤Î¥¤¥Ù¥ó¥È¤Î½èÍý¤Ë¤è¤Ã¤Æ¥Þ¡¼¥¯¤µ¤ì¤ë) ÊýË¡¤òÄ󶡤¹¤Ù¤¤Ç¤¢¤ë¡£ epoll_wait(2) ¤«¤é 100 ¸Ä¤Î¥¤¥Ù¥ó¥È¤ò¼õ¤±¼è¤ê¡¢ ¥¤¥Ù¥ó¥È #47 ¤Ç¤Ï¤¢¤ë¾ò·ï¤Ç¥¤¥Ù¥ó¥È #13 ¤¬ÊĤ¸¤é¤ì¤ë¤È²¾Äꤹ¤ë¡£ ¥¤¥Ù¥ó¥È #13 ¤Î¹½Â¤ÂΤòºï½ü¤·¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò close(2) ¤¹¤ë¤È¡¢¥¤¥Ù¥ó¥È¥¥ã¥Ã¥·¥å¤Ï¤½¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òÂԤĥ¤¥Ù¥ó¥È¤¬ ¸ºß¤¹¤ë¤È¤¤¤Ã¤Æ¡¢º®Í𤬵¯¤¤ë¡£
¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë 1 ¤Ä¤ÎÊýË¡¤Ï¡¢¥¤¥Ù¥ó¥È 47 ¤Î½èÍý¤ò¤·¤Æ¤¤¤ë´Ö¤Ë¡¢ ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿ 13 ¤òºï½ü¤·¤Æ close(2) ¤¹¤ë¤¿¤á¤Ë epoll_ctl(EPOLL_CTL_DEL) ¤ò¸Æ¤Ó½Ð¤·¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿ data ¹½Â¤ÂΤòºï½üºÑ¤ß¤È¥Þ¡¼¥¯¤·¤Æ¡¢ ¥¯¥ê¡¼¥ó¥¢¥Ã¥×¥ê¥¹¥È¤Ë¥ê¥ó¥¯¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£ ¥Ð¥Ã¥Á½èÍý¤ÎÃæ¤Ç¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿ 13 ¤Ë¤Ä¤¤¤Æ¤Î ¾¤Î¥¤¥Ù¥ó¥È¤ò¸«¤Ä¤±¤¿¾ì¹ç¡¢ ¤½¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬°ÊÁ°¤Ëºï½ü¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¤Èʬ¤«¤ë¤Î¤Ç¡¢ º®Íð¤Ïµ¯¤¤Ê¤¤¡£
¥Ð¡¼¥¸¥ç¥ó
epoll(7) ¤Ï Linux ¥«¡¼¥Í¥ë 2.5.44 ¤ËƳÆþ¤µ¤ì¤¿¿·¤·¤¤ API ¤Ç¤¢¤ë¡£ ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï Linux ¥«¡¼¥Í¥ë 2.5.66 ¤Ç³ÎÄꤵ¤ì¤ë¤Ù¤¤Ç¤¢¤ë¡£½àµò
epoll API ¤Ï Linux ¸ÇͤǤ¢¤ë¡£ ¾¤Î¥·¥¹¥Æ¥à¤Ç¤âƱÍͤε¡¹½¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤¬¤¢¤ë¡£ Î㤨¤Ð¡¢FreeBSD ¤Î kqueue ¤ä Solaris ¤Î /dev/poll ¤Ê¤É¤Ç¤¢¤ë¡£´ØÏ¢¹àÌÜ
epoll_create(2), epoll_ctl(2), epoll_wait(2)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre