League Of Legends - Link Select [05์ฃผ์ฐจ] IOCP
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/Game Server

[05์ฃผ์ฐจ] IOCP

by GAMEMING 2024. 4. 22.
728x90

 

- IOCP

 : ์œˆ๋„์šฐ I/O ๋ชจ๋ธ ์ค‘ ์ตœ๊ณ  ์„ฑ๋Šฅ

 : ๋ณ„๋„์˜ ์ปค๋„ ๊ฐ์ฒด ํ†ตํ•ด ๊ตฌํ˜„ → IOCP ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ํ•ธ๋“ค ์‚ฌ์šฉ

 : Overlapped I/O CallBack Callback ํ•จ์ˆ˜๋“ค์„ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋กœ ๋™์‹œ์— ์‹คํ–‰

 : IOCP ๊ฐ์ฒด ๋‚ด๋ถ€ Thread Pool ์‚ฌ์šฉ   ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ ํŒŒ๊ดด ์˜ค๋ฒ„ํ—ค๋“œ ์—†์•ฐ & ์ ์€ ์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๋งŽ์€ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ

 https://modoocode.com/285 

 

์”น์–ด๋จน๋Š” 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() 

 : ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ์ผ์‹œ์ ์œผ๋กœ ์ •์ง€์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ

 : ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋Œ€๊ธฐํ•˜์—ฌ ์™„๋ฃŒ ๋ฃจํ‹ด์„ ์ˆ˜ํ–‰ํ•จ