ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹®¼´Â kernel2.4¸¦ ±â¹ÝÀ¸·ÎÇÑ ¿À·¡µÈ ¹®¼ÀÔ´Ï´Ù. ±â¼úÀûÀÎ ³»¿ë¸¸ Âü°íÇϰí kernel 2.6 ¹öÀü¿ëÀ¸·Î º¯°æ»çÇ×À» È®ÀÎÇÏ¸é µÉ °Í °°½À´Ï´Ù. ÀÏ´Ü 2.6Àº Ä¿³ÎÆÐÄ¡³ª ¶óÀ̺귯¸® ¾øÀÌ epollÀ» Áö¿øÇϱ⠶§¹®¿¡, 2.6À» »ç¿ëÇÏ´Â Áö±ÝÀº ¶óÀ̺귯¸®¿Í Ä¿³Î ¼³Á¤ ºÎºÐÀº ÀÐÀ» Çʿ䰡 ¾ø½À´Ï´Ù.
1 ¼Ò°³
epoll »ç¿ë¿¡ ´ëÇÑ ¹®¼ÀÔ´Ï´Ù. ¿¹Àü 2.4.x ±âÁØÀ¸·Î ÀÛ¼ºÇÑ ¹®¼¸¦ °è¼Ó À¯ÁöÇß¾ú´Âµ¥¿ä. 2011³âÀÎ Áö±Ý±îÁö 2.4.x¸¦ ±âÁØÀ¸·Î ÇÑ ¹®¼¸¦ À¯ÁöÇÒ ÇÊ¿ä´Â ¾øÀ» °Í °°¾Æ¼ 2.6.x ¹öÀüÀ¸·Î ´Ù½Ã ¸¸µé¾ú½À´Ï´Ù. ¾²Áöµµ ¾Ê´Â 2.4¿¡ ´ëÇÑ ³»¿ëÀÌ ÀÖÀ¸´Ï ¿ÀÈ÷·Á Çê°¥¸®´õ¶ó±¸¿ä.
ÇöÀç epollÀº realtime signal°ú ÇÔ²² °¡Àå ºü¸¥ ÀÔÃâ·Â ó¸® ¹æ½Ä Áß Çϳª·Î ¾Ë·ÁÁ® ÀÖ½À´Ï´Ù. realtime signalº¸´Ù ´õ ºü¸£´ø°¡.. ±×·²°Ì´Ï´Ù. º¥Ä¡¸¶Å© °á°ú°¡ ÀÖ´ÂÁö ã¾ÆºÁ¾ß °Ú±º¿ä. 2 epoll2.1 epoll¿¡ ´ëÇØ¼
¸®´ª½ºÀÇ À̺¥Æ® ÅëÁö ÀÔÃâ·Â 󸮴 ÁÖ·Î select¿Í pollÀ» ÀÌ¿ëÇÑ ÀÔÃâ·Â ´ÙÁßȸðµ¨À» µû¸£°í ÀÖ½À´Ï´Ù. ÀÔÃâ·Â ´ÙÁßȸ¦ ÀÌ¿ëÇÏ´Â ÀÌÀ¯´Â ´Ù¼öÀÇ ÇÁ·Î¼¼½º ȤÀº ½º·¹µå¸¦ ¸¸µéÁö ¾Ê°íµµ ¿©·¯ ÆÄÀÏÀ» ó¸®ÇÒ ¼ö Àֱ⠶§¹®Àä. ÇÁ·Î¼¼½º¿Í ½º·¹µåÀÇ »ý¼º½Ã°£ÀÌ ¾øÀ¸´Ï ±×¸¸Å ºü¸£°Ô ÀÛµ¿ÇÒ ¼ö ÀÖ´Ù´Â ÀÌÁ¡À» ´©¸± ¼ö ÀÖÁÒ. °Ô´Ù°¡ IPC¸¦ »ç¿ëÇÒ Çʿ䵵 ¾ø±¸¿ä. ¸ÖƼ ÇÁ·Î¼¼½º, ¸ÖƼ ½º·¹µå ȯ°æ¿¡¼ IPC¸¦ »ç¿ëÇØ º» °æÇèÀÌ ÀÖ´Ù¸é, ¾ó¸¶³ª ±î´Ù·Î¿îÁö ¾Æ¸¶ ÀÌÇØÇÏ½Ç °Ì´Ï´Ù.
ÇÏÁö¸¸ select¸¦ ÀÌ¿ëÇÑ ¹æ¹ýÀº ¹®Á¦°¡ Á» ÀÖ½À´Ï´Ù. ¾ÆÀ̵ð¾î´Â ÈǸ¢Çѵ¥, ±¸ÇöÀÌ ±×´ÙÁö È¿À²ÀûÀÌÁö ¾Ê´Ù´Â ¹®Á¦ÀÔ´Ï´Ù.
2.2 Edge Trigger °ú Level Trigger
epollÀ» ´Ù·ç´Ùº¸¸é Edge Trigger°ú level Trigger µÑ Áß Çϳª¸¦ ¼±ÅÃÇØ¾ß Çϴµ¥¿ä. °£´ÜÇÏÁö¸¸, Çê°¥¸± ¼ö ÀÖ´Â ¿ë¾î¶ó¼ ¼³¸íÀ» ÇÏ°í ³Ñ¾î°¥±î ÇÕ´Ï´Ù.
LT ¹æ½ÄÀº select³ª polló·³ ÀÛµ¿À» Çϱ⠶§¹®¿¡ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù. select, pollÀº LT·Î ÀÛµ¿Çϴµ¥, ¼ÒÄÏ ¹öÆÛ°¡ ºñ±âÀü±îÁö 1·Î ¼³Á¤Çϱ⠶§¹®¿¡, ¼ÒÄÏ¿¡ ¹öÆÛ°¡ ÀÖ´Â µ¿¾È¿¡´Â °è¼Ó ¹ÝȯÇÕ´Ï´Ù.
¹Ý¸é ET´Â óÀ½ À̺¥Æ®°¡ ¹ß»ýÇØ¼ 1À̵ǾúÀ» ¶§¸¸ ¹ß»ýÇÕ´Ï´Ù. ¸¸¾à À̺¥Æ®°¡ ¹ß»ýÇØ¼ µ¥ÀÌÅ͸¦ Àоú´Âµ¥, ¹öÆÛÀÇ µ¥ÀÌÅ͸¦ ¸ðµÎ ÀÐÁö ¾Ê°í ´ÙÀ½ wait ÇÔ¼ö¸¦ È£ÃâÇÒ °æ¿ì, wait ÇÔ¼ö¿¡¼ ºÀ¼âµÇ´Â ¹®Á¦°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù. ÀÚÄ©ÇÏ¸é ¿µ¿øÈ÷ ºÀ¼âµÉ ¼öµµ ÀÖÁÒ. ´ÙÀ½ÀÇ ½Ã³ª¸®¿À¸¦ °¡Á¤Çغ¸ÁÒ.
LT ¹æ½ÄÀ¸·Î epollÀ» »ç¿ëÇÒ °æ¿ì, select¿Í µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹°·Ð ´õ ºü¸£°ÚÁÒ.
epollÀº LT ¹æ½ÄÀ» ±âº»À¸·Î ½ÇÇàµË´Ï´Ù. ¸¸¾à ET¹æ½ÄÀ¸·Î ÁöÁ¤ÇÏ°í ½Í´Ù¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µË´Ï´Ù. mev.events = EPOLLIN | EPOLLET ....; epoll_ctl(mepollfd, EPOLL_CTL_ADD, afd, &mev); 2.3 ÃÖ´ë µî·Ï ÆÄÀÏ °³¼ö
/proc/sys/fs/epoll/max_user_watches ¿¡¼ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡´Â À¯Àú°¡ µî·ÏÇÒ ¼ö ÀÖ´Â ÆÄÀÏÀÇ ÃÖ´ë °³¼ö°¡ ¸í½ÃµÇ¾î Àִµ¥¿ä. User ID´ç Á¦ÇÑÀÌ ¼³Á¤µË´Ï´Ù. 32bit Ä¿³Î¿¡¼´Â ÆÄÀÏ Çϳª´ç ¾à 90byteÀÇ ¸Þ¸ð¸®°¡ 64bit¿¡¼´Â 160¹ÙÀÌÆ®°¡ ÇÊ¿äÇÏ´Ù°í ÇÕ´Ï´Ù. 3 epoll API
epoll¸¦ »ç¿ëÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇÕ´Ï´Ù. selectÀÇ È®ÀåÇÑ ±â¼úÀ̱⠶§¹®¿¡, ÀÔÃâ·Â ´ÙÁßÈ¿¡ ´ëÇÑ °æÇèÀÌ ÀÖ´Ù¸é ½±°Ô ÀÌÇØÇϰí ÀÀ¿ëÇÒ ¼ö ÀÖÀ» °Ì´Ï´Ù. 3.1 epoll_createepoll_create(int size)epoll_create()´Â À̺¥Æ®¸¦ ÀúÀåÇϱâ À§ÇÑ size¸¸ÅÀÇ °ø°£À» Ä¿³Î¿¡ ¿äûÇÕ´Ï´Ù. Ä¿³Î¿¡ ¿äûÇÑ´Ù°í ÇØ¼ ¹Ýµå½Ã size¸¸ÅÀÇ °ø°£ÀÌ È®º¸µÇ´Â °Ç ¾Æ´ÏÁö¸¸ Ä¿³ÎÀÌ ´ë·« ¾î´À Á¤µµÀÇ °ø°£À» ¸¸µé¾î¾ß ÇÒÁö´Â Á¤ÇØÁÙ ¼ö ÀÖ½À´Ï´Ù. ¼öÇàµÈ ÈÄ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ µÇµ¹·Á Áִµ¥, ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾ÊÀ» °Å¶ó¸é close ÇÔ¼ö·Î ´Ý¾ÆÁÖ¸é µË´Ï´Ù.
Å©±â´Â ¼ºñ½º ¸¶´Ù ´Ù¸¥µ¥¿ä. ÀϹÝÀûÀ¸·Î ¿¹»ó ÃÖ´ë µ¿Á¢ x 1.5 Á¤µµ¸é µÈ´Ù°í ÇÕ´Ï´Ù. 3.2 epoll_waitint epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)½ÇÁ¦ À̺¥Æ®°¡ ¹ß»ýÇÏ´Â°É ±â´Ù¸®°í ÀÖ´Ù°¡, À̺¥Æ®°¡ ¹ß»ýÇϸé À̺¥Æ® °ü·Ã Á¤º¸¸¦ ³Ñ°ÜÁÖ´Â ÀÏÀ» ÇÕ´Ï´Ù.
epfd´Â epoll_create(2)¸¦ ÀÌ¿ëÇØ¼ »ý¼ºµÈ epoll ÁöÁ¤¹øÈ£±¸¿ä. ¸¸¾à À̺¥Æ®°¡ ¹ß»ýÇÏ¸é ¹ÝȯÇϴµ¥, À̺¥Æ®¿¡ °üÇÑ Á¤º¸´Â events¿¡ ±â·ÏµË´Ï´Ù . maxevents´Â epollÀ̺¥Æ® Ç®ÀÇ Å©±â°í¿ä. timeout´Â ±â´Ù¸®´Â ½Ã°£ÀÔ´Ï´Ù. 0º¸´Ù ÀÛ´Ù¸é À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§±îÁö ±â´Ù¸®°í, 0ÀÌ¸é ¹Ù·Î ¸®ÅÏ, 0º¸´Ù Å©¸é timeout ¹Ð¸®¼¼ÄÁµå ¸¸Å ±â´Ù¸°´Ù. ¸¸¾à timeout½Ã°£¿¡ À̺¥Æ®°¡ ¹ß»ýÇÏÁö ¾Ê´Â´Ù¸é 0À» ¹ÝȯÇÕ´Ï´Ù.
À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é ¹ß»ýÇÑ À̺¥Æ®ÀÇ °¹¼ö¸¦ ¹ÝȯÇÕ´Ï´Ù. 3.3 epoll_ctlint epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)À̺¥Æ®Ç®À» Á¦¾îÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. poll(2)¿Í ¸Å¿ì ºñ½ÁÇÏ°Ô ÀÛµ¿ÇÑ´Ù. op´Â fd¿¡ ´ëÇØ¼ ¾î¶² ÀÛ¾÷À» ÇÒ°ÍÀÎÁö¸¦ Á¤ÀÇÇϱâ À§Çؼ »ç¿ëµÈ´Ù. op°¡ ½ÇÇàµÈ °á°ú´Â event±¸Á¶Ã¼¿¡ Àû¿ëµÈ´Ù.
´ÙÀ½Àº 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_data_t data; /* À¯Àú µ¥ÀÌÅÍ·Î Á÷Á¢ ¼³Á¤°¡´ÉÇÏ´Ù */
};
epoll_data_t¸¦ À¯½ÉÈ÷ º¼Çʿ䰡 ÀÖ´Ù. unionÀÌ¶ó¼ »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ±æ ¼ö°¡ ÀÖ½À´Ï´Ù. ¿¹¸¦µé¾î ¿©±â¿¡ pid°ªÀ̶óµçÁö ¼ÒÄÏÁöÁ¤¹øÈ£ ȤÀº ¸Þ½ÃÁö¸¦ Æ÷ÇÔÇÑ Á¤º¸¸¦ ±¸Á¶Ã¼·Î ³Ñ°ÜÁÙ ¼ö ÀÖ´Â °ÅÁÒ.
op´Â ´ÙÀ½°ú °°Àº Á¾·ùÀÇ ÀÛ¾÷¸í·ÉµéÀ» °¡Áö°í ÀÖ½À´Ï´Ù. poll(2)¿Í ºñ±³Çغ¸¸é ¸Å¿ì À¯»çÇÔÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
4 epollÀÇ ÀåÁ¡/´ÜÁ¡/ÇØ°á¹æ¹ý4.1 ÀåÁ¡
4.2 ´ÜÁ¡
5 ¿¹Á¦ ÇÁ·Î±×·¥
epoll½Ã½ºÅÛ ±¸ÃàÀ» ±â³ä»ï¾Æ¼ °£´ÜÇÑ ¿¹Á¦ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¾Ò´Ù. ¾Æ·¡ ÇÁ·Î±×·¥Àº echo¼¹öÀÇ epoll¹öÁ¯À¸·Î LT¸ðµå´Ù. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/epoll.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <fcntl.h> #include <sys/ioctl.h> #define SA struct sockaddr #define EPOLL_SIZE 20 int main(int argc, char **argv) { struct sockaddr_in addr, clientaddr; struct eph_comm *conn; int sfd; int cfd; int clilen; int flags = 1; int n, i; int readn; struct epoll_event ev,*events; int efd; char buf_in[256]; // À̺¥Æ® Ç®ÀÇ Å©±â¸¸Å events±¸Á¶Ã¼¸¦ »ý¼ºÇÑ´Ù. events = (struct epoll_event *)malloc(sizeof(*events) * EPOLL_SIZE); // epoll_create¸¦ ÀÌ¿ëÇØ¼ epoll ÁöÁ¤ÀÚ¸¦ »ý¼ºÇÑ´Ù. if ((efd = epoll_create(100)) < 0) { perror("epoll_create error"); return 1; } // -------------------------------------- // µè±â ¼ÒÄÏ »ý¼ºÀ» À§ÇÑ ÀϹÝÀûÀÎ ÄÚµå clilen = sizeof(clientaddr); sfd = socket(AF_INET, SOCK_STREAM, 0); if (sfd == -1) { perror("socket error :"); close(sfd); return 1; } addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[1])); addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind (sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { close(sfd); return 1; } listen(sfd, 5); // -------------------------------------- // ¸¸µé¾îÁø µè±â ¼ÒÄÏÀ» epollÀ̺¥Æ® Ç®¿¡ Ãß°¡ÇÑ´Ù. // EPOLLIN(read) À̺¥Æ®ÀÇ ¹ß»ýÀ» ŽÁöÇÑ´Ù. ev.events = EPOLLIN; ev.data.fd = sfd; epoll_ctl(efd, EPOLL_CTL_ADD, sfd, &ev); while(1) { // epollÀ̺¥Æ® Ç®¿¡¼ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö¸¦ °Ë»çÇÑ´Ù. n = epoll_wait(efd, events, EPOLL_SIZE, -1); if (n == -1 ) { perror("epoll wait error"); } // ¸¸¾à À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é ¹ß»ýÇÑ À̺¥Æ®ÀÇ ¼ö¸¸Å // µ¹¸é¼ µ¥ÀÌÅ͸¦ ÀÐ¾î ¿É´Ï´Ù. for (i = 0; i < n; i++) { // ¸¸¾à À̺¥Æ®°¡ µè±â ¼ÒÄÏ¿¡¼ ¹ß»ýÇÑ °Å¶ó¸é // accept¸¦ ÀÌ¿ëÇØ¼ ¿¬°á ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù. if (events[i].data.fd == sfd) { printf("Accept\n"); cfd = accept(sfd, (SA *)&clientaddr, &clilen); ev.events = EPOLLIN; ev.data.fd = cfd; epoll_ctl(efd, EPOLL_CTL_ADD, cfd, &ev); } // ¿¬°á¼ÒÄÏ¿¡¼ À̺¥Æ®°¡ ¹ß»ýÇß´Ù¸é // µ¥ÀÌÅ͸¦ Àд´Ù. else { memset(buf_in, 0x00, 256); readn = read(events[i].data.fd, buf_in, 255); if (readn <= 0) { epoll_ctl(efd, EPOLL_CTL_DEL, events[i].data.fd, events); close(events[i].data.fd); printf("Close fd\n", cfd); } else { printf("read data %s\n", buf_in); write(events[i].data.fd, buf_in, readn); } } } } } 6 ÇÁ·ÎÁ§Æ® ÁøÇà
7 Âü°í ¹®¼
ÃÖÃÊ ÀÛ¼ºÀÏ : 2004³â Âë ¸¶Áö¸· ¼öÁ¤ÀÏ : 2011³â 6¿ù 10ÀÏ |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|