- IOCP
: ์๋์ฐ I/O ๋ชจ๋ธ ์ค ์ต๊ณ ์ฑ๋ฅ
: ๋ณ๋์ ์ปค๋ ๊ฐ์ฒด ํตํด ๊ตฌํ → IOCP ๊ฐ์ฒด ์์ฑ ํ ํธ๋ค ์ฌ์ฉ
: Overlapped I/O CallBack → Callback ํจ์๋ค์ ๋ฉํฐ์ฐ๋ ๋๋ก ๋์์ ์คํ
: IOCP ๊ฐ์ฒด ๋ด๋ถ Thread Pool ์ฌ์ฉ → ์ฐ๋ ๋ ์์ฑ ํ๊ดด ์ค๋ฒํค๋ ์์ฐ & ์ ์ ์์ ์ฐ๋ ๋๋ก ๋ง์ ์ฐ๊ฒฐ ๊ด๋ฆฌ
์น์ด๋จน๋ C++ - <15 - 5. C++ ์ฐ๋ ๋ํ(ThreadPool) ๋ง๋ค๊ธฐ>
๋ชจ๋์ ์ฝ๋ ์น์ด๋จน๋ C++ - <15 - 5. C++ ์ฐ๋ ๋ํ(ThreadPool) ๋ง๋ค๊ธฐ> ์์ฑ์ผ : 2019-05-19 ์ด ๊ธ์ 56939 ๋ฒ ์ฝํ์ต๋๋ค. ์ด๋ฒ ๊ฐ์ข์์๋์ ๋ํด ๋ค๋ฃน๋๋ค.์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ์ด๋ฒ ๊ฐ์ข์์๋ ์ฌํ๊น์ง
modoocode.com
: IOCP ๊ฐ์ฒด ๋ด๋ถ Device List ์ฌ์ฉ → ๋ฑ๋ก๋ ์์ผ์ ๋ํ I/O๋ IOCP๊ฐ ์ฒ๋ฆฌ
: ๋น ์ง๊ด์ ์ธ API → ํ๋์ API๋ฅผ ์ฌ๋ฌ ์ฉ๋๋ก ์ฌ์ฉ, ๋ฌ๊ธ์๋ API ํผ๋ผ๋ฏธํฐ ์กด์ฌ
// IOCP(input output completion port) ์ค๋น - IOCP ๊ฐ์ฒด ์์ฑ, ์์ผ์ IOCP์ ์ฐ๊ฒฐ
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads };
// IOCP ์ปค๋ ๊ฐ์ฒด ์์ฑ - ๋ง์ง๋ง ์ธ์ ๋ด๊ฐ ์ธ CORE ์
HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0};
// IOCP ์ค๋น - IOCP ๊ฐ์ฒด์ ์์ผ ์ฐ๊ฒฐ, key ๊ฐ์ ์์๋ก ์ค์
HANDLE CreateIoCompletionPort(socket, hIOCP, key, 0};
// Worket Thread ์์ฑ
thread{ worker_thread };
// IOCP ์๋ฃ ๊ฒ์ฌ - ์ปค๋์์ ์๋ฃ ์ํ๋ฅผ ๊บผ๋
while(true) {
GetQueuedCompletionStatus( // I/O ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ด, ๊ฒฐ๊ณผ ์์ผ๋ฉด ์ค๋ ๋๋ฅผ IOCP์ ์ค๋ ๋-ํ์ ๋ฑ๋ก ํ ๋ฉ์ถค
hIOCP, // ์ปค๋ ์ต์ ํธ
&dwIOSize, // ์ ์ก๋ ๋ฐ์ดํฐ์
&key, // ๋ฏธ๋ฆฌ ์ ํด๋์ ID
&lpOverlapped, // Overlapped I/O ๊ตฌ์กฐ์ฒด
INFINITE
);
// lpOverlapped์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ;
}
// IOCP ์ด๋ฒคํธ ์ถ๊ฐ ํจ์ - ์ปค๋์ ํ์ ์ด๋ฒคํธ ์ถ๊ฐ
BOOL PostQueuedCompletionStatus(
HANDLE CompletionPort, // ์ปค๋ ์ต์ ํธ
DWORD NumberOfByte, // ์ ์ก๋ ๋ฐ์ดํฐ ์
ULONG_PTR dwCompletionKey, // ๋ฏธ๋ฆฌ ์ ํด๋์ ID
LPOVERLAPPED lpOverlapped); // Overlapped I/O ๊ตฌ์กฐ์ฒด
PostQueuedCompletionStatus() // !!
// IOCP๊ฐ main loop๊ฐ ๋๊ธฐ ๋๋ฌธ์
// socket I/O ์ด์ธ์๋ ๋ชจ๋ ๋ค๋ฅธ ์์
ํ ๋ด์ฉ์ ์ถ๊ฐ ํ ๋ ์ฐ์ธ๋ค
- Windows I/O model
I/O Model | ์ฅ์ | ๋จ์ |
Select | ํธํ์ฑ | ๋ถํธ / ๋๋ฆผ |
WSAAsyncSelect | ์๋์ฐ ๋ฉ์์ง ๊ธฐ๋ฐ์ ์น์ํจ | ์ฑ๋ฅ์ด ๋จ์ด์ง๊ณ ์๋์ฐ ํ์ |
WSAEventSelect | ๋น๊ต์ ์ฌ์ฉ ์ฌ์ ์ฑ๋ฅ์ด ์ข์ |
64๊ฐ ์์ผ ์ ํ |
Overlapped I/O (Event) |
IO ๋์ ์์ ์ผ๋ก ์ฑ๋ฅ ํฅ์ | 64๊ฐ ์ด๋ฒคํธ ์ ํ, ๊ฐ๋ณ ์์ ๊ฒฐ๊ณผ ํ์ธ ํ์ |
Overlapped I/O (Callback) |
64๊ฐ ์ด๋ฒคํธ ์ ํ ์์. ํ๋ก๊ทธ๋จ ๊ฐ๋จ |
๋๊ท๋ชจ ์ฐ๊ฒฐ์ ์์ง ๋ถ์กฑ |
IOCP | ๋๊ท๋ชจ ์ฐ๊ฒฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ | ์ฌ์ฉ์ ์ด๋ ค์ |
- IOCP ์ค๊ณ (์ฑ๊ธ ์ฐ๋ ๋)
1) ์ด๊ธฐํ
2) Listen ์์ผ์ IOCP์ ๋ฑ๋ก ํ AcceptEx ํธ์ถ
3) ์๋ฒ ๋ฉ์ธ ๋ฃจํ - GQCS ํธ์ถ
- AcceptEx๊ฐ ์๋ฃ๋๋ฉด ์ ์์ผ์ IOCP์ ์ฐ๊ฒฐ ํ WSARecvํธ์ถ , ๋ค์ AccepExํธ์ถ
- WSARecv๊ฐ ์๋ฃ ๋๋ฉด ํจํท ์ฒ๋ฆฌ, ๋ค์ WSARecvํธ์ถ
- WSASend๊ฐ ์๋ฃ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
: Accept ์ฒ๋ฆฌ - ๋น๋๊ธฐ ํธ์ถ ํ์(AccpetEx)
: Accept ์๋ฃ ์ฒ๋ฆฌ - ์ ํด๋ผ๊ฐ ์ ์ํ์ผ๋ฉด ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ฅผ ๋ง๋ฆ
: ํด๋ผ์ด์ธํธ ๊ฐ์ฒด (SESSION ๊ฐ์ฒด) - ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด ํ์
→ ์ต๋ ๋์ ๊ณผ ๊ฐ์ ๊ฐ์๊ฐ ํ์, ID, ๋คํธ์ํฌ ์ ์ ์ ๋ณด, ์ํ, ๊ฒ์์ ๋ณด(name, HP, x, y) ๋ฑ์ด ํด๋น
: GetQueuedCompletionStatus๋ฅผ ๋ฐ์์ ๋ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์์ด์ผ ํจ
→ Completion_key๋ฅผ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ก ํ๊ฑฐ๋ ๊ฐ์ฒด์ ID or Index
- Overlapped ๊ตฌ์กฐ์ฒด
: ๋ชจ๋ Send, Recv๋ Overlapped ๊ตฌ์กฐ์ฒด๊ฐ ํ์
: ๋์์ ์ฌ๋ฌ ํธ์ถ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ
: ์์ผ๋น Recv ํธ์ถ์ ๋ฌด์กฐ๊ฑด ํ ๊ฐ( Recv ํธ์ถ ์ฉ Overlapped ๊ตฌ์กฐ์ฒด ํ ๊ฐ๋ก ์ฌ์ฌ์ฉ )
: ์์ผ๋น Send ํธ์ถ์ ๋์์ ์ฌ๋ฌ ๊ฐ๊ฐ ๊ฐ๋ฅ (Send ๋ฒํผ๋ ๊ฐ์ ๊ฐ์๊ฐ ํ์, ๊ฐ์์ ์ ํ์ด ์์ผ๋ฏ๋ก new/delete๋ก ์ฌ์ฉ)
- Overlapped I/O pointer์ ํ์ฅ
: ํ์ํ ์ ๋ณด - ์ง๊ธ ์ด I/O๊ฐ send์ธ์ง recv์ธ์ง, I/O Buffer์ ์์น (Sendํ ๋ ๋ฒํผ๋ ๊ฐ์ด ์์ฑ๋จ)
- ์๋ฃ ์ฒ๋ฆฌ : GetQueuedCompletionStatus()
: Recv
- ํจํท์ด ๋ค ์๋ ๊ฒ์ฌ ํ ๋ค ์์ผ๋ฉด ํจํท ์ฒ๋ฆฌ (ํจํท๋ค์ด ์ค๊ฐ์ ์๋ ค์ง ์ฑ๋ก ๋์ฐฉ ๊ฐ๋ฅ์ฑ ๆ → ํจํท์ฌ์กฐ๋ฆฝ)
// ํจํท ์ฌ์กฐ๋ฆฝ - Recv
unsinged char *packet_start = exover->m_netbuf;
int remain_data = client->m_prev_recv + num_byte;
int packet_size = packet_start[0];
while(packet_size <= remain_data) {
process_packet(packet_start, key);
packet_start += packet_size;
remain_data -= packet_size;
if (0 == remain_data) break;
packet_size = packet_start[0];
}
client->m_prev_recv = remain_data;
if (0 != remain_data)
memcpy(exover->m_netbuf, packet_start, remain_data);
Do_Recv (…);
- ์ฌ๋ฌ ๊ฐ์ ํจํท์ด ํ๋ฒ์ ์์ ๋ ์ฒ๋ฆฌ
- ๊ณ์ Recv()ํธ์ถ
: Send
- ํ๋์ Socket์ ์ฌ๋ฌ ๊ฐ์ SEND๋ฅผ ๋์์ ํ ์ ์์ - ๋ค์ค ์ ์, Broadcasting
- Overlapped ๊ตฌ์กฐ์ฒด์ WSABUF๋ ์ค๋ณต ์ฌ์ฉ ๋ถ๊ฐ
- Overlapped ๊ตฌ์กฐ์ฒด์, buffer๋ send๋ ๋๋ ๋ ๊น์ง ์ ์งํด์ผ ํจ (๊ฐ์ ์ ์ ์์ - Dynamicํ๊ฒ ๊ด๋ฆฌ)
- Overlapped ๊ตฌ์กฐ์ฒด, ๋ฒํผ์ free ํด(ํน์ ์ฌ์ฌ์ฉ)
if (dwIoSize < pOverEx->m_IOCPbuf[0])
Disconnect(client);
delete pOverlappedEx;
: Accept
- ์ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด ๋ฑ๋ก
- SleepEx()
: ์ฐ๋ ๋๋ฅผ ์ง์ ๋ ์๊ฐ ๋์ ์ผ์์ ์ผ๋ก ์ ์ง์ํค๋ ๋ฐ ์ฌ์ฉ
: ์์ ์ด ์๋ฃ๋๊ธฐ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ค๋ฉด ์ด ํจ์๋ฅผ ์ฌ์ฉํด ๋๊ธฐํ์ฌ ์๋ฃ ๋ฃจํด์ ์ํํจ
'๐ค Study > Game Server' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[07์ฃผ์ฐจ] TEST & ์์ผ์ฒ๋ฆฌ (0) | 2024.04.23 |
---|---|
[06์ฃผ์ฐจ] ๋ฉํฐ์ฐ๋ ๋ 01 (0) | 2024.04.22 |
[04์ฃผ์ฐจ] I/O ๋ชจ๋ธ (0) | 2024.04.22 |
[02์ฃผ์ฐจ] ํ๊ฒฝ (1) | 2024.04.19 |
[03์ฃผ์ฐจ] ๋คํธ์ํน - 1 (1) | 2024.04.01 |