// Á¦ ¸ñ: ´ÙÁß¿¬°á(multiple sockets) ¼¹öÀÇ ±¸Çö¹æ¹ý Á¾·ù
// ÀÛ¼ºÀÚ: ±è¿µ´ë( http://www.howto.pe.kr )
1) fork
.´ÙÁß¿¬°á ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ °Íº¸´Ù´Â ÀϹÝÀûÀÎ ½Ã½ºÅÛ ÇÁ·Î±×·¥¿¡ »ç¿ëµÇ´Â ±â¹ýÀ¸·Î,
³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡ È®´ë½ÃÄѼ »ç¿ëÇѰÍÀÌ´Ù.
.ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ó¸®ÇÏ´Ù°¡ ¹®Á¦°¡ »ý°Üµµ ÇØ´ç ÇÁ·Î¼¼½º¿¡°Ô¸¸ ¿µÇâÀ» ³¢Ä¡¹Ç·Î Àüü ¼ºñ½º¿¡
ÁöÀåÀÌ »ý±æ ¿°·Á°¡ ÁÙ°í, ÇÁ·Î±×·¡¹Ö ¿ª½Ã select, poll, thread ¸¦ »ç¿ëÇϴ°Ϳ¡ ºñÇØ¼ °£´ÜÇϸç
µð¹ö±ëÀÌ ¿ëÀÌÇÏ´Ù¶ó´Â ÀåÁ¡ÀÌ ÀÖ´Ù.
.´ÜÁ¡Àº ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇϴµ¥ ¸¹Àº ½Ã°£°ú ÀÚ¿øÀÌ ¼Ò¸ðµÇ¸ç(ÀÀ´ä¼Óµµ ÀúÇÏ), ¾î´ÀÁ¤µµ ÀÌ»óÀÇ
ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃÄ×À» ¶§ Unix ¹öÀü¿¡ µû¶ó ´Ù¸£Áö¸¸ »ý¼ºµÇ´Â ÇÁ·Î¼¼½ºÀÇ ¼ö¿¡ Á¦ÇÑÀÌ ÀÖ´Ù.
ƯÈ÷ httpd ¿Í °°ÀÌ ¼¼¼ÇÀÌ ÂªÀº(¸îÃÊÀ̳») °æ¿ì´Â ¹®Á¦ ¾øÁö¸¸ ¼¼¼ÇÀÌ ±æ´Ù¸é »ý¼ºµÇ´Â ÇÁ·Î¼¼½ºÀÇ
¼ö¿¡ ¸¹Àº Á¦ÇÑÀÌ ÀÖÀ»°ÍÀÌ´Ù. ±×¸®°í »ý¼ºµÈ ÇÁ·Î¼¼½º°£ÀÇ ³»ºÎ Åë½ÅÀ» À§ÇØ IPC »ç¿ëÀÌ ºÒ°¡ÇÇÇÏ¿©
IPC ·Î ÀÎÇÑ ÇÁ·Î±×·¥ÀÇ º¹Àâµµ¿Í ½Ã½ºÅÛÄÝ »ç¿ëÀÇ ºÎÇϸ¦ °¨´çÇØ¾ß ÇÑ´Ù.
2) select()
.fork ¿Í °°ÀÌ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀÌ ¾Æ´Ñ ÇÑ ÇÁ·Î¼¼½º³»¿¡¼ ÀüºÎ 󸮵ǹǷΠÇÁ·Î¼¼½º
»ý¼º½Ã ¹ß»ýÇÏ´Â ºÎÇϸ¦ ÁÙÀÏ ¼ö ÀÖÀ¸¸ç IPC ¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù.
.´ÜÁ¡Àº ¸¹Àº socket connection À» ÇÑ ÇÁ·Î¼¼½º°¡ ó¸®ÇØ¾ß ÇϹǷΠÇϳªÀÇ request 󸮵¿¾È ´Ù¸¦
request µéÀº ÀüºÎ ´ë±âÇØ¾ß ÇÑ´Ù. ±×·¯¹Ç·Î request¿¡ ´ëÇÑ Ã³¸®°¡ ºü¸¥°æ¿ì(¿¹¸¦µé¾î äÆÃ)¸¸
»ç¿ëÇØ¾ß ÇÑ´Ù. ¹«¾ùº¸´Ù °¡Àå Å« ´ÜÁ¡Àº select ´Â ±âº»ÀûÀ¸·Î FD_SET ÀÇ °¢ ºñÆ®¸¦ üũÇÏ¿©
socket ¿¡ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö °Ë»çÇϴµ¥ À̰ÍÀÇ ±æÀ̰¡ 1024 ÀΰÍÀÌ ¹®Á¦ÀÌ´Ù. Áï ÇϳªÀÇ FD_SET
Àº 1024 °³¼öÀÇ socket ¸¸ ó¸®ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±× ÀÌ»óÀÎ °æ¿ì´Â FD_SETSIZE ¸¦ ¼öÁ¤ÇÏ¿© °¹¼ö¸¦
´Ã¸± ¼ö ´Â ÀÖÁö¸¸ FD_SETSIZE ´Â Ç¥ÁØ ¶óÀ̺귯¸®¸¦ ¼öÁ¤ÇÏ´Â °á°úÀ̹ǷΠ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù.
±×·¯¹Ç·Î 1024 °³¼ö ÀÌ»óÀÎ °æ¿ì¶ó¸é FD_SET À» ¿©·¯ °³ »ç¿ëÇÏ¿© ó¸®ÇÑ´Ù.
3) poll()
.select ¿Í ºñ½ÁÇÏ´Ù. ´Ù¸¥Á¡À̶ó¸é selectÀÇ FD_SETÀÇ 1024 Á¦ÇÑÀÌ ¾øÀ¸¸ç select ¿¡¼´Â 3°¡Áö
event¸¦ °Ë»çÇÏÁö¸¸ poll Àº 6°¡ÁöÀÇ event ¸¦ °Ë»çÇÒ ¼ö ÀÖ´Ù. ´ÜÁ¡Àº socket °³¼ö¸¸Å poll
±¸Á¶Ã¼¸¦ ¸¸µé¾î¾ß ÇϹǷΠ¸Þ¸ð¸® ³¶ºñ°¡ select() ¿¡ ºñÇØ ½ÉÇÏ´Ù. ¼º´ÉÀº select() º¸´Ù´Â ÁÁ´Ù
4) thread
. PTHREAD_SCOPE_PROCESS ¿Í PTHREAD_SCOPE_SYSTEM ÀÇ »ç¿ë¿¡ µû¶ó Àå´ÜÁ¡ÀÌ ¸¹ÀÌ ´Ù¸£Áö¸¸
¸¹Àº ÀÚ¿øÀ» °øÀ¯ÇÏ¿© IPC¸¦ »ç¿ëÇÏÁö ¾Ê´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ÇϳªÀÇ ¾²·¹µå°¡ À߸ø µ¿ÀÛÇÏ¿© Á״°æ¿ì
ÇÁ·Î¼¼½º³»ÀÇ ¸ðµç ¾²·¹µå°¡ ¿µÇâÀ» ¹Þ´Â´Ù.
5) ºñµ¿±âI/O ½Ã±×³Î(SIGIO)
. socket ¿¡ ºñµ¿±â I/O½ÅÈ£°¡ ÀÖÀ»¶§ Ä¿³Î·ÎºÎÅÍ SIGIO ½Ã±×³ÎÀ» ¹ÞÀ» ¼ö ÀÖµµ·Ï ÇÏ´Â ¹æ¹ýÀÌ´Ù.
signal(SIGIO, ½Ã±×³Îó¸®ÇÔ¼ö); ·Î ½Ã±×³Îó¸®ÇÔ¼ö¸¦ ÁöÁ¤ÇÑ ÈÄ fcntl(¼ÒÄÏ, F_SETFL, O_SYNC); ·Î
¼ÒÄÏÀ» ÁöÁ¤ÇÑ´Ù. À̰ÍÀº Ä¿³Î·ÎºÎÅÍ Á÷Á¢ ½Ã±×³ÎÀ» ¹ÞÀ¸¹Ç·Î ÀÌ¿¡ ´ëÇÑ ¹ÝÀÀÀ» »¡¸® ÇÒ ¼ö ÀÖÁö¸¸
¿©·¯ °³ÀÇ socket¿¡ ´ëÇØ µ¿½Ã¿¡ »ç¿ëµÈ´Ù¸é ½Ã±×³Î(SIGIO) ¹ß»ýÈÄ ½Ã±×³Î ó¸®ÇÔ¼ö°¡ È£ÃâµÉ ¶§
¾î¶² ¼ÒÄÏ¿¡¼ ¹ß»ýÇß´ÂÁö ¾Ë ¼ö ¾ø´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ÀÌ¿¡ ÃÖ±Ù¿¡´Â ½Ã±×³Î¿¡ fd(file descriptor)¸¦
½ÇÀ» ¼ö ÀÖ´Â Posix Real-Time ½Ã±×³ÎÀÌ ¿¬±¸µÇ°í ÀÖ´Ù.
6) preforking
. Ưº°ÇÑ API ÇÔ¼ö°¡ ÀÖ´Â °ÍÀº ¾Æ´Ï°í socket()->bind()->listen()->fork()->accept() ¼ø¼·Î ÁøÇàµÇ¾î
µ¿ÀÏÇÑ IP/Port ·Î fork() ÇÑ ¿©·¯ ÇÁ·Î¼¼½º°¡ ³ª´©¾î(round robin) accept() ÇÏ´Â ¹æ½ÄÀÌ´Ù
Apache °¡ ´ëÇ¥ÀûÀÎ ±¸Çö»ç·Ê·Î ¼º´É¸é¿¡¼ ¿ùµîÇÏ´Ù. ÇÏÁö¸¸ BSD °è¿µéÀº TCP/IP Ä¿³Î¿¡¼
Á÷Á¢ round robin À¸·Î accept() ¸¦ ó¸®ÇØ ÁÖÁö¸¸ ÀϹÝÀûÀÎ UNIX µéÀº lock(file lock, system wide
mutex lock) À» »ç¿ëÇÏ¿© ±¸ÇöµÈ´Ù.
7) /dev/poll (Solaris Ç¥ÁØ, Linux ´Â patch ÇÊ¿ä)
.Linux/Solaris ÀÇ °æ¿ì´Â Áö¿øµÇ³ª ´Ù¸¥ UNIX µéÀº Áö¿ø ºÒºÐ¸í
8) Posix Real-Time Signal
.ÇöÀç ¿¬±¸ ÁøÇàµÇ´Â ±â¼ú
9) kqueue (FreeBSD Ç¥ÁØ)
.FreeBSD ¿¡¸¸ ±¸ÇöµÇ¾î ÀÖÀ¸¸ç ¼º´É¸é¿¡¼ °¡Àå ¿ùµîÇÏ´Ù
* ¼º´Éºñ±³
On a 167MHz sun4u Sparc Ultra-1 running SunOS 5.7 (Solaris 7) Generic_106541-11:
pipes 100 1000 10000
select 151 - -
poll 470 676 3742
/dev/poll 61 70 92
On a 4X400Mhz Enterprise 450 running Solaris 8 (results contributed by Doug Lea):
pipes 100 1000 10000
select 60 - -
poll 273 388 1559
/dev/poll 27 28 34
On an idle 650 MHz dual Pentium III running Red Hat Linux 6.2 with kernel 2.2.14smp plus the /dev/poll patch plus Dave Miller's patch to speed up close():
pipes 100 1000 10000
select 28 - -
poll 23 890 11333
/dev/poll 19 146 4264
On a single processor 600Mhz Pentium-III with 512MB of memory, running FreeBSD 4.x-STABLE (results contributed by Jonathan Lemon):
pipes 100 1000 10000 30000
select 54 - - -
poll 50 552 11559 35178
kqueue 8 8 8 8
|
|