Socket Programming
 FrontPage|FindPage|TitleIndex|RecentChanges|UserPreferences E D R S P I M H RSS

FrontPageSimpleModelEditor › Socket Programming
Contents:
1 Socket ÇÁ·Î±×·¡¹Ö ¹æ½Ä¿¡ ´ëÇÑ ÀÌÇØ
1.1 Blocking/Non-Blocking ¹æ½Ä
1.1.1 Blocking mode
1.1.2 Non-Blocking mode
1.1.3 Blocking mode ¿Í Non-Blocking mode ÀÇ Àüȯ
1.2 Overlapped I/O ¹æ½Ä ( Asynchronous ¹æ½Ä )
1.2.1 Overlapped I/O ÀÇ ÀÌÇØ
1.2.2 Polling ¹æ½Ä
1.2.3 Block ÇØ¼­ ´ë±âÇÏ´Â ¹æ½Ä
1.2.4 I/O completion routine À» »ç¿ëÇÏ´Â ¹æ½Ä
1.2.5 I/O completion port ¸¦ »ç¿ëÇÏ´Â ¹æ½Ä
2 Socket ¼­¹ö¸¦ ¸¸µé¶§ À¯ÀÇ»çÇ×
2.1 Send buf/Recv buf size ¸¦ 0·Î ³õ´Â ¹æ¹ý
2.2 page lock limit°ú Non-paged pool limit
2.3 ¸î°³ÀÇ thread¸¦ ¾µ °ÍÀΰ¡
2.4 ¾ÈÁÁÀº ¼­¹ö°¡ °¡Áö´Â ¸î°¡Áö °æÇâ
3 ±âŸ Âü°í »çÇ×


1 Socket ÇÁ·Î±×·¡¹Ö ¹æ½Ä¿¡ ´ëÇÑ ÀÌÇØ #


1.1 Blocking/Non-Blocking ¹æ½Ä #


1.1.1 Blocking mode #


¼ÒÄÏ ÇÔ¼ö È£Ãâ½Ã ±× ÇÔ¼öÀÇ ÇØ´ç ±â´ÉÀ» ¿ÏÀüÈ÷ ¼öÇàÇÏ¿´°Å³ª, ½ÇÆÐÇÏ¿´À» °æ¿ì¿¡¸¸ Return µÇ´Â ¹æ½ÄÀ¸·Î ¼öÇàÀÌ ¿Ï·áµÉ ¶§±îÁö ´ë±âÇÏ°Ô µÇ¹Ç·Î Blocking ¹æ½ÄÀ̶ó°í ºÎ¸¥´Ù.

  • ÀåÁ¡
    • °á°ú¸¦ ¹Ù·Î ¾Ë¼ö ÀÖÀ¸¹Ç·Î »ç¿ëÇÏ±â ÆíÇÏ´Ù. µû¶ó¼­ ´©±¸³ª ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.
  • ´ÜÁ¡
    • ³×Æ®¿÷¿¡ ÀÌ»óÀÌ »ý±â°Å³ª, Ŭ¶óÀÌ¾ðÆ®¸¦ ³²ÀÌ Â®´Âµ¥ ÆÐŶ ±æÀ̰¡ Ʋ¸®¸é °ñ¶§¸°´Ù. ¿¡·¯ ó¸®ÇϱⰡ Áö¶öÀε¥´Ù°¡, ±âµÑ¸®´Â µ¿¾È µýÁþÀ» ¸øÇؼ­ ºñÈ¿À²ÀûÀÌ´Ù. ÀÌ·±°É·Î ¼­¹ö®´Ù°¡´Â À߸øÇϸé Ŭ¶óÀÌ¾ðÆ® ¹é°³µµ ¸ø¹Þ´Â´Ù. ¾Æ´Ï¸é thread°¡ ¹é°³°¡ ³Ñ¾î°£´Ù.! º¸Åë Ãʺ¸ÀÚ¿ë ȤÀº, ´ëÃæ µ¹°Ô¸¸ ¸¸µå´Â Ŭ¶óÀÌ¾ðÆ®¿ëÀ¸·Î »ç¿ëÇÑ´Ù. ±î³õ°í ¸»Çϸé unix¿¡¼­´Â ´ë°³ ÀÌ·±°É·Î ¼­¹ö¸¦ ¸¸µç´Ù. ±Ùµ¥.. ±×·¡µµ Àßµ¹¾Æ°£´Ù... unix°¡ ÁÁ´Ù.!!
  • »ç¿ëµÇ´Â ÇÔ¼ö
    • °¢Á¾ winsock functionµé. default°¡ Blocking mode·Î »ý¼ºµÇ¹Ç·Î ±×³É ¾²¸é µÈ´Ù. ÁÖ·Î select¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÇÏ°Ô µÈ´Ù.

1.1.2 Non-Blocking mode #


¼ÒÄÏ ÇÔ¼ö°¡ Áï½Ã ¼öÇà°¡´ÉÇÒ °æ¿ì¿¡¸¸ ¼öÇàÀ» ÇÏ°í ¾Æ´Ò °æ¿ì´Â ½ÇÆÐ·Î Return ÇÏ´Â ¹æ½ÄÀ¸·Î Connect¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ÇÔ¼ö¿¡¼­ WSAEWOULDBLOCK ÀÌ ³¯ °æ¿ì Retry ¸¦ ÇÏ¿©¾ß ÇÑ´Ù.

  • ÀåÁ¡
    • Event ȤÀº Message Driven ¹æ½ÄÀ¸·Î ÄÚµùÀ» ÇØ¾ß µÇ¹Ç·Î Á» À־ÀδÙ. ÀÌ Á¤µµ¸¸ µÅµµ Àß µ¹¾Æ°¡´Â ¼­¹ö¸¦ © ¼ö ÀÖ´Ù. ¹Ø¿¡ ¾²´Â ¹æ½Ä¿¡ ºñÇØ¼­´Â ¹«Áö ½±´Ù. Thread ÇѰ³·Îµµ ¼­¹ö°¡ ¸¸µé¾îÁø´Ù.
  • ´ÜÁ¡
    • ÁøÂ¥ Thread ÇѰ³·Î ¼­¹ö ¸¸µé¸é ¹«Àð°Ô ´À¸®°í ¿å¸Ô´Â ¼­¹ö°¡ ³ª¿Ã È®·üÀÌ Å©´Ù. ¹Ø¿¡ ³ª¿À´Â °Íµé¿¡ ºñÇØ ¾ø¾îº¸ÀδÙ. ¸Ç³¯ ³ª¿À´Â WSAEWOULDBLOCK ó¸®ÇϱⰡ ±ÍÂú´Ù.
  • »ç¿ëµÇ´Â ÇÔ¼ö
    • À§¿Í µ¿ÀÏÇϰí, WSAEventSelect / WSAEnumNetworkEvents ³ª WSAAsyncSelect / WSAGETSELECTERROR / WSAGETSELECTEVENT ¸¦ »ç¿ëÇÑ´Ù.

1.1.3 Blocking mode ¿Í Non-Blocking mode ÀÇ Àüȯ #


Socket Àº ±âº»ÀûÀ¸·Î Blocking mode·Î »ý¼ºÀÌ µÈ´Ù. WSAAsyncSelect, WSAEventSelect ¸¦ »ç¿ëÇϸé ÀÚµ¿ÀûÀ¸·Î Non-Blocking mode ·Î ÀüȯÀÌ µÇ¸ç, ioctlsocket, WSAIoctl µîÀ¸·Î Blocking/Non-Blocking ÀÇ ÀüȯÀÌ °¡´ÉÇÏ´Ù.

1.2 Overlapped I/O ¹æ½Ä ( Asynchronous ¹æ½Ä ) #


1.2.1 Overlapped I/O ÀÇ ÀÌÇØ #


Overlapped I/O ¶õ ¼ÒÄÏ ÇÔ¼ö È£Ãâ°ú ±× °á°úÀÇ È®ÀÎÀÌ ºÐ¸®µÇ¾îÀÖ´Â ÇüŸ¦ ¸»ÇÑ´Ù. Áï, ÇÔ¼öÀÇ È£ÃâÀº ½Ã½ºÅÛ¿¡ ´ëÇÑ ¿äûÀ¸·Î °£ÁÖµÇ¸ç ¿äûÀÌ Á¢¼öµÈ Áï½Ã ±× °á°ú¿¡ »ó°ü¾øÀÌ Return ÇÏ°Ô µÈ´Ù. À̶§ ÇÔ¼öÀÇ ±â´ÉÀÌ ¼öÇà°¡´ÉÇÑ »óÅ¿¡ ÀÖÀ» °æ¿ì ±× °á°ú¸¦ Áï°¢ ¾Ë ¼ö ÀÖÁö¸¸, ±×·¸Áö ¾ÊÀ» °æ¿ì ÃßÈÄ¿¡ °á°ú¸¦ È®ÀÎÇÏ°Ô µÈ´Ù. ÀÌ·¸°Ô °á°ú¸¦ È®ÀÎÇÏ´Â ¹æ½Ä¿¡ µû¶ó ´ÙÀ½°ú °°ÀÌ ±¸ºÐµÇ±âµµ ÇÑ´Ù.

  • »ç¿ë ÇÔ¼ö
    • Socket À» ¸¸µé¶§ Overlapped FlagÀ» Set ÇØ¼­ ¸¸µç´Ù. °¢Á¾ Socket Function À» »ç¿ëÇÒ ¶§ Overlapped ±¸Á¶Ã¼³ª Callback Function À» ³Ñ°ÜÁ༭ »ç¿ëÇÑ´Ù. Overlapped ±¸Á¶Ã¼¸¦ »ç¿ëÇÒ °æ¿ì´Â ³Ñ°ÜÁØ ±¸Á¶Ã¼¿¡ ÇØ´çÇÏ´Â I/O °¡ ³¡³µ´ÂÁö¸¦ HasOverlappedIoCompleted ¸¦ ÅëÇØ¼­ È®ÀÎÈÄ Áö¿ì´øÁö ÇØ¾ß ÇÑ´Ù.

1.2.2 Polling ¹æ½Ä #


°á°ú°¡ ³ª¿Ã¶§±îÁö °á°ú¸¦ È®ÀÎÇÏ´Â Function À» È£ÃâÇÏ´Â ¹æ½ÄÀ¸·Î À̶§ °è¼ÓÇØ¼­ WSAGetOverlappedResult Function À» »ç¿ëÇÑ´Ù. ¸¸ÀÏ °á°ú°¡ ³ª¿Ã ¶§±îÁö ´ë±âÇϵµ·Ï ¼³Á¤Çϸé Block ÇØ¼­ ´ë±âÇÏ´Â ¹æ½Ä°ú ºñ½ÁÇÏ´Ù.

  • ÀåÁ¡
    • Ưº°ÇÑ ÀåÁ¡Àº ¾øÀ¸¸ç ¾Æ¸¶µµ Context Switching À» ¹æÁöÇϱâ À§Çؼ­ ¾µ ¼öµµ ÀÖ°Ú´Ù.
  • ´ÜÁ¡
    • ÀÏ´Ü ¹«½ÄÇØº¸ÀδÙ. Thread ÇѰ³·Î ¿©·¯°³ °á°ú È®ÀÎÇϱⰡ ¾Ö¸Å¸ðÈ£ÇÏ´Ù. ¾ðÁ¦ ±×°É ´Ù ºÒ·¯º¸°í ÀÖ³Ä.
  • »ç¿ë ÇÔ¼ö
    • WSAGetOverlappedResult ¸¦ °á°ú È®Àο¡ »ç¿ë.

1.2.3 Block ÇØ¼­ ´ë±âÇÏ´Â ¹æ½Ä #


Overlapped ±¸Á¶Ã¼¿¡ »ç¿ëÇÑ Event ¸¦ WaitForMultipleObjects ³ª WaitForSingleObject ·Î ´ë±âÇÏ´Â ¹æ½Ä.

  • ÁÖÀÇ
    • À̶§ »ç¿ëµÈ event´Â manual resetÀ¸·Î »ý¼ºµÈ event¿©¾ß¸¸ ÇÑ´Ù.
  • ÀåÁ¡
    • ±×·¡µµ ÀÌÁ¤µµ µÇ¸é »ó´çÈ÷ À־ÀδÙ. threadµµ ¿©·¯°³ ¾²°í.. Àß Â¥¸é ¾Æ¹«µ¥¼­³ª È£ÃâÇϰí thread ÇѰ³·Î °á°ú¸¦ ¹Þ¾Æº¼ ¼ö ÀÖ´Ù. Á¶±Ý ½Å°æ½á¼­ thread pool ÀÌ¶óµµ ¸¸µé¾î³õÀ¸¸é ³²µéÀÌ ÄÚµù ÀßÇÑ´Ù°í »ý°¢ÇÑ´Ù. IOCP¸¸ »©°í´Â ÃÖ°­ÀÇ solutionÀÌ µÉ È®·üÀÌ ¹«Áö Å©´Ù. IOCPº¸´Ù´Â Á¶±Ý »ý°¢ÇÒ°Ô Àû¾îÁú ¼ö ÀÖ´Ù.
  • ´ÜÁ¡
    • ¾Ï¸¸Çصµ Âɰ£ ¾î·Æ´Ù. function ÇѰ³°¡Áö°í ±â´Ù¸±¼ö ÀÖ´Â event°¡ 64°³·Î Á¦ÇѵǾî ÀÖÀ¸´Ï±ñ thread ÇѰ³·Î ó¸®Çϱâ´Â ¹«¸®´Ù. ¼Ò½º°¡ º¹ÀâÇØÁö±â ½Ê»óÀ̶ó.. Á»¸¸ Áö³ª¸é Àڱ⵵ ¾î¶»°Ô ®´ÂÁö ±â¾ïÀÌ ¾È³­´Ù..comment ¾Ï¸¸ ÀßÇØºÁ¶ó..±â¾ï³ª³ª..
  • »ç¿ë function
    • overlapped ±¸Á¶Ã¼¿¡ ³Ñ°ÜÁØ event¸¦ ´ë±âÇÏ´Â functionµéÀ» »ç¿ë.

1.2.4 I/O completion routine À» »ç¿ëÇÏ´Â ¹æ½Ä #


Overlapped±¸Á¶Ã¼¿¡ completion functionÀ» ÁöÁ¤ÇÏ¿© callbackÀ» ¹Þ´Â ¹æ½Ä. À̶§ Callback Àº APC °¡ »ç¿ëµÇ°í APC ´Â calling thread ÀÇ context¸¦ »ç¿ëÇϱ⠶§¹®¿¡ calling thread´Â alertable wait state¿¡ ÀÖ¾î¾ß ÇÑ´Ù.

  • Âü°í
    • alertable state·Î µé¾î°¡±â À§Çؼ­ »ç¿ëµÇ´Â function¿¡´Â SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx, or WaitForSingleObjectEx function µîÀÌ ÀÖ´Ù.
  • Âü°í
    • Overlapped ±¸Á¶Ã¼¿¡ event ¿Í completion routine À» µ¿½Ã¿¡ Á¦°øÇß´Ù¸é completion routine ¸¸ È£ÃâµÈ´Ù.
  • ÁÖÀÇ
    • completion routine À» »ç¿ëÇÏ´Â I/O¿¡ ´ëÇØ¼­´Â WSAGetOverlappedResult ¸¦ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.
  • ÀåÁ¡
    • À¢ ÀåÁ¡..³­ µµ´ëü°¡ APC¶õ ³ðÀÌ Èñ¾ÈÇÏ´Ù.. ÀÌ°Ô ÁøÂ¥ ¾µ¸ð°¡ ÀÖ±â´Â Àִ°ǰ¡..¾î·µç IO¸¦ ¿©·¯°³ °É°í ³ªÁß¿¡ °á°ú¸¦ ¹ÞÀ» ¼ö ÀÖ±â´Â ÇÏ´Ù.
  • ´ÜÁ¡
    • ÀÌ·±°É·Î ¼­¹ö¸¦ Â¥´Â »ç¶÷ÀÌ ½Å±âÇÏ´Ù. ³»°¡ Ȥ½Ã ¹Ùº»°¡.. µµ´ëü I/OÇÑ thread¿¡¼­ ¹«Á¶°Ç ±â´Ù·Á¾ß µÇ¸é ÄÚµù ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ Á¦ÇѵÇÁö ¾Ê³ª! ´õÀÌ»óÀº ¾ê±âÇϱ⠽ȴÙ.
  • »ç¿ë ÇÔ¼ö
    • WSAOVERLAPPED_COMPLETION_ROUTINE À» »ç¿ëÇϰí, alertable wait state·Î ºüÁú¼ö ÀÖ´Â functionµéÀ» »ç¿ë.

1.2.5 I/O completion port ¸¦ »ç¿ëÇÏ´Â ¹æ½Ä #


I/O completion port ¶õ ÀÏÁ¾ÀÇ notification message queue ÀÌ´Ù. Áï °á°ú°¡ message queue ó·³ port·Î µé¾î¿À°í, ±× port¿¡ ´ë±âÇϰí ÀÖ´Â thread¿¡¼­ ±× °á°ú¸¦ ó¸®ÇÏ´Â ¹æ½ÄÀÌ´Ù. ¸ðµç Socket¿¡¼­ ¹ß»ýÇÏ´Â event¸¦ port¿¡¼­ ¹Þ¾Æº¸°í ó¸®ÇÏ´Â ¹æ½ÄÀÌ´Ù.

  • ÀåÁ¡
    • ÇöÁ¸ÇÏ´Â window platform¿¡¼­ÀÇ ÃÖ°­ ¼­¹ö¸ðµ¨ÀÌ´Ù. À̰ɷΠ¼­¹öÂ¥¸é ³²µéÀÌ ¿ì·¯·¯º»´Ù. ¼ÒÄÏÀ¸·Î´Â raw Socket»©°í´Â °¥µ¥±îÁö ´Ù °¡º»»ç¶÷À̶ó°í ÀÎÁ¤¹Þ´Â´Ù. (¹°·Ð driver ±îÁö °¡´Â°Å »©°í.. applicationÀ¸·Î¸¸). ½ÇÁ¦ ¿£°£È÷¸¸ Â¥³öµµ ÁøÂ¥ Àßµ¹¾Æ°£´Ù. Ŭ¶óÀÌ¾ðÆ® ¹«Àð°Ô ºÙ¿©µµ ²ô´ö¾ø´Ù..ÈǸ¢ÇÏ´Ù.
  • ´ÜÁ¡
    • ÀåÁ¡ÀÌ ÀåÁ¡Àθ¸Å­ Â¥±â°¡ ±«·Ó´Ù. Çѹø ¹÷³ª¸é ´Ù½ÃÂ¥°í ½Í¾îÁø´Ù. Á» Áö³ª¼­ »õ·Î¿î ±â´É ³ÖÀ»·Á¸é ÁøÂ¥ »õ·ÎÂ¥°í ¸¸´Ù. °°Àº ¸»ÀÌÁö¸¸ ÇÑÂü Áö³ª¸é ¾Æ¹«»ý°¢µµ ¾È³­´Ù. À̰г»°¡Â§°Å ¸Â¾î?¶ó°í ³²µé¿¡°Ô ¹°¾îºÁ¾ßµÈ´Ù. 95/98/ME¿¡¼­´Â Àý´ë ¾Èµ¹¾Æ°£´Ù.(À½.. ÀÌ°Ç º°·Î ´ÜÁ¡ÀÌ ¾Æ´Ñµ¥..)
  • »ç¿ë ÇÔ¼ö
    • CreateIoCompletionPort, GetQueuedCompletionStatus, PostQueuedCompletionStatus µîÀ» »ç¿ë.
  • ¹®¼­¿¡ ³ª¿Â ÀåÁ¡
    1. runnable thread count¸¦ Á¦ÇÑÇÑ´Ù. port¿¡ ¿¬°áµÈ runnable threadÀÇ °¹¼ö°¡ concurrency value¿¡ µµ´ÞÇϸé systemÀº ´õÀÌ»óÀÇ runnable thread°¡ ¾øµµ·Ï blockÇÑ´Ù. Áï port¿¡ event°¡ queueµÇ´õ¶óµµ, GetQueuedCompletionStatus·Î ´ë±âÇϰí ÀÖ´Â thread¸¦ ±ú¿ìÁö ¾Ê´Â´Ù´Â ¶æÀÌ´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀ» ÅëÇØ context switchingÀ» ÃÖ¼ÒÇѵµ·Î Á¦ÇÑÇÒ ¼ö ÀÖ´Ù. ¿¹¿ÜÀûÀ¸·Î concurrentcy value¸¦ ÀϽÃÀûÀ¸·Î ³Ñ¾î°¡´Â °æ¿ì°¡ »ý±â´Âµ¥ À̶§´Â runnable thread°¡ ´Ù¸¥ io ȤÀº ±âŸ ÀÌÀ¯¶§¹®¿¡ (GetQueuedCompletionStatus¸»°í) blockµÆÀ» °æ¿ìÀÌ´Ù. ÀÌ·² °æ¿ì´Â systemÀÌ ´ÙÀ½¿¡ ´ë±âÁßÀÎ thread¸¦ runnable·Î ¸¸µé°í, ÃßÈÄ¿¡ concurrency value¸¦ ¸ÂÃß°Ô µÈ´Ù.
    2. GetQueuedCompletionStatus·Î threadµéÀÌ ´ë±âÇÒ¶§ ±× ´ë±âµÇ´Â ¹æ½ÄÀÌ LIFO(Last In First Out)¹æ½ÄÀ» ÃëÇÑ´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ÀÏÀ» ¸¹ÀÌÇÏ´Â thread´Â °è¼Ó ÀÏÀ» ÇÏ°Ô µÇ°í (¿ª½Ã context switchingÀÌ Àû¾îÁú È®·üÀÌ ³ô¾ÆÁü) ¶Ç ³ë´Â thread´Â °è¼Ó ³î°Ô µÊÀ¸·Î½á systemÀÌ ±× thread°¡ Â÷ÁöÇϰí ÀÖ´Â resource¸¦ page outÇÒ¼ö ÀÖ°Ô µÈ´Ù.
    3. ¿©·¯°³ÀÇ I/O¿¡ °ü·ÃµÈ event¸¦ ÇϳªÀÇ object¸¦ ÅëÇØ¼­ ¹Þ¾Æº¼ ¼ö ÀÖ°Ô µÊÀ¸·Î½á thread poolÀÇ »ç¿ëÀ» ½±°Ô ¸¸µé¾ú´Ù.

2 Socket ¼­¹ö¸¦ ¸¸µé¶§ À¯ÀÇ»çÇ× #


2.1 Send buf/Recv buf size ¸¦ 0·Î ³õ´Â ¹æ¹ý #


±âº»ÀûÀ¸·Î transport¿¡¼­´Â buffer°¡ Á¦°øµÇ°í, sendÇÒ¶§´Â user buffer°¡ ÀÌ transport buffer ·Î copy µÈ ÈÄ¿¡ ¹ß¼ÛÀÌ µÇ¸ç, recvÇÒ ¶§µµ, transport buffer¿¡ ¿ì¼± data°¡ Âù ÀÌÈÄ¿¡ user buffer·Î copy°¡ µÈ´Ù. ÀÌ copy ¸¦ ÁÙ¿©º¸±â À§Çؼ­ transportÀÇ send buffer¸¦ 0·Î ³õÀ¸¸é user°¡ Á¦°øÇÑ buffer¸¦ »ç¿ëÇØ¼­ Á÷Á¢ ¹ß¼ÛÀ» ÇÏ°Ô µÇ¹Ç·Î ¾à°£ÀÇ ½Ã°£À» ÁÙ¿©º¼ ¼ö ÀÖ´Ù. ´Ü À̶§ transport°¡ user buffer¸¦ »ç¿ëÇØ¾ß Çϱ⠶§¹®¿¡ Àü¼ÛÀÌ ´Ù ³¡³ª±â Àü±îÁö´Â ÀÌ buffer¿¡ ¾î¶°ÇÑ user ÀÛ¾÷µµ °¡ÇØÁ®¼­´Â ¾ÈµÇ¸ç À̶§ »ç¿ëµÇ´Â memory page´Â lockÀÌ °É¸®°Ô µÇ°í, ¸¹Àº ¼öÀÇ send°¡ µ¿½Ã¿¡ ÁøÇàµÉ °æ¿ì page lock limit¿¡ µµ´ÞÇÒ °¡´É¼ºÀÌ »ý±â°Ô µÈ´Ù. recv buffer¸¦ 0·Î ³õ´Â °æ¿ì´Â ¹Ì¸® ÃæºÐÇÑ ¼ýÀÚÀÇ buffer¸¦ Á¦°øÇØ ³õÁö ¾ÊÀ» °æ¿ì, Áï data°¡ µé¾î¿À´Âµ¥ »ç¿ëÇÒ buffer°¡ ¾øÀ» °æ¿ì´Â transportÀÇ ¹Ø´Ü¿¡¼­ buffer·Î ¹Þ¾Æ³õ°Ô µÇ¹Ç·Î ´Ù½Ã user buffer·Î copy°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. °á±¹ IOCP¹æ½ÄÀ» ¾²¸é¼­ recv buffer¸¦ ¹Ì¸® ÀÜ¶à °É¾î³õ´Â ¹æ½ÄÀÌ ¾Æ´Ï°í¼­´Â ±»ÀÌ »ç¿ëÇÒ ÀÌÀ¯°¡ ¾ø°Ô µÇ¸ç, send buffer¸¦ 0À¸·Î ³õÀ» °æ¿ì¿Í ¸¶Âù°¡Áö·Î page lock µî¿¡ ½Å°æÀ» ½á¾ß ÇϹǷΠ±×´ÙÁö ÀÚÁÖ »ç¿ëµÇÁö ¾Ê´Â ¹æ¹ýÀÌ´Ù.

2.2 page lock limit°ú Non-paged pool limit #


À§¿¡¼­ ¹àÇûµíÀÌ Send buffer³ª receive buffer¸¦ 0·Î ³õ¾ÒÀ» °æ¿ì, user buffer ÀÇ memory °¡ physical memory¿¡ lock µÈ´Ù. µû¶ó¼­ concurrentÇÑ send/receive°¡ ¸¹ÀÌ ¹ß»ýÇÒ °æ¿ì ERROR_INSUFFICIENT_RESOURCES°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ·± »óȲÀ» ¹æÁöÇϱâ À§Çؼ­ user buffer¸¦ µÇµµ·Ï page boundary¿¡ ¸Âµµ·Ï ¸¸µé Çʿ䰡 ÀÖ´Ù. SocketÀÇ creationÀ̳ª, binding, connectingÀÌ ÀϾ¶§ OS´Â Non-paged pool¿¡¼­ ÀÏÁ¤·®ÀÇ memory¸¦ ÇÒ´çÇÑ´Ù. ¶ÇÇÑ I/O ÀÚüµµ ¾à°£ÀÇ memory¸¦ ¼ÒºñÇÑ´Ù. ÀÌ ¸Þ¸ð¸® ÇÒ´çÀÌ ¾î´À ¼öÁØÀ» ³Ñ¾î°¡¸é ¹®Á¦°¡ »ý±â°Ô µÈ´Ù.

2.3 ¸î°³ÀÇ thread¸¦ ¾µ °ÍÀΰ¡ #


°¡Àå ÀÌ»óÀûÀÎ case´Â thread°¡ ½¬Áö ¾Ê°í °è¼Ó µ¹µµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. º¸Åë ±ÇÀåµÇ´Â thread°¹¼ö´Â CPU ´ç ÇѰ³°¡ ±ÇÀåµÈ´Ù. ±×·¯³ª ½ÇÁ¦·Î´Â thread°¡ ¿äûÀ» ¹Þ¾Æ¼­ ±× ¿äûÀ» ó¸®ÇÏ´Â ½Ã°£°ú, ¿äûÀÌ µé¾î¿À´Â ºóµµ¼ö¸¦ °°ÀÌ °í·ÁÇØ¾ß¸¸ ÇÑ´Ù. thread°¡ ¿äûÀ» ó¸®Çϴµ¥ 1ÃÊÀÇ ½Ã°£ÀÌ °É¸®°í, ¿äûÀÌ 1ÃÊ ¸¶´Ù ÇѰ³¾¿ µé¾î¿Ã °æ¿ì¿Í, ¿äûÀÌ 1ÃÊ ¸¶´Ù µÎ°³¾¿ µé¾î¿Ã °æ¿ìÀÇ thread°¹¼ö°¡ °°À» ¼ö´Â ¾ø´Ù. °á±¹ ÀûÇÕÇÑ °¹¼ö¶ó´Â °ÍÀº °æÇèÄ¡¸¦ Àû¿ëÇÒ ¼ö ¹Û¿¡ ¾ø°Ô µÇ¸ç, thread°¹¼ö¸¦ ¹Ù²ã°¡¸é¼­ performance¸¦ ÃøÁ¤ÇÏ´Â ¹æ¹ý¹Û¿¡ ¾ø´Ù.

2.4 ¾ÈÁÁÀº ¼­¹ö°¡ °¡Áö´Â ¸î°¡Áö °æÇâ #


¼­¹ö°¡ ÀÛÀº packetÀ» ÀÚÁÖ º¸³»´Â °æ¿ì. ¾Æ¹«¸® ÀÛÀº packetÀÌ¶óµµ ±âº»ÀûÀÎ protocol overhead°¡ ÀÖ°í ±×·¯ÇÑ overhead°¡ ¸¹Àº ¼öÀÇ packetÀ¸·Î ÁõÆøÀÌ µÇ¸é »ó´çÈ÷ ´À¸° performanceÀÇ ¿øÀÎÀÌ µÈ´Ù. °¡´ÉÇÏ´Ù¸é ÀÛÀº packetµéÀ» ¸ð¾Æ¼­ Çѹø¿¡ ó¸®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¶Ç´Ù¸¥ °æ¿ì´Â ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®°£¿¡ ºÒÇÊ¿äÇÑ serializationÀÌ ¹ß»ýÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ¿¹·Î fileÀ» sendÇϴµ¥ ¸Å¹ø packetÇϳª¸¦ º¸³¾¶§¸¶´Ù reply¸¦ ¹Þ°Ô µÈ´Ù¸é ¾µ¸ð¾ø´Â packet°ú ±× packetÀÇ Àü¼Û/󸮿¡ µå´Â ½Ã°£ÀÌ ¹ß»ýÇϹǷΠ±×´ÙÁö È¿¿ë¼ºÀÌ ¾ø°Ô µÈ´Ù. ±×³É Âß º¸³»¹ö¸®µç°¡, ²À ÇÊ¿äÇÏ´Ù¸é ¸î°³¸¶´Ù Çѹø¾¿ ¹Þµµ·Ï ¹Ù²Ù´Â °ÍÀÌ ÁÁ´Ù. ¶Ç ÇѰ¡Áö °æ¿ì·Î ¾µµ¥¾øÀÌ Å« packetÀ» º¸³»´Â °æ¿ì°¡ ÀÖ°Ú´Ù. ¹¹ ´ë´ÜÇÑ ¾ÐÃà ·çÆ¾À» »ç¿ëÇ϶ó´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÏÀüÈ÷ ºÒÇÊ¿äÇÏ°Ô packetÀÇ size¸¦ ´Ã¸®´Â °ÍÀº networkÀÇ overhead¸¦ Áõ°¡½ÃÄѼ­ ¶Ç´Ù¸¥ ¹®Á¦¸¦ ¹ß»ý½ÃŲ´Ù. byte Çϳª¸¦ ¾µ¼ö ÀÖ´Â ³»¿ëÀ» stringÀ¸·Î Âß ´Ã¾î¼­ ¾´´ÙµçÁö ÇÏ´Â ¹æ¹ýÀÌ ±×·¸´Ù. ÃÖ¼ÒÇÑ packet structure¿¡ ºÒÇÊ¿äÇÑ ºÎºÐÀÌ ¾ø´ÂÁö Á¤µµ´Â °ËÁõÀ» Çϵµ·Ï ÇÏÀÚ. Çϳª ´õ ¾²ÀÚ¸é transaction¸¶´Ù connetionÀ» »õ·Î ¸Î°í ²÷´Â ¹æ½ÄÀÌ´Ù. tcp°¡ slow-start¹æ½ÄÀ» ÃëÇϰí ÀÖÀ¸¹Ç·Î, connectionÀ» »õ·Î ¸Î´Â µ¥´Â ±×¸¸ÇÑ ºÎÇϰ¡ °É¸°´Ù. ¶ÇÇÑ close¸¦ ÇÑ ÈÄ¿¡µµ tcb°¡ TIME_WAIT»óÅ·Πµé¾î°¡¼­ system resource¸¦ Àâ°í ÀÖÀ¸¹Ç·Î À̰͵µ ºÎ´ãÀÌ µÈ´Ù. ¹°·Ð persistent connectionÀ» »ç¿ëÇϴ°ͺ¸´Ù Â¥±â°¡ ½±°í, ¿¡·¯Ã³¸®Çϱ⵵ ½±´Ù´Â ÀåÁ¡ÀÌ ÀÖÁö¸¸, ¸¹Àº ¼öÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ »ó´ëÇØ¾ß µÉ °æ¿ì ¿ÀÈ÷·Á ¼­¹ö¿¡ ¾ÈÁÁÀº ¿µÇâÀÌ ³¢ÃÄÁö¹Ç·Î ¾à°£ ºÎ´ãÀÌ µÇ´õ¶óµµ connectionÀ» À¯ÁöÇϵµ·Ï Çϴ°ÍÀÌ ÁÁ´Ù.

3 ±âŸ Âü°í »çÇ× #

  1. Nagle algorithm
    nagle algorithmÀº slow network »ó¿¡¼­ÀÇ ÀÛÀº packetµé¿¡ ´ëÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ¸¸µé¾îÁø°ÍÀ¸·Î, ÇϳªÀÇ connection¿¡¼­ ÀÛÀº packetÀÌ ÇѰ³¸¸ Á¸ÀçÇÒ ¼ö ÀÖµµ·Ï ¸¸µå´Â algorithmÀÌ´Ù. ethernet»ó¿¡¼­ ÀÛ´Ù´Â ¸»Àº ´ë°³ 1500byteÀÌÇÏÀÇ packetÀ» ¸»ÇÑ´Ù.
  2. CAsyncSocket°ú CSocket
    MFC¿¡¼­ Á¦°øµÇ´Â CAsyncSocketÀº À§¿¡¼­ º» Non-Blocking SocketÀ» class·Î wrappingÇÑ °ÍÀÌ´Ù. À̶§ ³»ºÎÀûÀ¸·Î MFCÇÏ¿¡¼­ µ¹µµ·Ï ¸¸µé±â À§Çؼ­ hidden window°¡ Á¸ÀçÇÏ°Ô µÇ¸ç, ±âŸ ¸¹Àº ³»ºÎ º¯¼öµéÀ» °®°Ô µÈ´Ù. CSocketÀº CAsyncSocketÀ» Á» ´õ ¾²±â ÆíÇÏ°Ô ¸¸µç°ÍÀ¸·Î À§¿¡¼­ º» Blocking mode¿Í ºñ½º¹Ç¸®ÇÏ°Ô µ¿ÀÛÇϴµ¥, ½ÇÁ¦ Blocking mode¸¦ »ç¿ëÇÏ´Â °ÍÀº ¾Æ´Ï°í, ³»ºÎ¿¡¼­ loop¸¦ µ¹¸é¼­ ´ë±âÁß window messageÀÇ Ã³¸® ¹× Blocking modeó·³ ÀÛµ¿Çϵµ·Ï ÇÏ´Â ±â´ÉÀ» ÇØÁØ´Ù. »ç¿ëÇϱâ´Â Æí¸®ÇÏÁö¸¸, Winsock 1.1À» »ç¿ëÇϹǷΠ°í±Þ ±â¹ýÀ» ÀüÇô »ç¿ëÇÒ ¼ö ¾ø°í, ³»ºÎÀûÀ¸·Î ó¸®ÇÏ´Â ºÎºÐÀÌ ¸¹±â ¶§¹®¿¡ ¹«°Ì´Ù. ¶ÇÇÑ thread¸¦ ³Ñ³ªµé¶§´Â °á±¹ HANDLEÀ» ÀÌ¿ëÇØ¾ßÇϹǷÎ, ÀϹÝÀûÀ¸·Î °í¼ö¶ó ºÒ¸®´Â »ç¶÷µéÀº À̰͵éÀ» ¾²´Â°É ȸÇÇÇϱ⠸¶·ÃÀÌ´Ù. ´Ü Ŭ¶óÀÌ¾ðÆ®¸¦ °£´ÜÈ÷ ¸¸µé¾î »ç¿ëÇϰųª, MFCÀÇ ³»ºÎ¸¦ µé¿©´Ù º¸°í ½ÍÀº »ç¶÷, API¸¦ ¾î¶²½ÄÀ¸·Î class·Î ¸¸µé¾ú³ª º¸°í ½ÍÀº »ç¶÷µé¿¡°Ô´Â Âü°íÇÒ¸¸ÇÑ ¼Ò½º°¡ µÇ±âµµ ÇÑ´Ù.
  3. APC¶õ? (Asynchronous procedure call)
    APC¶õ thread context³»¿¡¼­ asynchronousÇÏ°Ô µ¹¾Æ°¡´Â functionÀÌ´Ù. °¢ thread´Â °¢ÀÚÀÇ APC queue¸¦ °¡Áö°í ÀÖÀ¸¸ç, ÀÌ queue¿¡ µé¾î°£ functionÀº thread°¡ alertable wait state·Î µé¾î°¥¶§ ¼öÇàµÈ´Ù. APC¸¦ queueÇϱâ À§ÇØ »ç¿ëµÇ´Â functionÀº QueueUserAPC ÀÌ´Ù.
  4. graceful shutdown
    SocketÀ» closeÇÏ´Â ¹æ½ÄÀº Å©°Ô µÎ°¡Áö·Î ³ª´µ´Âµ¥ ±×°ÍÀÌ ¹Ù·Î graceful shutdown°ú abortive shutdownÀÌ´Ù. µÎ°¡Áö ¹æ½ÄÀÇ Â÷ÀÌ´Â ¾Èº¸³»Áø data°¡ ÀÖÀ»°æ¿ìÀÇ Ã³¸®°¡ ´Ù¸¥°ÍÀε¥, graceful shutdownÀ» »ç¿ëÇÏ¸é ¸¶Áö¸· µ¥ÀÌÅͱîÁö ¼­·Î ÁÖ°í¹ÞÀ»¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¹Ý¸é, abortive shutdownÀ» »ç¿ëÇÒ °æ¿ì´Â ¾Èº¸³»Áø data´Â ¾ø¾îÁø´Ù. graceful shutdownÀÇ ¼ø¼­´Â ´ÙÀ½°ú °°´Ù.
    1. side A ´Â shutdown(SD_SEND)¸¦ ¼öÇà.
    						2. side B´Â FD_CLOSE¸¦ ¼ö½Å.
    						3. side B´Â ³ª¸ÓÁö º¸³¾ µ¥ÀÌÅ͸¦ º¸³¿.
    5'. side A´Â µ¥ÀÌÅ͸¦ ¼ö½Å.			4. side B´Â shutdown(SD_SEND)¸¦ ¼öÇà.
    5. side A ´Â FD_CLOSE¸¦ ¼ö½Å.			4'. closesocket ¼öÇà
    6. closesocket ¼öÇà.
    
    À§¿Í °°Àº ¹æ¹ýÀ» Á÷Á¢ »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì SO_LINGER optionÀ» »ç¿ëÇØ¼­ closesocketÀ» Á÷Á¢ ºÎ¸§À¸·Î½á, closesocket ³»ºÎ¿¡¼­ shutdownó¸® ¹× graceful shutdown 󸮸¦ ÇÏ°Ô ÇÒ ¼öÀÖ´Ù. ±ÇÀåµÇ´Â ¹æ¹ýÀº À§ÀÇ ¼ø¼­¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù.

SubCategoryNetwork

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