๋ชฉ๋ก์ ์ฒด ๊ธ (1103)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cduMj3/btsBofuFUz0/iCms18Rwq6waoX7cnOkvtk/img.png)
[C++ ๊ฒ์ ์๋ฒ] 4-3. Server Service ํต์ฌ : 1. IocpObject ๋ ์์ ์ฑ์ ์ํด shared_ptr ๋ฅผ ์ฐจ์ฉํ๋ ๊ฒ์ด ์ข๋ค. 2. ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๋ง ํต์ ํ์ง ์๊ณ , ๋ค๋ฅธ ์๋ฒ๋ DB ์๋ฒ์๋ ํต์ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฉ๋์ ๋ฐ๋ผ ์ธ์ ์ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋๋ก, ์๋น์ค๋ฅผ ๋ง๋ค์ด ์ฃผ๋ฉด ํธ๋ฆฌํ๋ค. ์ฐ๋ฆฌ๋ ์ด์ ์ IOCP Core ํด๋์ค๋ฅผ ๋ง๋ค์ด ํธ๋ค, ์ธ์ , ์์ผ๊ณผ ๊ด๋ จํ ๊ธฐ๋ฅ๋ค์ ๊ฐ๋จํ ๋ค๋ฃฐ ์ ์๋๋ก ๋ง๋ค์๋ค. ๊ทธ๋ฐ๋ฐ ์ด์ ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ IOCP ํด๋์ค๋ ๋ฆฌ์ค๋์์ Accept ๋ฅผ ๋ฐ์ผ๋ฉด ์ธ์ ์ ์์๋ก ์์ฑํ๋ ์์ผ๋ก ๊ตฌํ์ด ๋์ด ์๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ค ์ธ์ ์ ํน์ ์๋ฒ์ ์ข ์๋๋ฉด ์์ ๋๊ฐ ๋จ์ด์ง๊ฒ ๋๋ค. ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฒ์ ์๋ฒ๋ผ๊ณ ํ๋ฉด 'ํด๋ผ์ด์ธํธ ์๋ฒ' ์ฌ์ด์ ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/by9GIY/btsBjpJ6N1O/jEk4nuMhRYIQkSfDxqgld1/img.jpg)
์ฝ๋ฉ ํ ์คํธ๋ฅผ ๋๋นํ์ฌ, ์์์ผ ํ ์๊ณ ๋ฆฌ์ฆ ๋ชฉ๋ก์ ์ ๋ฆฌํ๋ฉฐ ์ฝ์ด๋ณด๋ฉด ์ข์ ๋ธ๋ก๊ทธ ๋งํฌ๋ค์ ์ฐ๊ฒฐํด ๋ณด์๋ค(์ ๊ฐ ์์ฑํ ๊ฒ์ ์๋). ์ฝ์ด๋ด์งํ ๊ธ๋ค์ ๋งํฌ๋ฅผ ๋ฌ์ ๊ฒ์ด๋, ์ฝํ ๋ก ์์ ์์ดํ๊ธฐ ์ ์ ๋๋๋ฅผ ์์ดํ๋๋ฐ ์ฌ์ฉํ๋ฉด ์ข๊ฒ ๋ค! ๐คฃ ๊ธฐ๋ณธ ์ ๋ ฌ - ํต์ํธ - ํ์ํธ - ๋จธ์ง์ํธ ์ฐ์ ์์ํ(ํ) ์ด๋ถํ์ DFS(๊น์ด ์ฐ์ ํ์) BFS(๋๋น ์ฐ์ ํ์) ๋ฐฑํธ๋ํน ๊ทธ๋ฆฌ๋(ํ์๋ฒ) ๋์ ํฉ ํฌํฌ์ธํฐ(๋ ํฌ์ธํฐ) ์์์ ๋ ฌ DP ์ฌํ ์ฐ๊ฒฐ ์ฑ๋ถ (Connected Component) ๋ค์ต์คํธ๋ผ ํ๋ก์ด๋ ์์ฌ ๋ฒจ๋ง ํฌ๋ ์ ๋์จ-ํ์ธ๋ (Disjoint set) MST(์ต์ ์คํจ๋ ํธ๋ฆฌ) ํ๋ฆผ ํฌ๋ฃจ์ค์นผ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ํธ๋ผ์ด ์ด๋ถ ๊ทธ๋ํ(Bipartite Graph). KMP CS CS ๊ธฐ์ด ์ง์
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lqQMd/btsAnyz77nJ/l8Lm1nb3I9iaKvHwOPDNQk/img.jpg)
[์ธ๋ฆฌ์ผ] ๋ค์ ํฑ์ ํน์ ๋์ ์ํ์ํค๊ธฐํต์ฌ :1. SetTimerForNextTick ์ ์ฌ์ฉํ๋ค๋๋ก๋ ์ ์ข์ง ๋ชปํ ์ด์ ๋ก, ํน์ ๋์์ ๋ค์ ํฑ์ ์คํ์์ผ์ผ ํ๋ ์ํฉ์ด ์กด์ฌํ๋ค.AActor* actor = GetActor();// ํ์ด๋จธ๋ ํด๋ฆฌ์ด ์ฒ๋ฆฌํ๊ณ ๋ค์ ํฑ์ ๋์คํฐ ์กํฐ๋ฅผ ํธ์ถClearTimerEvent();GetWorld()->GetTimerManager().SetTimerForNextTick([actor]() { actor->Destroy(); }); ๊ทธ๋ด๋๋, ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ธ๋ฆฌ์ผ ๊ธ ์ค ์ ์ผ ์งง์ ๊ธ์ธ ๋ฏ ํ๋ค. ๐
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/I1qvq/btszcrcMKuU/WmnSsFmWSN8w9WmAjgn5M1/img.png)
[C++ ๊ฒ์ ์๋ฒ] 4-2. IocpCore ํต์ฌ : 1. IOCP ๋ชจ๋ธ์ ํฐ ๊ทธ๋ฆผ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค. Completion Port, Socket, Session ๋ฑ์ ๊ฐ๋ ์ ์ ์์๋์. 2. ์์ผ๋ก๋ IocpCore ๋ฅผ ํ์ฉํ์ฌ API ๋ฅผ ์บก์ํํ API ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. IocpCore ๋ IocpObject ๋ฅผ ๊ฐ์ ์ ์ผ๋ก ํ์ฉํ๋ค. 3. OVERLAPPED ๋ฅผ ์์๋ฐ์ IocpEvent ์, HANDLE ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ IocpObject ๋ฅผ ์์๋ฐ์ ์ธ๋ถ ์ฌํญ์ ๊ตฌํํ ๊ฒ์ด๋ค. ์ด์ IOCP ๋ชจ๋ธ์ ๊ตฌํํจ์ ์์ด ์ค๊ณง ์ฌ์ฉํ IOCP ๊ด๋ จ ๊ฐ์ฒด๋ค์ ๋ง๋ค์ด๋ณด์. ์ฌ์ค IocpCore ๋ผ๊ณ ๊ฑฐ์ฐฝํ๊ฒ ์ด๋ฆ์ ์ง์์ง๋ง, ์ค์ ๊ธฐ์กด์ ์ฌ์ฉํ๋ HANDLE, Socket, Sessi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/GY2oF/btsy9lKh800/SxkKgOQ1NSmsmk5j4d2KEk/img.png)
[C++ ๊ฒ์ ์๋ฒ] 4-1. Socket Utils ํต์ฌ : 1. IOCP ์๋ฒ ๊ตฌ์ถ์ ์ํด, ::InetNtopW, ::setsockopt ํจ์ ๋ฑ์ ํ์ฉํ์ฌ ํ์ํ ๋คํธ์ํฌ ํจ์๋ค์ Wrapping ํ ํฌํผ ํจ์๋ค์ ๋ง๋ค์ด ๋ณด์. 2. ์์ผ์ ์ฌ์ฉํ ๋, Connect/Disconnect/Accept ์ ํด๋นํ๋ ํจ์ ํฌ์ธํฐ๋ฅผ ๋ง๋ค๊ณ , ์์ผ๊ณผ ๋ฐ์ธ๋ฉํ์ฌ ํด๋น ์ฃผ์๋ฅผ ์ป์ด ์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ::WSAIoctl ํจ์๋ฅผ ์ฐธ๊ณ ํ์. ์ด๋ฒ 4 ์ฑํฐ๋, ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ด๋ค. ์ฌ์ค ์ด๋ฒ ์ฑํฐ๋ ์กฐ๊ธ ์์ํด ๋ณด์ด๋ API ๋ค์ ์ฌ์ฉํ๋ฉด์, ์์ผ๋ก ๊ตฌ์ถํ IOCP ์๋ฒ๋ฅผ ์ํ ๋ฐ์์ ์ ํ๋ ๋ถ๋ถ์ด๋ค. ๊ทธ๋ฌ๋ ๋ฏ์ค์ด ๋ณด์ด๋ ๋ ์๋ค์ด ๋ง์ด ๋ณด์ด๋๋ผ๋ '๊ทธ๋ ค๋ ค๋...' ํ๋ฉด์, ๋ฌธ์๋ฅผ ๋ณด..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dt7m0c/btsyMqYsokE/EfRg2ZM2Du2BQ622LWqDb1/img.png)
[C++ ๊ฒ์ ์๋ฒ] 3-12. Completion Port ๋ชจ๋ธ ํต์ฌ : 1. IOCP ๋ชจ๋ธ์ ์ค๋ ๋๋ง๋ค ๊ฐ๊ณ ์๋ APC ๋์ , Completion Port ๋ฅผ ์ค์์์ ํ๋ ๊ด๋ฆฌํ๋ค. 2. ์ค๋ ๋๋ Alertable Wait ์ํ๋ก ๋์ ํ๋ ๊ฒ ๋์ , ์๋ฒ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ ๋ GetQueuedCompletionStatus ๋ฅผ ํธ์ถํ์ฌ ์ ๋ณด๋ฅผ ์กฐํํด ์๋ง์ ๋์์ ์ํํ๋ค. 3. ๋ง์ฝ ํน์ ์ฐ๋ ๋๊ฐ ํน์ ์ด๋ฒคํธ๋ฅผ ํ ๋ฒ ๋ ๋ฐ๊ธธ ์ํ๋ค๋ฉด, iocpHandle ๊ณผ ๋ฐ์ธ๋ฉํ ํจ์ ๋ด๋ถ์์ WSARecv ๋ฑ์ ํธ์ถํด ์ด๋ฒคํธ๋ฅผ ๋ ๋ฐ์ ์ ์๋๋ก ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค. ๋๋์ด... ์ธ๋ฒ์งธ ์ฑํฐ์ ๋ง์ง๋ง์ด์ ์ ์ผ ์ค์ํ, IOCP ๋ชจ๋ธ์ ๋ํด์ ์์๋ณด์. ๋จผ์ , ๋ฐ๋ก ์ ์ ์์๋ณด์๋ Overlapped..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bXIw05/btsyH00n4HZ/8as7obapsZ0FvhP13GH3E1/img.png)
[C++ ๊ฒ์ ์๋ฒ] 3-11. Overlapped ๋ชจ๋ธ (์ฝ๋ฐฑ ๊ธฐ๋ฐ) ํต์ฌ : 1. ์ฝ๋ฐฑ์ ํ์ฉํ์ฌ Overlapped ๋ชจ๋ธ์ ๋ง๋ค๋ฉด, ์ด๋ฒคํธ์ ๊ฐฏ์ ์ ํ ์์ด(64๊ฐ) ์ค๋ ๋๊ฐ ํน์ ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ๋ ์ํ๋ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋ง๋ค ์ ์๋ค. 2. ๋น๋๊ธฐ ์ ์ถ๋ ฅ์ ์์ํ๊ณ ๋์ ์ค๋ ๋๋ Alertable Wait ์ํ๋ก ๋ค์ด๊ฐ๊ฒ ๋๊ณ , OS ์์ ๋น๋๊ธฐ ์ ์ถ๋ ฅ์ด ์๋ฃ๋ ํ, APC ํ๋ฅผ ๋น์์ฃผ๋ฉฐ(ํ๊บผ๋ฒ์ ๋น์์ค๋ค) ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, ์ค๋ ๋๋ Alertable Wait ์ํ๋ฅผ ๋น ์ ธ๋๊ฐ๋ค. 3. ์ฝ๋ฐฑ ๊ธฐ๋ฐ์ ์ด๋ฒคํธ์ ๋ํ ๊ฐฏ์ ์ ํ(64๊ฐ)๊ฐ ์์ผ๋, ๋ชจ๋ ๋น๋๊ธฐ ์์ผ ํจ์์์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ ์์ผ๋ฉฐ(accept), Alertable Wait ์ํ๋ก ๋น๋ฒํ๊ฒ ์ ํ๋์ด ์ฑ๋ฅ์ด ์ ํ๋ ์ ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dLhZOS/btsyINlywFs/WIhuu5ps2UJF1p8PTE5p6K/img.png)
[C++ ๊ฒ์ ์๋ฒ] 3-10. Overlapped ๋ชจ๋ธ (์ด๋ฒคํธ ๊ธฐ๋ฐ) ํต์ฌ : 1. ๋ธ๋กํน ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํจ์ ํธ์ถ ํ, ์์ ์๋ฃ์๊น์ง ๋๊ธฐ๋ฅผ ํ๋ฉฐ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์์ ์ ํ๋ค. 2. ๋ ผ๋ธ๋กํน/๋น๋๊ธฐ ๋ฐฉ์์ ๋ชจ๋ธ์ด AIO(Overlapped IO) ๋ชจ๋ธ๋ก, ์ด์์ฒด์ ๋ ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ Signaled ์ํ๋ก ๋ง๋ค์ด ์๋ฃ ์ํ๋ฅผ ์๋ ค์ค๋ค. 3. WSAWaitForMultipleEvents ํจ์๋ฅผ ํธ์ถํด์ ์ด๋ฒคํธ ๊ฐ์ฒด์ Signal ์ ํ๋ณ ํ, WSAGetOverlappedResult ๋ฅผ ํธ์ถํด ๋น๋๊ธฐ ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค. ์ด์ ๊ธ์์ ์ ๋ฆฌํ๋ Select ๋ชจ๋ธ ๋ง๊ณ , ์ค์ ๋ก ์ฌ์ฉํ IOCP ๋ชจ๋ธ์ ์ํ ๊ธฐ์ด ์์ ์ ํด ๋ณด์. ์ด๋ฒ ๊ธ์์๋ Overlapped ๋ชจ๋ธ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์ธ๋ฐ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/7yh29/btsyCjMo8yD/kPvbmdz9Eoabv1QoAWiBAk/img.png)
[C++ ๊ฒ์ ์๋ฒ] 3-9. WSAEventSelect ๋ชจ๋ธ ํต์ฌ : 1. WSAEventSelect ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด, ํน์ ์์ผ๊ณผ ํน์ ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํด, ์ค์ ์ด๋ฒคํธ๊ฐ ๋ฐ๋ํ์ ๋ ๋ฐ์ธ๋ฉ๋ ์์ผ์ผ๋ก๋ถํฐ ์ํ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค. 2. Select ๋ชจ๋ธ๊ณผ ๋ฌ๋ฆฌ, ๋งค๋ฒ Set ์ ๋ง๋ค์ง ์๊ณ ์ฌ์ฉํ ์์ผ์ ํด๋นํ ์ด๋ฒคํธ๋ง Reset ํด ์ฃผ๋ฉด ๋๋ค. 3. ์ด๋ฒคํธ ๋ฐ๋ ์, ์ ์ ํ ํจ์๋ฅผ ํธ์ถํด ์ฃผ์ด์ผ ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ด์ ๊ธ์์ Select ๋ชจ๋ธ์ ๋ํด ๋ฐฐ์ ๋ค. ๊ฐ๋จํ ์๊ธฐํด์, Select ๋ชจ๋ธ์ ํ์ฉํ๋ฉด ํน์ ์ญํ ์ ํ๋ SET(READ_SET/WRITE_SET)์ ํน์ ์์ผ์ ๋ฃ์ด '๊ด์ฐฐ' ํ ์ ์๊ฒ ๋ง๋ฆ์ผ๋ก์จ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํน์ ๋์์ ํน์ ์์ผ์ด ์ํํ๋..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dsn3YM/btsw66NAORH/ipYp5nXDoiSdvcQAznzQy0/img.jpg)
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ํด ์์๋ณด๋ฉฐ ์ด๋ฅผ C++ ๋ฅผ ์ด์ฉํ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ด๋ป๊ฒ ์ ์ฉํ๋ฉด ์ข์์ง ์์๋ณด๊ฒ ์ต๋๋ค. ํต์ฌ : 1. ํน์ฑ ๊ธฐ๋ฐ ํ ์คํธ๋ฅผ ์ ๋ ํ ์คํธ์ ํจ๊ป ํ์ฉํ๋ฉด ํ ์คํธ๋ฅผ ๊ฐ๋ตํํ๋ฉด์ ๊ฒฌ๊ณ ํ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค. 2. ๋ชจ๋๋๋ ํน์ ์ธ์๋ฅผ ํ์ ์ผ๋ก ๋ฐ์, unit/bind operator ๋ฅผ ํตํด ํน์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค. 3. ์ด๋ฒคํธ ์์ฑ์ ํ์ฉํ๋ฉด, ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ฐ์ ๋ก ํ์ฌ ์ํ์ ์ด๋ฅด๊ฒ ๋์๋์ง ์ฝ๊ฒ ํ์ ์ด ๊ฐ๋ฅํ๋ค. ํน์ฑ ๊ธฐ๋ฐ ํ ์คํธ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ ๋ ํ ์คํธ๋ ๋งค์ฐ ์ค์ํ๋ค. ๊ฒฐ๊ตญ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ๊ฒ์ด ํน์ ์ ๋ ฅ์ ๋ฃ์ผ๋ฉด ํน์ ์ถ๋ ฅ์ด ๋์ค๋๋ก ํ๋ ๊ฒ์ด๋ฏ๋ก, ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ๋ฐฐํฌ ์ ์ ํญ์ ์ ๊ฒํด์ผ ํ๋ค. ๊ธฐ์กด์๋ ์ฌ์ค ํน์ ์ํฉ์ ๋..