Overlapped I/O ¿Í IOCP Programming
 FrontPage|FindPage|TitleIndex|RecentChanges|UserPreferences U E D R S P I M H RSS

NetWatchNetwork Game ProgrammingNetwork LibraryOffice CD ¸¸µé±âOpenSSL › Overlapped I/O ¿Í IOCP Programming
Contents:
1 °³¿ä
2 °ü·Ã¼­Àû
3 Áֿ丵ũ
4 Overlapped I/O
5 IOCP ¸¦ ÀÌ¿ëÇÑ ¼­¹ö ±¸Çö½Ã ÁÖÀÇ»çÇ×
5.1 ¿¡·¯ Äڵ带 ¹Ýµå½Ã È®ÀÎÇÑ´Ù
5.2 ÂüÁ¶ Ä«¿îÆ®¸¦ À¯ÁöÇÑ´Ù
5.3 µ¥µå¶ôÀ» ÁÖÀÇÇÑ´Ù
6 ´Ù¿î·Îµå
7 °ü·Ã¸µÅ©


1 °³¿ä #



2 °ü·Ã¼­Àû #


  • Ŭ¸¯Çϼ¼¿ä ¿Â¶óÀÎ °ÔÀÓ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö
    • ½Åµ¿ÈÆ Àú, ´ë¸²
  • NETWORK PROGRAMMING FOR MICROSOFT WINDOWS
    • Anthony Jones.Jim Ohlund °øÀú, ±è³²½Ä ¿ª, Á¤º¸¹®È­»ç
  • ¹èƲ³Ý °³¹ßÀ» À§ÇÑ Network Game Server Programming
    • ¹Ú¸í½Ä. ÃÖ¼³È£ °øÀú, ¿µÁø.com


3 Áֿ丵ũ #


4 Overlapped I/O #


¿À¹ö·¦µå ( overlapped ) I/O ¶õ ¹®ÀÚ ±×´ë·Î ÁßøµÈ ÀÔÃâ·ÂÀ» ¶æÇÑ´Ù. CPU ¿¡ ºñÇØ µð½ºÅ©³ª Åë½Å µð¹ÙÀ̽ºÀÇ ÀÔÃâ·Â¿¡ °É¸®´Â ¼Óµµ´Â ´ë´ÜÈ÷ ´À¸®±â ¶§¹®¿¡ ¿À¹ö·¦µå I/O ¸¦ »ç¿ëÇØ µð¹ÙÀ̽º ÀÔÃâ·Â½Ã¿¡ °É¸®´Â ½Ã°£ Áö¿¬À» ÇÇÇÒ ¼ö ÀÖ´Ù. ¹°·Ð À©¼ÓÀº ÀÌ¹Ì ¿©·¯ °¡Áö ºñµ¿±â ÀÔÃâ·Â ¹æ¹ýÀ» Á¦°øÇϰí ÀÖ¾î, ±»ÀÌ ¿À¹ö·¦µå I/O ¸¦ »ç¿ëÇÏÁö ¾Ê´õ¶óµµ °ÅÀÇ °°Àº ¼º´ÉÀÇ ºñµ¿±â ÀÔÃâ·ÂÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù. Àá½Ã ÈÄ ¼Ò°³ÇÒ IOCP ( IO Completion Port ) ¿Í ÇÔ²² »ç¿ëµÇ±â ¶§¹®¿¡ ÇÑ ¹øÂë °ÅÃÄ¾ß ÇÒ °ü¹® Á¤µµ·Î¸¸ »ý°¢ÇØ µÎ°í ºÎ´ã¾øÀÌ ÁøÇàÇØ ³ª°¡µµ·Ï ÇÏÀÚ. send, recv ´ë½Å WSASend, WSARecv ¸¦ »ç¿ëÇØ ¿À¹ö·¦µå I/O ¸¦ ÇÒ ¼ö ÀÖ´Ù.

  • WSASend. WSARecv ÇÔ¼ö
int WSASend(
	SOCKET   s,
	LPWSABUF lpBuffers,
	DWORD    dwBufferCount,
	LPDWORD  lpNumberOfBytesSent,
	DWORD    dwFlags,
	LPWSAOVERLAPPED lpOverlapped,
	LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

int WSARecv(
	SOCKET   s,
	LPWSABUF lpBuffers,
	DWORD    dwBufferCount,
	LPDWORD  lpNumberOfBytesRecvd,
	LPDWORD  lpFlags,
	LPWSAOVERLAPPED lpOverlapped,
	LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

ÇÔ¼ö ÆÄ¶ó¹ÌÅÍÀÇ ±¸Ã¼ÀûÀÎ »ç¿ë¹ýÀº ÀÌÈÄ¿¡ ³íÇϱâ·Î Çϰí, Áö±ÝÀº WSAOVERLAPPED ±¸Á¶Ã¼¸¦ »ç¿ëÇØ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù´Â °Í Á¤µµ¸¸ ¾Ë¾ÆµÎÀÚ. ³Íºí·¯Å· ¼ÒÄÏ¿¡¼­¿Í ¸¶Âù°¡Áö·Î ¿À¹ö·¦µå¸¦ »ç¿ëÇÑ WSASend, WSARecv È£ÃâÀº Ưº°ÇÑ ÀÌ»óÀÌ ¾ø´Â ÇÑ WSAEWOULDBLOCK À» ¸®ÅÏÇÑ´Ù. ¿À¹ö·¦µå I/O ÀÇ ¿Ï·á ¿©ºÎ¸¦ È®ÀÎÇÏ·Á¸é ´ÙÀ½ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.

BOOL WSAGetOverlappedResult(
	SOCKET  s,
	LPWSAOVERLAPPED lpOverlapped,
	LPDWORD lpcbTransfer,
	BOOL    fWait,
	LPDWORD lpdwFlags
);

»ç½ÇÀº ¹Ù·Î IOCP ¸¦ ¼³¸íÇØµµ µÇÁö¸¸, ¿À¹ö·¦µå I/O ¸¦ ¼³¸íÇϸ鼭 ±×³É Áö³ªÄ¡¸é WSAGetOverlappedResult °¡ ¼·¼·ÇØ ÇÒ±îºÁ Çѹø µîÀå½ÃÄÑ º¸¾Ò´Ù. ¹Ù·Î µÚ¿¡ ¼³¸íÇÒ IOCP ¸¦ »ç¿ëÇØ ¿Ï·á Å뺸¸¦ ¹Þ°Ô µÇ¸é, ´õ ÀÌ»ó ÀÌ ÇÔ¼ö´Â ¼³ ÀÚ¸®°¡ ¾ø¾îÁö±â ¶§¹®¿¡ µ¶ÀÚÀÇ ±â¾ï ¼Ó¿¡ ±×¸® ¿À·¡ ¸Ó¹° °Í °°Áø ¾Ê´Ù. ¿À¹ö·¦µå I/O ÀÇ ´Ù¾çÇÑ ¾²ÀÓ»õ³ª À©¼ÓÀÇ ´Ù¸¥ ºñµ¿±â ÀÔÃâ·Â ¹æ¹ý¿¡ ´ëÇØ ÀÚ¼¼È÷ ¾Ë°í ½Í´Ù¸é, ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ÇÁ·¹½ºÀÇ ¡¸Network Programming for Microsoft Windows¡¹¸¦ Âü°íÇϱ⠹ٶõ´Ù.


5 µð¹ÙÀ̽º ÀÔÃâ·Â ¿Ï·á Å뺸 Æ÷Æ®, IOCP #


IOCP ´Â µð¹ÙÀ̽ºÀÇ ÀÔÃâ·Â ¿Ï·á¸¦ Å뺸Çϱâ À§ÇÑ Æ÷Æ®·Î¼­, ºü¸¥ ÀÔÃâ·Â Å뺸 ¿Ü¿¡ ÃÖÀûÈ­µÈ ¾²·¹µå Ç®¸µ ±â¼úÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. µð¹ÙÀ̽º¿Í IOCP ¸¦ ¿¬°áÇÏ´Â µ¥ °³¼ö Á¦ÇÑÀÌ ¾ø°í, ÃÖÀûÈ­µÈ ¾²·¹µå Ç®¸µÀ» ÅëÇØ °í¼º´É ¼­¹ö¸¦ ±¸ÃàÇϴµ¥ Å« µµ¿òÀÌ µÇ±â ¶§¹®¿¡, ÇöÀç ¸¹Àº À©µµ¿ì ¼­¹ö ÇÁ·Î±×·¡¸ÓµéÀÇ »ç¶ûÀ» ¹Þ°í ÀÖ´Â ±Í¿©¿î ³à¼®À̱⵵ ÇÏ´Ù. Á¦°øµÇ´Â ¼º´É¿¡ ºñÇØ »ç¿ë¹ý ÀÚü´Â ÀǿܷΠ°£´ÜÇØ ÇÁ·Î±×·¡¸Ó´Â IOCP ¸¦ ¸¸µé°í, ÀûÀýÇÑ ¼öÀÇ ¿öÄ¿ ¾²·¹µå¸¦ »ý¼ºÇÑ ´ÙÀ½ ÀÔÃâ·Â ¿Ï·á Å뺸¸¦ ±â´Ù¸®±â¸¸ ÇÏ¸é µÈ´Ù.

HANDLE CreateIoCompletionPort (
	HANDLE FileHandle,
	HANDLE ExistingCompletionPort,
	ULONG_PTR CompletionKey,
	DWORD NumberOfConcurrentThreads
);

IOCP ¸¦ ¸¸µé¾î ÁÖ´Â Á» ¿ô±â´Â(?) ÇÔ¼ö´Ù. ÀÌ ÇÔ¼ö´Â »ç½Ç»ó µÎ °¡Áö ¿ªÇÒÀ» Çϴµ¥, Çϳª´Â À̸§ ±×´ë·Î IOCP ¸¦ »ý¼ºÇÏ´Â °ÍÀ̰í ( ³× ¹øÂ° ÆÄ¶ó¹ÌÅ͸¸ »ç¿ë ), ´Ù¸¥ Çϳª´Â ¿À¹ö·¦µå ¼Ó¼ºÀ» Áö´Ñ ¼ÒÄϰú IOCP ¸¦ ¿¬°áÇÏ´Â °ÍÀÌ´Ù ( ¾ÕÀÇ ¼¼ ÆÄ¶ó¹ÌÅ͸¸ »ç¿ë ). ¡¸Programming Server-Side Applications for Microsoft Windows 2000¡¹ÀÇ ÀúÀÚ Á¦ÇÁ¸® ¸®Ã³ ( Jeffrey Richter ) µµ ¾ð±ÞÇÑ °ÍÀÌÁö¸¸, ÇÔ¼ö¸¦ ¿Ö Àú·¸°Ô ¸¸µé¾î ³ù´ÂÁö µµÀúÈ÷ ÀÌÇØµÇÁö ¾Ê´Â ºÎºÐÀÌ´Ù. ¾î·µç ²Ï Áß¿äÇÑ ÇÔ¼öÀ̱⿡ ´ÙÀ½ÀÇ ÀÏ·ÃÀÇ È帧À» º¸¸é¼­ IOCP ü°è¸¦ È®½ÇÈ÷ ÀÌÇØÇØ µÑ Çʿ䰡 ÀÖ´Ù.

5.1 IOCP ¸¦ ¸¸µç´Ù #


HANDLE h = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0);

óÀ½¿£ ´ç¿¬È÷ IOCP ¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ¸ÕÀú IOCP ¸¦ ¸¸µé ¶§´Â ¾ÕÀÇ ¼¼ ÆÄ¶ó¹ÌÅͰ¡ ¾²ÀÌÁö ¾ÊÀ¸¹Ç·Î °¡º±°Ô INVALID_HANDLE_VALUE, 0, 0 À» ³Ñ°ÜÁÖÀÚ. NumberOfConcurrentThreads ¿¡ ¿À¹ö·¦µå I/O ¸¦ ó¸®Çϱâ À§ÇØ µ¿½Ã¿¡ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¾²·¹µåÀÇ ¼ö¸¦ ÁöÁ¤Çϴµ¥, 0 À» ³Ñ±â¸é ½Ã½ºÅÛÀº ¼³Ä¡µÈ ÇÁ·Î¼¼¼­ ( CPU ) ÀÇ ¼ö¸¸Å­ ÇÒ´çÇÑ´Ù.

5.2 IOCP ¸¦ °¨½ÃÇÒ ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù #


1  SYSTEM_INFO si
2  GetSystemInfo( &si );
3
4  numThreads = si.dwNumberOfProcessors * 2;
5
6  for ( i = 0; i < numThreads; i++ )
7      _beginthreadex( NULL, 0, WorkerThread, ... );

IOCP ÀÇ ¿Ï·á Å뺸¸¦ ¹ÞÀ» ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù. Á» ÀÌ»óÇÑ ºÎºÐÀÌ ´«¿¡ ¶çÁö ¾Ê´Â°¡? IOCP ¸¦ ¸¸µé ¶§ CPU ¼ö¸¸Å­ÀÇ ¾²·¹µå°¡ µ¿½Ã¿¡ µ¹¾Æ°¥ ¼ö ÀÖµµ·Ï ±× ¼ö¸¦ Á¦ÇÑÇØ ³õ°í¼±, Á¤ÀÛ ¾²·¹µå´Â ±× µÎ ¹è¸¸Å­ ¸¸µé°í ÀÖ´Ù. ÀÌ´Â ¿öÅ© ¾²·¹µå°¡ Wait »óÅ¿¡ ´Ù´Ù¸¦ ¶§ ( ¿¹ : Sleep È£Ãâ ) IOCP °¡ ¶Ç ´Ù¸¥ ¾²·¹µå¿¡ ¿Ï·á Å뺸¸¦ ÇØÁֱ⠶§¹®¿¡ ¿©ºÐÀÇ ¾²·¹µå¸¦ ¹Ì¸® ¸¸µé¾î µÎ´Â °ÍÀÌ´Ù. µÎ ¹è¶ó°í ÇÑ °ÍÀº ÇÊÀÚ ¸¾´ë·Î Á¤ÇÑ ¼öÄ¡ÀÌ°í ¼­¹öÀÇ ±¸Çö ¹æ¹ýÀ̳ª ¼­ºñ½º ³»¿ë¿¡ µû¶ó ÀûÀýÇÑ °ªÀ» ã´Â °ÍÀÌ ÁÁ´Ù.

5.3 ¼ÒÄϰú IOCP ¸¦ ¿¬°á½ÃŲ´Ù #


CreateIoCompletionPort( (HANDLE) my_socket, iocp_handle, completion_key, 0 )

¿À¹ö·¦µå I/O ¸¦ IOCP ·Î Å뺸¹Þ±â À§ÇØ ¼ÒÄÏ ÇÚµé°ú IOCP ÇÚµéÀ» ¿¬°á½ÃÄÑ¾ß ÇÑ´Ù. ¼¼ ¹øÂ° ÆÄ¶ó¹ÌÅÍÀÎ completion_key ´Â ³ªÁß¿¡ ¿À¹ö·¦µå I/O ¿¡ ´ëÇÑ ¿Ï·á Å뺸¸¦ ¹ÞÀ» ¶§, ¾î¶² ¼ÒÄÏÀ¸·ÎºÎÅÍÀÇ ¿Ï·á Å뺸ÀÎÁö ½Äº°ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â °ÍÀ¸·Î º¸Åë ¼ÒÄÏÀ» Æ÷ÇÔÇϰí ÀÖ´Â °´Ã¼ÀÇ ÁÖ¼Ò¸¦ ³Ñ±ä´Ù. ±×¸®°í ¾Õ¼­ ¾ð±ÞÇßµí ¸¶Áö¸· ÆÄ¶ó¹ÌÅÍ´Â ¾²Áö ¾Ê´Â´Ù.

5.4 IOCP¸¦ °¨½Ã(+_+)ÇÑ´Ù #


 1  WorkerThread()
 2  {
 3      while ( TRUE )
 4      {
 5          GetQueuedCompletionStatus(
 6              iocp_handle,        // HANDLE CompletionPort
 7              &bytes_transferred, // LPDWORD lpNumberOfBytes
 8              &completion_key,    // PULONG_PTR lpCompletionKey
 9              &overlapped,        // LPOVERLAPPED *lpOverlapped
10              INFINITE            // WORD dwMilliseconds
11          );
12
13          // completion_key¿Í ¿À¹ö·¦µå¸¦ º¸¸é
14          // ¾î¶² ¼ÒÄÏÀÇ ¿À¹ö·¦µå I/OÀÎÁö ±¸º°ÇÒ ¼ö ÀÖ´Ù.
15      }
16  };

óÀ½ º¸´Â ÇÔ¼ö°¡ ³ªÅ¸³µ´Ù. ÀÌ¹Ì µ¶ÀÚµµ ¿¹»óÇϰí ÀÖ°ÚÁö¸¸ GetQueuedCompletionStatus °¡ IOCP ÀÇ ºÎ¸§ ( Thread Wake-Up ) À» ¹Þ±â À§ÇØ ±â´Ù¸®°í ÀÖ´Ù. ÀÌ ÇÔ¼ö¸¦ ÅëÇØ ¾î¶² ¼ÒÄÏÀÇ ¾î¶² È£ÃâÀÎÁö, ¶Ç ¾ó¸¶¸¸Å­ Àü¼ÛÀÌ µÇ¾ú°í ¿¡·¯ ÄÚµå´Â ¹«¾ùÀÎÁö µîÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

5.5 WSASend, WSARecv µîÀÇ ¿À¹ö·¦µå I/O¸¦ ½ÃÀÛÇÑ´Ù #


WSASend(
	s, &wsabuf, 1,
	&bytes_transferred, 0, &overlapped, NULL );

WSARecv(
	s, &wsabuf, 1,
	&bytes_transferred, &flag, &overlapped, NULL );

ÆÐŶÀ» ÁÖ°í¹Þ±â À§ÇØ ¿À¹ö·¦µå ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇÑ´Ù. WSASend, WSARecv °¢°¢ÀÇ ÆÄ¶ó¹ÌÅÍ¿¡ ÁÖÀǸ¦ ±â¿ïÀÏ Çʿ䰡 Àִµ¥, ÀÌ¿¡ °üÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ´ÙÀ½ ¹ø¿¡ Á÷Á¢ ³×Æ®¿öÅ© ¶óÀ̺귯¸®¸¦ ±¸ÇöÇϸ鼭 ÀÚ¼¼È÷ ¼³¸íÇϱâ·Î Çϰí Áö±ÝÀº IOCP ü°è¸¦ ÀÌÇØÇÏ´Â °Í¿¡ ÃÊÁ¡À» ¸ÂÃßÀÚ.

Programming/IOCP_Process.gif
<±×¸² 1> IOCP ó¸® È帧

µÎ °³ÀÇ CPU °¡ ¼³Ä¡µÈ À©µµ¿ì 2000 ¿¡¼­ <±×¸² 1> °ú °°Àº IOCP ¼­¹ö°¡ ½ÇÇà ÁßÀ̶ó°í °¡Á¤ÇØ º¸ÀÚ. IOCP ¸¦ ¸¸µé ¶§ NumberOfConcurrentThreads ¿¡ 0 À» ³Ñ°Ü µ¿½Ã ¾²·¹µå ( concurrent thread ) ÀÇ ¼ö°¡ µÎ °³°¡ µÇµµ·Ï Çß´Ù. #1 Àº ÀÌ¹Ì ¿Ï·á Å뺸¸¦ ¹Þ¾Æ ÇØ´ç °´Ã¼ÀÇ ¼Û¼ö½ÅÀ» ó¸® ÁßÀ̰í, #2 °¡ Áö±Ý ¸· ¿Ï·á Å뺸¸¦ ¹Þ°í ÀÖ´Ù. ÀÌ·¸°Ô µÇ¸é Á¤È®È÷ µÎ °³ÀÇ ¾²·¹µå°¡ µ¿½Ã¿¡ ½ÇÇàÁßÀÎ °ÍÀ̸ç, IOCP Å¥¿¡ ¿Ï·á Å뺸°¡ µµÂøÇÏ´õ¶óµµ IOCP ´Â ´Ù¸¥ ¾²·¹µå ( #3 ) ¿¡ ¿Ï·á Å뺸¸¦ ÇÏÁö ¾Ê´Â´Ù. ÀÌ ½ÃÁ¡¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â µÎ °¡Áö ½Ã³ª¸®¿À¸¦ ¼¼¿ö º¸¾Ò´Ù.

¡ß ½Ã³ª¸®¿À 1 - #1 ÀÌ ¿Ï·á Å뺸 󸮸¦ ¸¶Ä§
¿Ï·á 󸮰¡ ³¡³µ±â ¶§¹®¿¡, #1 Àº ´Ù½Ã GetQueuedCompletionStatus ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. À̶§ IOCP ´Â Å¥¿¡ ½×¿© ÀÖ´ø ´Ù¸¥ ¿Ï·á Å뺸¸¦ ´Ù½Ã #1 ¿¡ ³Ñ°ÜÁØ´Ù. ¸ÕÀú ±â´Ù¸®°í ÀÖ´ø #3 ¿¡ ³Ñ±âÁö ¾Ê´Â ÀÌÀ¯´Â ¾²·¹µå ÄÁÅØ½ºÆ® ½ºÀ§ÄªÀ» ÁÙÀ̱â À§Çؼ­´Ù.

¡ß ½Ã³ª¸®¿À 2 - #1 ÀÌ Ã³¸® µµÁß Sleep À» È£Ãâ
ÇÁ·Î±×·¡¸Ó°¡ ¹«½¼ »ý°¢À¸·Î Sleep À» È£ÃâÇß´ÂÁö´Â ¸ð¸£°ÚÁö¸¸ ¾î·µç ¾²·¹µå Wait »óÅ¿¡ µ¹ÀÔÇÑ´Ù. ÀÌ ¶§ ±â´Ù¸®°í ÀÖ´ø #3 ÀÌ IOCP ·ÎºÎÅÍ ¿Ï·á Å뺸¸¦ ¹Þ´Â´Ù. ÀÌ ½ÃÁ¡ÀÇ ½ÇÁ¦ µ¿½Ã ¾²·¹µå ¼ö´Â 2+1 ( Wait State ) À̸ç, #1 ÀÌ Àá¿¡¼­ ±ú¾î³¯ °æ¿ì ¼ø°£ÀûÀ¸·Î IOCP ¸¦ ¸¸µé ¶§ ÁöÁ¤Çß´ø µ¿½Ã¼º ¼öÀÇ ¹üÀ§¸¦ ÃʰúÇÒ ¼ö ÀÖ´Ù. ÀÌÈÄ IOCP ´Â ´Ù½Ã µ¿½Ã ¾²·¹µåÀÇ ¼ö°¡ 2 °¡ µÇµµ·Ï Á¶ÀýÇÑ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î IOCP »ý¼º½Ã¿¡ ÁöÁ¤ÇØ ÁØ NumberOfConcurrentThreads ÀÇ ¼öº¸´Ù ½ÇÁ¦·Î ¸¹Àº ¿öÄ¿ ¾²·¹µå¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù.


6 IOCP ¸¦ ÀÌ¿ëÇÑ ¼­¹ö ±¸Çö½Ã ÁÖÀÇ»çÇ× #


¸¹Àº °³¹ßÀÚµéÀÌ ¹üÇÏ´Â ´ëºÎºÐÀÇ ½Ç¼ö´Â ¸ÖƼ ¾²·¹µå¿Í ºñµ¿±â ÀÔÃâ·ÂÀÇ ºÎÁ·ÇÑ ÀÌÇØ¿¡ ±âÀÎÇÑ´Ù. ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹Ö¸¸ ÇÏ´õ¶óµµ ¾î·Æ°í º¹ÀâÇѵ¥, ¿©±â¿¡ ºñµ¿±â ÀÔÃâ·Â±îÁö ´õÇØÁö´Ï ³×Æ®¿öÅ© °³¹ßÀÚµéÀÌ °ÞÀ» ±× È¥¶õÀº ÃæºÐÈ÷ ÁüÀÛÇÒ ¸¸ÇÏ´Ù. À̹ø¿£ IOCP ¸¦ ÀÌ¿ëÇØ ¼­¹ö ³×Æ®¿öÅ© Äڵ带 ±¸ÇöÇÒ ¶§ ƯÈ÷ ÁÖÀÇÇØ¾ß Á¡À» ¾Ë¾Æº¸±â·Î ÇÏÀÚ.

6.1 ¿¡·¯ Äڵ带 ¹Ýµå½Ã È®ÀÎÇÑ´Ù #


WSASend, WSARecv µîÀ» ÅëÇØ ¿À¹ö·¦µå I/O ¸¦ ÇÒ ¶§ Á¤»óÀûÀÎ °æ¿ì WSAEWOULDBLOCK À» ¸®ÅÏÇÑ´Ù. ±×·¯³ª ¿ø°Ý È£½ºÆ®°¡ Á¢¼ÓÀ» ²÷°Å³ª ( WSAECONNRESET ), °¡»ó ȸ¼±¿¡ ¹®Á¦°¡ ¹ß»ýÇßÀ» ¶§ ( WSAECONNABORTED ) ¿Í °°Àº ¹®Á¦´Â ºó¹øÈ÷ ¹ß»ýÇÑ´Ù. ÀÌ °æ¿ì º° ¼ö ¾øÀÌ ÀÌÂÊ¿¡¼­µµ Á¢¼ÓÀ» ²÷´Â ¼ö¹Û¿¡ ¾ø´Ù. °ñÄ¡ ¾ÆÇ ºÎºÐÀº WSAENOBUFS ¿Í °°Àº ¿¡·¯¸¦ ¸¸³ª´Â °æ¿ì´Ù. ´ÙÀ½ È£¿¡¼­ ±¸ÇöÀ» ÅëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸°ÚÁö¸¸, ½Ã½ºÅÛ ¸®¼Ò½º(Ä¿³Î ¸®¼Ò½º) Á¦ÇÑ¿¡ °É¸®°Ô µÇ¸é ¿À¹ö·¦µå I/O ´Â 'WSAENOBUFS ¿¡·¯' ¸¦ ³»¹ñÀ¸¸ç ½ÇÆÐÇÑ´Ù. ¸¶Âù°¡Áö·Î '±×³É Á¢¼ÓÀ» ²÷À¸¸é µÇ´Â °Í ¾Æ´Ï³Ä?' ¶ó°í ¹Ý¹®ÇϰÚÁö¸¸, ±×°ÍÀÌ Å¬¶óÀÌ¾ðÆ®°¡ ¾Æ´Ï¶ó ´ë·®ÀÇ Å¬¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇÑ »óȲ¿¡¼­ÀÇ ¼­¹ö°£ ¼Û¼ö½Å¿¡¼­ ¹ß»ýÇÏ´Â °ÍÀ̶ó¸é ´õ¿í ½É°¢ÇØÁø´Ù. ´ë·®ÀÇ Å¬¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇÑ »óȲ¿¡¼­´Â ¾ðÁ¦µçÁö ½Ã½ºÅÛ ¸®¼Ò½º°¡ ¹Ù´Ú³¯ ¼ö Àֱ⠶§¹®¿¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀ» ÀûÀýÈ÷ ºÐ»ê½Ãų ¼ö ÀÖ´Â ¸ÞÄ¿´ÏÁòÀÌ ÇÊ¿äÇϸç, ºÒ°¡ÇÇÇÑ °æ¿ì Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» Á¦ÇÑÇØ¾ß ÇÑ´Ù.

6.2 ÂüÁ¶ Ä«¿îÆ®¸¦ À¯ÁöÇÑ´Ù #


¿À¹ö·¦µå È£ÃâÀ» °É¾îµÎ°í, ¿Ï·á Å뺸¸¦ ¹Þ±âµµ Àü¿¡ ¿À¹ö·¦µå ¹öÆÛ³ª ¼ÒÄÏ °´Ã¼°¡ »èÁ¦µÇ¾î¼­´Â ¾ÈµÈ´Ù. ¶ÇÇÑ ÇÑ °´Ã¼¿¡ ´ëÇØ µÑ ÀÌ»óÀÇ ¿À¹ö·¦µå È£ÃâÀÌ ÀÖ´Â °æ¿ì¿£ ¹Ýµå½Ã ÂüÁ¶ Ä«¿îÆ®¸¦ À¯ÁöÇØ¾ß Çϸç, °´Ã¼¸¦ Á¦°ÅÇØ¾ß ÇÏ´Â °æ¿ì¿¡ ÀÌ ÂüÁ¶ Ä«¿îÆ®°¡ 0 ÀÎÁö È®ÀÎÇØ¾ß ÇÑ´Ù. ÂüÁ¶ Ä«¿îÆ®¸¦ À¯ÁöÇÏÁö ¾Ê°í ¿Ï·á Å뺸°¡ ¾ÆÁ÷ ´õ ³²¾ÆÀÖ´Â »óÅ¿¡¼­ °´Ã¼¸¦ »èÁ¦Çϸé, ´ç¿¬ÇÑ °ÍÀÌÁö¸¸ ±× ´ÙÀ½ ¿Ï·á Å뺸½Ã ¾û¶×ÇÑ ¸Þ¸ð¸® À§Ä¡¸¦ ( IOCP ·Î ¸»ÇÏÀÚ¸é CompletionKey ³ª OverlappedPointer ) °¡¸®ÄÑ Å©·¡½Ã¸¦ ¹ß»ý½ÃŲ´Ù. ¿øÀÎÀ» ¸ð¸£°í °´Ã¼°¡ »èÁ¦µÈ °Í¿¡ ºÐ°³ÇØ Á¤Àû ¸Þ¸ð¸® °ü¸® µîÀ¸·Î ´çÀå ±ÞÇÑ ºÒÀ» ²ô´Â °ÍÀº ±Ùº»ÀûÀÎ ÇØ°áÃ¥ÀÌ µÉ ¼ö ¾ø´Ù.

6.3 µ¥µå¶ôÀ» ÁÖÀÇÇÑ´Ù #


IOCP ÀÇ ¿öÄ¿ ¾²·¹µå¸¸À» ÀÌ¿ëÇØ ¼­ºñ½º Äڵ带 ±¸ÇöÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÒ »çÇ×ÀÌ ÀÖ´Ù. ÁÖ·Î »ùÇà ¼Ò½º·Î ¾²ÀÌ´Â ¿¡ÄÚ ( echo ) ¼­¹ö³ª, ½ÇÁ¦·Î IOCP ·Î ±¸ÇöµÇ¾î ÀÖ´Â IIS ( Internet Information Server ) ¿Í °°Àº ¼­¹ö´Â °´Ã¼°£ »óÈ£ ÂüÁ¶°¡ ¹ß»ýµÇÁö ¾Ê¾Æ ÀÌ·¯ÇÑ ¹®Á¦´Â ¾ø´Ù. ±×·¯³ª äÆÃ ¼­¹ö¿Í °°Àº »óÈ£ ÂüÁ¶ ( Áï, ÇÑ °´Ã¼°¡ ´Ù¸¥ °´Ã¼¿¡ Á÷Á¢ÀûÀÎ Á¢±ÙÀÌ ÀϾ´Â °Í ) °¡ ¹ß»ýÇÏ´Â ¼­ºñ½º¿¡¼­´Â ¾ç¹æÇâ »óÈ£ ÂüÁ¶°¡ µ¿½Ã¿¡ ÀϾ´Â °æ¿ì¿¡ µ¥µå¶ô ( dead-lock ) ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ µ¿±âÈ­¿¡ °¢°íÀÇ ³ë·ÂÀ» ±â¿ï¿©¾ß Çϸç, À̰ͺ¸´Ù´Â ÆÐŶÀ» ó¸®ÇÏ´Â Àü¿ë ¾²·¹µå¸¦ µû·Î µÎ¾î ÀϰýÀûÀ¸·Î ó¸®ÇÏ´Â ¹æ¹ýÀ» ±ÇÇÑ´Ù.


7 ´Ù¿î·Îµå #


8 °ü·Ã¸µÅ© #




SubCategoryNetwork

EditText|FindPage|DeletePage|LikePages| Valid XHTML 1.0! Valid CSS! powered by MoniWiki