{"id":1663,"date":"2026-04-03T21:41:13","date_gmt":"2026-04-03T21:41:13","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=1663"},"modified":"2026-08-31T07:32:37","modified_gmt":"2026-08-31T07:32:37","slug":"c-%ec%84%9c%eb%b2%84-%ea%b5%ac%ec%a1%b0-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=1663","title":{"rendered":"C++ \uc11c\ubc84 \uad6c\uc870 \ud575\uc2ec \uc815\ub9ac"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uc758 \ubcf8\uc9c8\uc740 \uacb0\uad6d <strong>\uc694\uccad\uc744 \ubc1b\uace0, \ucc98\ub9ac\ud558\uace0, \uc751\ub2f5\ud558\ub294 \uac83<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Connection -&gt; Receive -&gt; Packet -&gt; Game Logic -&gt; Send -&gt; Client<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc5d0 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub3d9\uc2dc\uc5d0 \uc811\uc18d\ud558\uba74\uc11c I\/O\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ucc98\ub9ac\ud574\uc57c \ud558\ub294 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; TCP -&gt; Socket -&gt; I\/O Model -&gt; Session -&gt; Buffer -&gt; Packet -&gt; Game Logic -&gt; Send<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">TCP \uc11c\ubc84 \uae30\ubcf8 \ud750\ub984<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket -&gt; Bind -&gt; Listen -&gt; Accept -&gt; Client Socket -&gt; Recv \/ Send<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Listen Socket\uc740 \uc5f0\uacb0\uc744 \ubc1b\ub294 \uc6a9\ub3c4\uc774\uace0, \uc2e4\uc81c \ud1b5\uc2e0\uc740 Client Socket\uc744 \ud1b5\ud574 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Server -&gt; Listen Socket -&gt; Client Connection -&gt; Client Socket<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">TCP\uc640 Packet \ucc98\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TCP\ub294 Packet \ub2e8\uc704\uac00 \uc544\ub2c8\ub77c Byte Stream\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client Packet -&gt; TCP Stream -&gt; Receive Buffer -&gt; Packet Framing -&gt; Packet -&gt; Handler<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\ub098\uc758 Send\uac00 \ud558\ub098\uc758 Receive\ub85c \ub300\uc751\ub41c\ub2e4\ub294 \ubcf4\uc7a5\uc740 \uc5c6\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Send Packet A -&gt; TCP Stream -&gt; Receive A \uc77c\ubd80 -&gt; Receive A \ub098\uba38\uc9c0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Packet\uc774 \ud558\ub098\uc758 Receive\uc5d0 \ud569\uccd0\uc9c8 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Send A -&gt; Send B -&gt; TCP Stream -&gt; Receive A + B<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc77c\ubc18\uc801\uc778 Packet \ucc98\ub9ac \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Receive -&gt; Buffer \ucd94\uac00 -&gt; Header \ud655\uc778 -&gt; Packet Length \ud655\uc778 -&gt; \ub370\uc774\ud130 \ucda9\ubd84 \uc5ec\ubd80 \ud655\uc778 -&gt; Packet \ucd94\ucd9c -&gt; Handler<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Blocking Socket<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Blocking Socket\uc5d0\uc11c\ub294 I\/O \uc791\uc5c5\uc774 \uc644\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ud604\uc7ac Thread\uac00 \uae30\ub2e4\ub9b0\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>recv() -&gt; \ub370\uc774\ud130 \ub300\uae30 -&gt; \ub370\uc774\ud130 \ub3c4\ucc29 -&gt; \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0\ub9c8\ub2e4 Thread\ub97c \uc0ac\uc6a9\ud558\ub294 \uad6c\uc870\ub77c\uba74 \ub2e4\uc74c\ucc98\ub7fc \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client A -&gt; Thread A\nClient B -&gt; Thread B\nClient C -&gt; Thread C\nClient N -&gt; Thread N<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0 \uc218\uac00 \uc99d\uac00\ud558\uba74 Thread \uad00\ub9ac \ube44\uc6a9\uacfc Context Switching \ube44\uc6a9\uc774 \uc99d\uac00\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">IOCP<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Windows\uc5d0\uc11c\ub294 IOCP\ub97c \uc0ac\uc6a9\ud574 \ube44\ub3d9\uae30 I\/O\ub97c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec \ud750\ub984\uc740 \ub2e4\uc74c\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WSARecv() -&gt; I\/O \uc694\uccad -&gt; Windows -&gt; I\/O \ucc98\ub9ac -&gt; I\/O \uc644\ub8cc -&gt; IOCP -&gt; GetQueuedCompletionStatus() -&gt; Worker Thread -&gt; Packet \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">IOCP\uc758 \ud575\uc2ec\uc740 <strong>Completion<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>I\/O \uc694\uccad -&gt; I\/O \uc644\ub8cc -&gt; Completion Queue -&gt; Completion \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">IOCP \uc790\uccb4\uac00 Thread Pool\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; \uc644\ub8cc\ub41c I\/O \uc804\ub2ec -&gt; Worker Thread -&gt; \uc2e4\uc81c \uc791\uc5c5 \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">IOCP Overlapped I\/O<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ube44\ub3d9\uae30 I\/O \uc791\uc5c5\uc758 \uc0c1\ud0dc\ub97c <code>OVERLAPPED<\/code>\ub97c \ud1b5\ud574 \uad00\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WSARecv() -&gt; OVERLAPPED -&gt; Windows I\/O -&gt; I\/O \uc644\ub8cc -&gt; IOCP -&gt; OVERLAPPED \ud655\uc778 -&gt; Session \ud655\uc778 -&gt; IO Type \ud655\uc778 -&gt; \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ubc84\uc5d0\uc11c\ub294 I\/O \uc791\uc5c5 \uc815\ubcf4\ub97c \ud655\uc7a5\ud574\uc11c \uad00\ub9ac\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IO Context -&gt; OVERLAPPED + Session + Buffer + IO Type<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I\/O \uc885\ub958\ub294 \ub2e4\uc74c\ucc98\ub7fc \ub098\ub20c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Accept -&gt; Recv -&gt; Send<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">IOCP Worker \uad6c\uc870<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Worker Thread \uc5ec\ub7ec \uac1c\uac00 \ud558\ub098\uc758 IOCP\uc5d0\uc11c \uc644\ub8cc\ub41c \uc791\uc5c5\uc744 \uac00\uc838\uac08 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>I\/O Request -&gt; Windows -&gt; IOCP -&gt; Worker Thread -&gt; Packet Processing<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Worker\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Worker 1\nIOCP -&gt; Worker 2\nIOCP -&gt; Worker 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec \uad00\uacc4\ub294 \ub2e4\uc74c\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Completion \uc804\ub2ec\nWorker Thread -&gt; Completion \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Linux epoll<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Linux\uc5d0\uc11c\ub294 epoll\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec \ud750\ub984\uc740 IOCP\uc640 \ub2e4\ub974\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket -&gt; epoll_ctl() -&gt; Socket \uac10\uc2dc -&gt; I\/O \uac00\ub2a5 \uc0c1\ud0dc -&gt; epoll_wait() -&gt; Socket \ud655\uc778 -&gt; recv() \/ send()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">epoll\uc758 \ud575\uc2ec\uc740 <strong>Readiness<\/strong>\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket \ub4f1\ub85d -&gt; I\/O \uac00\ub2a5 \uc0c1\ud0dc \uac10\uc9c0 -&gt; Application \ud1b5\uc9c0 -&gt; Application\uc774 I\/O \uc218\ud589<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">IOCP\uc640 \ub2ec\ub9ac epoll\uc774 \ub370\uc774\ud130\ub97c \ub300\uc2e0 \uc77d\uc5b4\uc8fc\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll_wait() -&gt; Read \uac00\ub2a5 \ud655\uc778 -&gt; recv() -&gt; \ub370\uc774\ud130 \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">epoll Event Loop<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 epoll \uc11c\ubc84\ub294 Event Loop \uad6c\uc870\uc640 \ud568\uaed8 \uc0ac\uc6a9\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket \ub4f1\ub85d -&gt; epoll_wait() -&gt; Event \ud655\uc778 -&gt; Socket \ucc98\ub9ac -&gt; recv() \/ send() -&gt; Event Loop \ubc18\ubcf5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Socket\uc744 \ud558\ub098\uc758 Event Loop\uc5d0\uc11c \uac10\uc2dc\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket A -&gt; epoll\nSocket B -&gt; epoll\nSocket C -&gt; epoll\nSocket D -&gt; epoll<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc2e4\ud589 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll -&gt; \uc5ec\ub7ec Socket \uac10\uc2dc -&gt; I\/O \uac00\ub2a5 Socket \ud655\uc778 -&gt; \ud574\ub2f9 Socket \ucc98\ub9ac -&gt; \ub2e4\uc74c \uc774\ubca4\ud2b8 \ub300\uae30<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Non-blocking Socket<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">epoll\uc5d0\uc11c\ub294 \uc77c\ubc18\uc801\uc73c\ub85c Non-blocking Socket\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll_wait() -&gt; READ \uac00\ub2a5 -&gt; recv() -&gt; recv() -&gt; recv() -&gt; EAGAIN -&gt; \ud604\uc7ac \ucc98\ub9ac \uc885\ub8cc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 Edge Trigger \ubc29\uc2dd\uc5d0\uc11c\ub294 \uac00\ub2a5\ud55c \ub370\uc774\ud130\ub97c \ubaa8\ub450 \uc77d\ub294 \uad6c\uc870\uac00 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll_wait() -&gt; recv() \ubc18\ubcf5 -&gt; EAGAIN -&gt; Event \ucc98\ub9ac \uc885\ub8cc<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Level Trigger<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Level Trigger\uc5d0\uc11c\ub294 \uc870\uac74\uc774 \uacc4\uc18d \uc720\uc9c0\ub418\uba74 \uc774\ubca4\ud2b8\uac00 \ub2e4\uc2dc \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ub370\uc774\ud130 \ub3c4\ucc29 -&gt; EPOLLIN -&gt; \uc77c\ubd80 \ub370\uc774\ud130 \uc77d\uc74c -&gt; \ub370\uc774\ud130 \uc794\uc5ec -&gt; EPOLLIN -&gt; \ub0a8\uc740 \ub370\uc774\ud130 \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Edge Trigger<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Edge Trigger\uc5d0\uc11c\ub294 \uc0c1\ud0dc \ubcc0\ud654\uac00 \ubc1c\uc0dd\ud55c \uc2dc\uc810\uc744 \uae30\uc900\uc73c\ub85c \uc774\ubca4\ud2b8\ub97c \ubc1b\ub294\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ub370\uc774\ud130 \uc5c6\uc74c -&gt; \ub370\uc774\ud130 \ub3c4\ucc29 -&gt; EPOLLIN -&gt; recv() \ubc18\ubcf5 -&gt; EAGAIN<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c ET\uc5d0\uc11c\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c \ud750\ub984\uc774 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll_wait() -&gt; EPOLLIN -&gt; recv() \ubc18\ubcf5 -&gt; EAGAIN -&gt; \ub2e4\uc74c Event<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">IOCP\uc640 epoll<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\ub450 \uae30\uc220\uc758 \ud575\uc2ec \ucc28\uc774\ub294 \ub2e4\uc74c \ud558\ub098\ub85c \uc7a1\uc73c\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Completion\nepoll -&gt; Readiness<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc880 \ub354 \ud480\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; I\/O \uc694\uccad -&gt; OS \ucc98\ub9ac -&gt; I\/O \uc644\ub8cc -&gt; Completion \uc804\ub2ec -&gt; Application \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll -&gt; Socket \uac10\uc2dc -&gt; I\/O \uac00\ub2a5 -&gt; Application \ud1b5\uc9c0 -&gt; Application\uc774 I\/O \uc218\ud589<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc804\uccb4 \ud750\ub984\uc744 \ube44\uad50\ud558\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Async I\/O Request -&gt; OS -&gt; Completion -&gt; Worker -&gt; Processing<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll -&gt; Socket Monitoring -&gt; Readiness -&gt; epoll_wait() -&gt; recv \/ send -&gt; Processing<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">I\/O \ubaa8\ub378\uacfc \uc2e4\ud589 \uad6c\uc870<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \uc911\uc694\ud55c \uad6c\ubd84\uc774 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IOCP\uc640 epoll\uc740 OS\uc758 I\/O \ubaa8\ub378\uc774\uace0, Event Loop\uc640 Worker Pool\uc740 Application\uc758 \uc2e4\ud589 \uad6c\uc870\ub2e4.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP \/ epoll -&gt; OS I\/O Model<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Event Loop \/ Worker Pool \/ Game Thread -&gt; Application Execution Model<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub2e4\uc74c\ucc98\ub7fc \uace0\uc815\ud574\uc11c \uc0dd\uac01\ud558\uba74 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Worker Pool\nepoll -&gt; Event Loop<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c\ub85c\ub294 \ub2e4\uc74c\ucc98\ub7fc \uc870\ud569\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Worker Thread<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP -&gt; Worker Pool<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll -&gt; Event Loop<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>epoll -&gt; Event Dispatch -&gt; Worker Pool<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Session \uad6c\uc870<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Socket\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 Session\uc774\ub77c\ub294 \uac1d\uccb4\ub85c \uc5f0\uacb0\uc744 \ucd94\uc0c1\ud654\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket -&gt; Session<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Session \uc548\uc5d0\ub294 \uc5f0\uacb0\uc5d0 \ud544\uc694\ud55c \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Session -&gt; Socket + Receive Buffer + Send Buffer + Connection State + User State<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc804\uccb4 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket -&gt; Session -&gt; Receive Buffer -&gt; Packet -&gt; Handler -&gt; Game Logic<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Receive \ucc98\ub9ac<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc11c\ubc84\uc758 \uc2e4\uc81c Receive \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; TCP -&gt; Socket -&gt; I\/O Model -&gt; Session -&gt; Receive Buffer -&gt; Packet Framing -&gt; Packet -&gt; Packet Handler -&gt; Game Logic<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Packet Framing \uacfc\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Receive -&gt; Buffer \ucd94\uac00 -&gt; Header \ud655\uc778 -&gt; Length \ud655\uc778 -&gt; Packet \uc644\uc131 -&gt; Packet \ucd94\ucd9c -&gt; Handler<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Send \ucc98\ub9ac<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Send \uc5ed\uc2dc \ube44\ub3d9\uae30\ub85c \uad00\ub9ac\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Game Logic -&gt; Packet \uc0dd\uc131 -&gt; Send Queue -&gt; Send Buffer -&gt; Async Send -&gt; I\/O \uc644\ub8cc -&gt; \ub2e4\uc74c Send<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec \uacf3\uc5d0\uc11c \ud558\ub098\uc758 Session\uc5d0 Send\ub97c \uc694\uccad\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Game Logic A -&gt; Send Queue\nGame Logic B -&gt; Send Queue\nGame Logic C -&gt; Send Queue<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ud6c4 \ud558\ub098\uc758 \ud750\ub984\uc73c\ub85c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Send Queue -&gt; Send Buffer -&gt; Async Send -&gt; Completion \/ Writable Event -&gt; \ub2e4\uc74c Send<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\uba40\ud2f0\uc2a4\ub808\ub529<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Network Thread\uc640 Game Thread\ub97c \ubd84\ub9ac\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Network I\/O -&gt; Packet -&gt; Packet Queue -&gt; Game Thread -&gt; Game State<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Network Worker\uac00 \uc874\uc7ac\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP \/ epoll -&gt; Network Worker -&gt; Packet Queue -&gt; Game Thread -&gt; Game State<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\uc5d0\uc11c\ub294 Network Layer\uac00 \uac8c\uc784 \uc0c1\ud0dc\ub97c \uc9c1\uc811 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0 Packet\uc744 Game Thread\uc5d0 \uc804\ub2ec\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ub3d9\uc2dc\uc131<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Thread\uac00 \uac19\uc740 \ub370\uc774\ud130\ub97c \uc811\uadfc\ud558\uba74 \ub3d9\uc2dc\uc131 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Worker A -&gt; Shared Data\nWorker B -&gt; Shared Data<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uacfc\uc815\uc5d0\uc11c Race Condition\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Thread A -&gt; Read \/ Write\nThread B -&gt; Read \/ Write\n        -&gt; Race Condition<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uc0c1\ud669\uc5d0 \ub530\ub77c \ub3d9\uae30\ud654 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Shared Data -&gt; Mutex \/ Atomic \/ Lock-free Queue \/ Thread Ownership<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \ub354 \uc911\uc694\ud55c \ubc29\ubc95\uc740 \uacf5\uc720 \uc790\uccb4\ub97c \uc904\uc774\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Network Thread -&gt; Packet Queue -&gt; Game Thread -&gt; Game State<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">libuv<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\ud50c\ub7ab\ud3fc\ubcc4 I\/O API\ub97c \uc9c1\uc811 \uc0ac\uc6a9\ud558\ub294 \ub300\uc2e0 libuv \uac19\uc740 \ucd94\uc0c1\ud654 \uacc4\uce35\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Application -&gt; libuv -&gt; Platform I\/O<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6b4\uc601\uccb4\uc81c\uc5d0 \ub530\ub77c \ub0b4\ubd80\uc801\uc73c\ub85c \ub2e4\ub978 I\/O \uae30\uc220\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Application -&gt; libuv -&gt; Windows -&gt; IOCP<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Application -&gt; libuv -&gt; Linux -&gt; epoll<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uac1c\ubc1c\uc790\uac00 \ud50c\ub7ab\ud3fc\ubcc4 I\/O \uad6c\ud604\uc744 \uc9c1\uc811 \ubd84\ub9ac\ud574\uc57c \ud558\ub294 \ubd80\ub2f4\uc774 \uc904\uc5b4\ub4e0\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">libuv Event Loop<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">libuv\uc5d0\uc11c\ub294 Event Loop\uac00 \ud575\uc2ec \uc2e4\ud589 \uad6c\uc870\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Application -&gt; libuv -&gt; Event Loop -&gt; Network Event -&gt; Callback -&gt; Packet \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">TCP \uc11c\ubc84\ub97c \uae30\uc900\uc73c\ub85c \ubcf4\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Network -&gt; libuv -&gt; Event Loop -&gt; Read Callback -&gt; Packet \ucc98\ub9ac<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\uc804\uccb4 \uc11c\ubc84 \uad6c\uc870<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uae08\uae4c\uc9c0\uc758 \ub0b4\uc6a9\uc744 \ud558\ub098\ub85c \ubb36\uc73c\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; TCP -&gt; Socket -&gt; IOCP \/ epoll -&gt; Session -&gt; Receive Buffer -&gt; Packet Framing -&gt; Packet -&gt; Packet Handler -&gt; Game Logic -&gt; Game State<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Send\uae4c\uc9c0 \ud3ec\ud568\ud558\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; TCP -&gt; Socket -&gt; IOCP \/ epoll -&gt; Session -&gt; Receive Buffer -&gt; Packet Framing -&gt; Packet -&gt; Handler -&gt; Game Logic -&gt; Send Queue -&gt; Send Buffer -&gt; IOCP \/ epoll -&gt; TCP -&gt; Client<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uba40\ud2f0\uc2a4\ub808\ub529\uae4c\uc9c0 \ud3ec\ud568\ud558\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; TCP -&gt; Socket -&gt; IOCP \/ epoll -&gt; Network Worker -&gt; Packet Queue -&gt; Game Thread -&gt; Game Logic -&gt; Game State<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">C++ \uc11c\ubc84 \uc804\uccb4 \uacc4\uce35<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub97c \uacc4\uce35\uc73c\ub85c \ub098\ub204\uba74 \ub2e4\uc74c\ucc98\ub7fc \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Network -&gt; Socket -&gt; I\/O Model -&gt; Session -&gt; Buffer -&gt; Packet -&gt; Handler -&gt; Game Logic -&gt; Game State -&gt; Database<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uacc4\uce35\uc758 \uc5ed\ud560\uc740 \ubd84\ub9ac\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket -&gt; Network Connection\nI\/O Model -&gt; Efficient I\/O\nSession -&gt; Connection State\nBuffer -&gt; Stream Data Management\nPacket -&gt; Protocol Data\nHandler -&gt; Request Routing\nGame Logic -&gt; Business Rules\nGame State -&gt; Runtime State\nDatabase -&gt; Persistent Data<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">IOCP<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>WSARecv() -&gt; Windows -&gt; Async I\/O -&gt; I\/O Completion -&gt; IOCP -&gt; GetQueuedCompletionStatus() -&gt; Worker -&gt; Session -&gt; Packet<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">epoll<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>Socket -&gt; epoll_ctl() -&gt; epoll -&gt; epoll_wait() -&gt; Readiness Event -&gt; recv() \/ send() -&gt; Session -&gt; Packet<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">libuv<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>Application -&gt; libuv -&gt; Event Loop -&gt; Platform I\/O -&gt; Callback -&gt; Packet<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud575\uc2ec \ud750\ub984<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uacb0\uad6d \uc774 \uae00\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \ud750\ub984\uc740 \uc774\uac83\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; TCP -&gt; Socket -&gt; I\/O Model -&gt; Session -&gt; Buffer -&gt; Packet -&gt; Handler -&gt; Game Logic -&gt; Game State<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub9ac\uace0 \uc6b4\uc601\uccb4\uc81c\ubcc4 I\/O \ucc98\ub9ac\ub9cc \ubd84\ub9ac\ud558\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Windows -&gt; IOCP -&gt; Completion\nLinux -&gt; epoll -&gt; Readiness\nCross Platform -&gt; libuv -&gt; Event Loop -&gt; Platform I\/O<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uc758 \uc2e4\ud589 \uad6c\uc870\uae4c\uc9c0 \ud3ec\ud568\ud558\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Network I\/O -&gt; Packet -&gt; Queue -&gt; Game Thread -&gt; Game State<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IOCP\uc640 epoll\uc740 \uc11c\ubc84 \uadf8 \uc790\uccb4\uac00 \uc544\ub2c8\ub2e4.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IOCP \/ epoll -&gt; I\/O \ucc98\ub9ac\nSession -&gt; \uc5f0\uacb0 \uad00\ub9ac\nBuffer -&gt; Stream \uad00\ub9ac\nPacket -&gt; Protocol \ucc98\ub9ac\nQueue -&gt; Thread \uac04 \uc791\uc5c5 \uc804\ub2ec\nGame Logic -&gt; \uc2e4\uc81c \uac8c\uc784 \ucc98\ub9ac\nGame State -&gt; \uac8c\uc784 \uc0c1\ud0dc \uad00\ub9ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uacb0\uad6d \uc11c\ubc84 \uac1c\ubc1c\uc5d0\uc11c \ubd10\uc57c \ud560 \ud575\uc2ec \ud750\ub984\uc740 \ub2e4\uc74c \ud558\ub098\ub85c \uc555\ucd95\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Network I\/O -&gt; Session -&gt; Buffer -&gt; Packet -&gt; Queue -&gt; Game Logic -&gt; Game State -&gt; Response -&gt; Client<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\ub97c \uc7a1\uc544\ub450\uba74 <strong>IOCP, epoll, libuv\uac00 \uc11c\ub85c \ub2e4\ub978 \uae30\uc220\uc784\uc5d0\ub3c4 \uc11c\ubc84 \uc804\uccb4\uc5d0\uc11c \uc815\ud655\ud788 \uc5b4\ub290 \uc704\uce58\uc5d0 \uc874\uc7ac\ud558\ub294\uc9c0<\/strong>\uac00 \uba85\ud655\ud574\uc9c4\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc11c\ubc84\uc758 \ubcf8\uc9c8\uc740 \uacb0\uad6d \uc694\uccad\uc744 \ubc1b\uace0, \ucc98\ub9ac\ud558\uace0, \uc751\ub2f5\ud558\ub294 \uac83\uc774\ub2e4. \uc5ec\uae30\uc5d0 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub3d9\uc2dc\uc5d0 \uc811\uc18d\ud558\uba74\uc11c I\/O\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ucc98\ub9ac\ud574\uc57c \ud558\ub294 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. TCP \uc11c\ubc84 \uae30\ubcf8 \ud750\ub984 Listen Socket\uc740 \uc5f0\uacb0\uc744 \ubc1b\ub294 \uc6a9\ub3c4\uc774\uace0, \uc2e4\uc81c \ud1b5\uc2e0\uc740 Client Socket\uc744 \ud1b5\ud574 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. TCP\uc640 Packet \ucc98\ub9ac TCP\ub294 Packet \ub2e8\uc704\uac00 \uc544\ub2c8\ub77c Byte Stream\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud55c\ub2e4. \ud558\ub098\uc758 Send\uac00 \ud558\ub098\uc758 Receive\ub85c \ub300\uc751\ub41c\ub2e4\ub294 \ubcf4\uc7a5\uc740 \uc5c6\ub2e4. \uc5ec\ub7ec Packet\uc774 \ud558\ub098\uc758 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49],"tags":[],"class_list":["post-1663","post","type-post","status-publish","format-standard","hentry","category-server"],"_links":{"self":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1663","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1663"}],"version-history":[{"count":3,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1663\/revisions"}],"predecessor-version":[{"id":1950,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1663\/revisions\/1950"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}