SlideShare a Scribd company logo
1 of 59
Download to read offline
TCP/IP Review
&
IO Model
NHN NEXT
๋‚จํ˜„์šฑ
01
nagle algorithm
โ€œ๊ฐ€๋Šฅํ•˜๋ฉด ์กฐ๊ธˆ์”ฉ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด์ง€ ๋ง๊ณ  ํ•œ ๋ฒˆ์— ๋งŽ์ด ๋ณด๋‚ด๋ผโ€
01 nagle algorithm
โ€ข	์™œ ํ•„์š”ํ•œ๊ฐ€?
ํŒจํ‚ท์€ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๊ณ ์ •์ ์ธ ๋น„์šฉ(packet header)์ด ํ•„์š”ํ•˜๋‹ค. ์ž‘์€ ํฌ๊ธฐ์˜ ํŒจํ‚ท์„ ์—ฌ๋Ÿฌ ๋ฒˆ
๋ณด๋‚ผ ๊ฒฝ์šฐ ์ด ๊ณ ์ • ๋น„์šฉ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ์ž์›์„ ๊ทธ๋งŒํผ ๋” ๋งŽ์ด ์“ฐ๊ฒŒ ๋œ๋‹ค. ์ด๊ฑธ ๋ฒ„ํผ์— ๋ชจ์•„๋‘์—ˆ
๋‹ค๊ฐ€ ๋˜๋„๋ก ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์— ๋ณด๋ƒ„์œผ๋กœ์จ ๋„คํŠธ์›Œํฌ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.
โ€ข	๊ฒŒ์ž„์—์„œ๋Š”?
Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๋ฉด ๋„คํŠธ์›Œํฌ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ์‘๋‹ต ์†๋„๊ฐ€ ์•ˆ
์ข‹์•„์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ ๋•Œ ๊ทธ ๋•Œ ๋ณด๋‚ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชจ์•„์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ. ๋”ฐ๋ผ์„œ ๋ฐ˜์‘ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒŒ
์ž„์˜ ๊ฒฝ์šฐ Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์„ ๋•Œ๋„ ๋งŽ๋‹ค.
๋ฌผ๋ก  ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด case by case์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ Nagle์„ ์“ฐ๋Š”๊ฒŒ ์ข‹๊ณ  ํ•ญ์ƒ Nagle์„ ์•ˆ ์“ฐ
๋Š”๊ฒŒ ์ข‹๊ณ  ์ด๋ ‡๊ฒŒ ์ด์•ผ๊ธฐํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ž์‹ ์ด ์ฒ˜ํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์“ธ ์ง€ ์•ˆ ์“ธ ์ง€ ์ ์ ˆํžˆ ์„ ํƒํ•˜๋Š”
๊ฒŒ ์ข‹๋‹ค.
01 nagle algorithm
โ€ข	๋™์ž‘ ์›๋ฆฌ
Host A Host B Host A Host B
Nagle OFF Nagle ON
ACK
ACK
ACK
ACK
ACK
N
A
G
L
E
N
ACK
ACK
AGLE
01 nagle algorithm
โ€ข	C++์—์„œ์˜ ๊ตฌํ˜„
int opt = true;
setsockopt(socket, IPPROTO_TCP,
TCP_NODELAY, (const char*)&opt, sizeof(int));
Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ON๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ์ง€ ์•Š๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ์œ„
์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‚ฌ์šฉ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
- setsockopt : ์†Œ์ผ“์˜ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋‹ค. ์ธ์ž๋กœ ์†Œ์ผ“ / ์†Œ์ผ“์˜ ๋ ˆ๋ฒจ /
์ง€์ •ํ•  ์˜ต์…˜ / ์˜ต์…˜ ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ธํ„ฐ / ์˜ต์…˜ ๊ฐ’์˜ ํฌ๊ธฐ ๋ฅผ ๋ฐ›๋Š”๋‹ค.
- IPPROTO_TCP  : soket์˜ ๋ ˆ๋ฒจ ๊ฐ’์œผ๋กœ๋Š” IPPROTO_TCP์™€ SOL_SOCKET ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ
๋‹ค. ์–ด๋–ค ๋ ˆ๋ฒจ์ด๋ƒ์— ๋”ฐ๋ผ ์ง€์ •๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด ๋‹ค๋ฅธ๋ฐ IPPROTO_TCP๋กœ ํ•ด์•ผ Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ
์šฉ์—ฌ๋ถ€ ์˜ต์…˜์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
- TCP_NODELAY : ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด ์˜ต์…˜ ๊ฐ’์„ 1๋กœ ํ•˜๋ฉด(์ ์šฉ์‹œ์ผœ์ฃผ๋ฉด) Nagle ์•Œ
๊ณ ๋ฆฌ์ฆ˜์ด ๊บผ์ง„๋‹ค.
02
TCP States
โ€œ๋‹จ์ ˆ์„ ๊ฐ์ง€ํ•˜๊ณ , ์šฐ์•„ํ•˜๊ฒŒ ์—ฐ๊ฒฐ์„ ๋Š๋Š” ๋ฐฉ๋ฒ•์€?โ€
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
3way-
handshaking
๊ณผ์ •์„ ํ†ตํ•œ
์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ
์—ฐ๊ฒฐ ์‹œ์ž‘
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
SYN
RECEIVED
SYN/SYN+ACK
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
SYN
RECEIVED
SYN/SYN+ACK
ESTABLISHED
SYN+ACK/SYN
ํด๋ผ์ด์–ธํŠธ
์„ฑ๊ณต์ ์œผ๋กœ
์—ฐ๊ฒฐ ์™„๋ฃŒ!
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
SYN
RECEIVED
SYN/SYN+ACK
ESTABLISHED
SYN+ACK/SYN
ESTABLISHED
ACK
์„œ๋ฒ„๋„
์„ฑ๊ณต์ ์œผ๋กœ
์—ฐ๊ฒฐ ์™„๋ฃŒ!
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
SYN
RECEIVED
SYN/SYN+ACK
ESTABLISHED
SYN+ACK/SYN
ESTABLISHED
ACK
์ด์ œ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ 
๋ฐ›๋Š”๋‹ค.
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
SYN
RECEIVED
SYN/SYN+ACK
ESTABLISHED
SYN+ACK/SYN
ESTABLISHED
ACK
์ด ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋‹ค
๊ฐ€ ํ•œ ์ชฝ์—์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด
์ง€๋ฉด?
๋น„์ •์ƒ์ ์ธ
์—ฐ๊ฒฐ ๋Š๊น€!
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
Server Client
CLOSED CLOSED
LISTEN
LISTEN
SYN
SENT
CONNECT/SYN
SYN
RECEIVED
SYN/SYN+ACK
ESTABLISHED
SYN+ACK/SYN
ESTABLISHED
ACK
์ •์ƒ์  ์ข…๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ฉด ์™œ
๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ ์˜ค๋Š” ์ง€ ์•Œ
์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ
๋‹ค๋ฆฐ๋‹ค!
WAIT...
02 TCP States
โ€ข	์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜?
์•„๊นŒ ์ „ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ •์ƒ์ ์œผ๋กœ โ€˜์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Œโ€™์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€ ์—†์ด ์—ฐ๊ฒฐ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ๋Š
๊ฒผ์„ ๊ฒฝ์šฐ ๋ฌดํ•œํžˆ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋–ค ๋„คํŠธ์›Œํฌ ์‚ฌ์ •๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ „์†ก์ด ๋Šฆ์–ด์ง€๋Š” ๊ฑด์ง€ ์•„
๋‹ˆ๋ฉด ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋•Œ๋ฌธ์— ์œ ๋ น ์„ธ์…˜์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
โ€ข	ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
TCP ํŠน์„ฑ ์ƒ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค.
heartbeat : ์‹ฌ์žฅ ๋ฐ•๋™์ฒ˜๋Ÿผ ์ผ์ • ์ฃผ๊ธฐ๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒจํ‚ท์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด์„œ ์„œ๋กœ ์‚ด์•„
์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
keepalive : ์†Œ์ผ“์—์„œ ์ž์ฒด์ ์œผ๋กœ heartbeat์ฒ˜๋Ÿผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ผ์ • ์‹œ๊ฐ„์„ ์„ค์ •ํ•œ ๋‹ค์Œ
๊ทธ ์‹œ๊ฐ„์„ ๋„˜์œผ๋ฉด ๊ฒ€์‚ฌ ํŒจํ‚ท์„ ๋ณด๋‚ด๊ณ  ์ผ์ • ์ด์ƒ ์‘๋‹ต์ด ์˜ค์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
02 TCP States
โ€ข	TCP_LINGER ์˜ต์…˜
์†Œ์ผ“์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•  ๋•Œ ๋ฏธ์ฒ˜ ์ „์†ก๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฒ„ํผ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€
๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ด๋‹ค. l_onoff์™€ l_linger ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค. l_onoff๋Š” linger ์˜ต์…˜์„ ์‚ฌ
์šฉํ•  ๊ฑด์ง€ ๋ง ๊ฑด์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” linger ์˜ต์…˜ ์‚ฌ์šฉ ์•ˆํ•˜๊ณ , close ํ˜ธ์ถœ ์‹œ ๋‚ด๋ถ€์ ์œผ
๋กœ ์ •์ƒ์ ์ธ ์ข…๋ฃŒ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.
l_onoff = 1,  l_linger = 0
closesocket() ์ฆ‰์‹œ ๋ฆฌํ„ด. ๋ฒ„ํผ์— ๋‚จ์•„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ํŒŒ๊ธฐํ•œ๋‹ค.
l_onoff = 1, l_linger > 0
์ผ๋‹จ ์ •์ƒ์ ์ธ ์ข…๋ฃŒ ๊ณผ์ •(Graceful Shutdown)์„ ์ง„ํ–‰ํ•˜๋˜, ์ง€์ •ํ•œ ์‹œ๊ฐ„(l_linger)์ด ์ง€๋‚˜๋„
์ œ๋Œ€๋กœ ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œํ•˜๊ณ  ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฆ‰์‹œ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ํ›„ ๋‚จ์€ ๋ฐ์ดํ„ฐ๋Š” ํŒŒ๊ธฐ์‹œํ‚จ
๋‹ค.
02 TCP States
โ€ข	TCP_LINGER ์˜ต์…˜
์‚ฌ์šฉ๋ฒ• ์ฝ”๋“œ ์˜ˆ์ œ
//Linger ์˜ต์…˜ ์ง€์ •์šฉ ๊ตฌ์กฐ์ฒด
LINGER ling = {0, };
ling.l_onoff = 1; //LINGER ์˜ต์…˜ ์‚ฌ์šฉ
ling.l_linger = 0; //๋ช‡ ์ดˆ ๊ธฐ๋‹ค๋ฆด ์ง€ ์‹œ๊ฐ„ ์„ค์ •
//LINGER ์˜ต์…˜ ํŠน์ • ์†Œ์ผ“์— ์ ์šฉ.
setsockopt(socket, SOL_SOCKET, SO_LINGER, (CHAR*)&ling, sizeof(ling));
// ํ•ด๋‹น ์˜ต์…˜์ด ์ ์šฉ๋œ socket ์ข…๋ฃŒ ๊ณผ์ • ์ˆ˜ํ–‰.
closesocket(socket);
02 TCP States
โ€ข	Graceful Shutdown
๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •.
ServerClient
ESTABLISHED ESTABLISHED
02 TCP States
โ€ข	Graceful Shutdown
๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •.
ServerClient
ESTABLISHED ESTABLISHED
FIN
FIN_WAIT_1 CLOSE_WAIT์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋Š”
์˜๋ฏธ๋กœ Client์—์„œ FIN์„
๋ณด๋‚ธ๋‹ค.
02 TCP States
โ€ข	Graceful Shutdown
๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •.
ServerClient
ESTABLISHED ESTABLISHED
FIN
FIN_WAIT_1 CLOSE_WAIT
ACK
FIN_WAIT_2 Server๋Š” ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต
์„ ๋ณด๋‚ด๊ณ  ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜
๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ํ•œ๋‹ค.
02 TCP States
โ€ข	Graceful Shutdown
๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •.
ServerClient
ESTABLISHED ESTABLISHED
FIN
FIN_WAIT_1 CLOSE_WAIT
ACK
FIN_WAIT_2 LAST_ACK
FIN
TIME_WAIT ์ค€๋น„๊ฐ€ ๋๋‚˜๋ฉด client์—
FIN์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒ
ํ•  ๊ฒƒ์ž„์„ ์•Œ๋ฆฐ๋‹ค.
02 TCP States
โ€ข	Graceful Shutdown
๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •.
ServerClient
ESTABLISHED ESTABLISHED
FIN
FIN_WAIT_1 CLOSE_WAIT
ACK
FIN_WAIT_2 LAST_ACK
FIN
TIME_WAIT
CLOSED
FIN์„ ๋ฐ›์•„๋„ Client๋Š” ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ํ•œ๋™์•ˆ
TIME_WAIT๊ฐ€ ๋œ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ FIN๋ณด
๋‹ค ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋Š” ํŒจํ‚ท์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.
ACK
02 TCP States
โ€ข	Graceful Shutdown
๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •.
ServerClient
ESTABLISHED ESTABLISHED
FIN
FIN_WAIT_1 CLOSE_WAIT
ACK
FIN_WAIT_2 LAST_ACK
FIN
TIME_WAIT
CLOSED
ACK
CLOSED ์ด๋ ‡๊ฒŒ ์ผ์ • ์‹œ๊ฐ„์ด
์ง€๋‚˜๋ฉด ์ข…๋ฃŒ์‹œํ‚ด.
02 TCP States
โ€ข	Graceful Shutdown
Graceful Shutdown์—์„œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
1. TIME_WAIT๋Š” ๋จผ์ € ์ข…๋ฃŒ๋ฅผ ์‹œ์ž‘ํ•œ ์ชฝ์—์„œ ์ƒ๊ธด๋‹ค.
Graceful Shutdown๊ณผ์ •์—์„œ TIME_WAIT๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฑด ๋ถˆ๊ฐ€ํ”ผํ•œ ์ผ์ด๋‹ค. ํ•˜์ง€๋งŒ TIME_
WAIT๋‹จ๊ณ„๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์„œ๋ฒ„ ๋ถ€ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ผญ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ข…๋ฃŒ
๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์ž.
2. Server์—์„œ TIME_WAIT๊ฐ€ ์•ˆ ์ƒ๊ธฐ๊ฒŒ ํ•˜๋Š” ๋ฒ•
โ€ข	์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์— ์ข…๋ฃŒํ•˜๋ผ๋Š” ์ปค๋งจ๋“œ๋ฅผ ๋ณด๋‚ธ๋‹ค
โ€ข	์ˆ˜์‹ ํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ข…๋ฃŒํ•˜๊ฒ ๋‹ค ์ „์†ก ํ›„ closesocket() ์ˆ˜ํ–‰
โ€ข	ํด๋ผ์ด์–ธํŠธ์˜ ์ข…๋ฃŒํ•˜๊ฒ ๋‹ค๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ›์€ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์†Œ์ผ“์— ๋Œ€ํ•ด closesocket() ํ˜ธ์ถœ. ์ด
๋•Œ linger ์˜ต์…˜์„ ์ด์šฉํ•ด ํ˜น์‹œ ๋ชจ๋ฅผ TIME_OUT์„ ๋ง‰์Œ(์–ด์ฐจํ”ผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ
๋ฐ์ดํ„ฐ๋Š” ์—†์„๊ฒŒ ํ™•์‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์— linger ์˜ต์…˜์„ ์‚ฌ์šฉ)
03
IO Model
โ€œ๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ IO ๋ชจ๋ธ์˜ ์žฅ๋‹จ์ ์„ ์•Œ์•„๋ณด์žโ€
03 IO Model
โ€ข	Synchronous Vs Asynchronous
Synchronous(๋™๊ธฐ)
์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ .
IO ์ž‘์—…์— ๋Œ€ํ•œ readiness๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ํŠน์ • IO ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š” ์ง€์— ์ง‘์ค‘. ๊ทธ
๋Ÿฐ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ ์ ํ•ฉํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
Asynchronous(๋น„๋™๊ธฐ)
์ž‘์—…์„ ์š”์ฒญํ•ด๋†“๊ณ  ๋”ด ์ผ์„ ํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๋•Œ ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ํ†ต์ง€ ๋ฐ›๊ณ  ๊ทธ์— ๋”ฐ
๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
IO ์ž‘์—…์˜ completion์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์šด์˜์ฒด์ œ ๋‹จ๊ณ„์˜ ๋น„๋™๊ธฐ API๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ IO ์ž‘์—…์ด
completion๋˜๋ฉด ๊ทธ์— ์ ํ•ฉํ•œ Handler๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
03 IO Model
โ€ข	Blocking Vs Non-blocking
I/O ์ž‘์—…์—์„œ Blocking์œผ๋กœ ๋™์ž‘ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•˜๊ณ (I/O๊ฐ€ ๋๋‚˜๊ธฐ
์ „์—๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค), Non-Blocking์œผ๋กœ ๋™์ž‘ํ•  ๊ฒฝ์šฐ ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™„
๋ฃŒํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋ฆฌํ„ดํ•ด๋ฒ„๋ฆฐ๋‹ค.
Socket์—์„œ์˜ Non-Blocking ์„ค์ •
ULONG isNonblocking = 1;
ioctlsocket(socket, FIONBIO, &isNonBlocking);
ioctlsocket : ํŠน์ • socket์˜ I/O ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
FIONBIO : 3๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜์–ด์˜จ ์†์„ฑ ๊ฐ’์ด 0์ด๋ฉด Blocking, 0์ด ์•„๋‹ˆ๋ฉด non-blocking์œผ๋กœ
์„ค์ •ํ•œ๋‹ค.
&isNonBlocking : ์†์„ฑ ๊ฐ’์„ ์ง€์ •ํ•œ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค.
03 IO Model
โ€ข	Blocking Vs Non-blocking
Non-Blocking Socket์˜ IO
non-blocking socket์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ๋ฐ›์œผ๋ ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ด์•ผํ•œ๋‹ค
for (;;)
{
	 if (recvLen = recv(socket, str + length, strLen, 0) < 0)
	{
		if (WSAGetLastError() == WSAEWOULDBLOCK)
			Sleep(1000); // ๊ธฐ๋‹ค๋ฆผ
	}
	 else
	{
		 length += recvLen;
		if (length >= strLen)
			break;
	}
}
recvLen์€ ์ด๋ฒˆ์— ๋ฐ›์€ ์–‘, strLen์€ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ๊ธธ์ด, length๋Š” ๋ฐ›์€ ์–‘์˜ ๋ˆ„์  ํ•ฉ์ด๋‹ค.
non-blocking์€ recv๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋ฐ”๋กœ ๋ฆฌํ„ด๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋๊นŒ์ง€ ์ฝ์ง€ ๋ชปํ–ˆ๊ฑฐ๋‚˜ ํ•˜๋‚˜
๋„ ๋ชป ์ฝ์€ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ recv ํ˜ธ์ถœ ํ›„์— ์–ผ๋งŒํผ ์ฝ์—ˆ๋Š”์ง€, ํ˜„์žฌ socket์˜ ์ƒํƒœ
๊ฐ€ ์–ด๋–ค ์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ค˜์•ผ ํ•œ๋‹ค.
03 IO Model
โ€ข	IO ์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ
๊ตฌ์„ธ๋Œ€ ๋„คํŠธ์›Œํฌ I/O ๋ฐฉ์‹
Server
Thread1
Thread2
Thread3
Thread4
Client1
Client2
Client3
Client4
์ ‘์†ํ•œ ๊ฐ๊ฐ์˜ ํด๋ผ์ด์–ธ
ํŠธ ๋ณ„๋กœ Thread๋ฅผ ํ•˜๋‚˜์”ฉ
๋‘๊ณ  ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ 
๋‹ค. ์ด์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก
Thread๊ฐ„์˜ ์ปจํ…์ŠคํŠธ ์Šค
์œ„์นญ ๋น„์šฉ์ด ์ปค์ง„๋‹ค.
I/O ์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ์ด ํ•„์š”ํ•œ ์ด์œ 
์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ์„ ์ด์šฉํ•˜๋ฉด Thread ๊ฐœ์ˆ˜๋ฅผ ํ›จ์”ฌ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋™์‹œ ์ ‘์†์ž ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ด
๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ์„ ์ด์šฉํ•˜๋Š” ํŽธ์ด ์„ฑ๋Šฅ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.
03 IO Model
โ€ข	SELECT
SELECT๋Š” ์ด๋ฒคํŠธ ๋ณ„๋กœ ๊ฐ์‹œํ•  ์†Œ์ผ“๋“ค์„ ๋“ฑ๋กํ•˜๊ณ (fd_set), ๋“ฑ๋ก๋œ ์†Œ์ผ“์— ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ
ํ–ˆ์„ ๊ฒฝ์šฐ ๊ทธ๊ฑธ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
int select(int nfds, fd_set* readfds, fd_set* writefds,
fd_set* errorfds, struct timeval* timeout);
์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๊ฒ€์‚ฌํ•  fd(file descriptor)์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค. 0~fd-1๊นŒ์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.
readfds, writefds, errorfds๋Š” ๊ฐ๊ฐ์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•  ์†Œ์ผ“์˜ ๋ชฉ๋ก์„ ์ €์žฅํ•œ ๋น„ํŠธํ•„๋“œ
์˜ ํฌ์ธํ„ฐ์ด๋‹ค(nullptr์ด๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” ์ฒดํฌ ์•ˆํ•จ). fd_set์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜
๋“ค์„ ์ด์šฉํ•œ๋‹ค.
void FD_ZERO(fd_set* fdset) : ํ•ด๋‹น fd_set์˜ ๊ฐ’์„ ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
void FD_CLR(int fd, fd_set* fdset) : ํ•ด๋‹น fd_set์—์„œ fd์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ ๋‹ค.
void FD_SET(int fd, fd_set* fdset) : ํ•ด๋‹น fd_set์—์„œ fd์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๋ฅผ 1๋กœ ๋งŒ๋“ ๋‹ค.
void FD_ISSET(int fd, fd_set* fdset) : fd_set์—์„œ fd์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๊ฐ€ 1์ธ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
03 IO Model
โ€ข	SELECT
์˜ˆ์ œ ์ฝ”๋“œ
FD_ZERO(&readsets);
while (true)
{
	 FD_SET(socket, &readsets);
	 n = select(max_fd + 1, &readsets, nullptr, nullptr, nullptr);
	 if (n < 0) //error ์ฒ˜๋ฆฌ
		return -1;
	 for (int i = 0; i < max_fd; i++)
	{
		if (FD_ISSET(i, &readsets))
		{
			// ... recv, accept ๋“ฑ ์ฒ˜๋ฆฌ
		}
	}
}
03 IO Model
โ€ข	SELECT
์žฅ์ 
์ง€์›ํ•˜๋Š” OS๊ฐ€ ๋งŽ์•„ ์ด์‹์„ฑ์ด ์ข‹๋‹ค(POSIX ํ‘œ์ค€).
๋‹จ์ 
๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” fd ๊ฐœ์ˆ˜์— ์ œํ•œ์ด ์žˆ๋‹ค(์ตœ๋Œ€ 1024๊ฐœ).
๋งค๋ฒˆ ๊ฒ€์‚ฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฃจํ”„๋กœ ์ „์ฒด fd๋ฅผ ๋‹ค ๊ฒ€์‚ฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.
Async / Sync, Blocking / Non-blocking ?
OS ๋ ˆ๋ฒจ์—์„œ ๋น„๋™๊ธฐ๋กœ IO ์ž‘์—…์„ ํ•˜๋ฉฐ IO๊ฐ€ ๋๋‚ฌ์Œ์„ ํ†ต์ง€ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž
์ฒด์ ์ธ event loop๋ฅผ ํ†ตํ•ด ๋งค๋ฒˆ ์†Œ์ผ“์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฏ€๋กœ
Synchronous.
timeout์„ nullptr๋กœ ์„ค์ •ํ•˜๋ฉด ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ
๋Š” Blocking์ด๋‹ค. timeout๋ฅผ ์„ค์ •ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์•„๋ฌด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„๋„
๋„˜์–ด๊ฐ€๋ฏ€๋กœ Non-blocking์ด ๋œ๋‹ค.
03 IO Model
โ€ข	EPOLL
select์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•œ ๊ฒƒ์ด๋‹ค. select๊ฐ€ ๋งค๋ฒˆ ๋ชจ๋“  fd๋ฅผ ๋‹ค ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š” ๋ฐ˜๋ฉด epoll์€ ๊ฒ€์‚ฌํ• 
fd๋งŒ ๋“ฑ๋กํ•ด ๋†“์œผ๋ฉด ์ปค๋„์ด ๊ทธ fd๋“ค์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋” ํšจ์œจ
์ด ๋›ฐ์–ด๋‚˜๋‹ค.
epoll_create(int size)
epoll์„ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ๊ทธ fd๋ฅผ ๋Œ๋ ค์ค€๋‹ค.
epoll_ctl(int epfd, int op, int fd, struct epoll_event* event)
epoll์— ์ด๋ฒคํŠธ ๋“ฑ๋ก ๋“ฑ์˜ ์ผ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. epfd: epoll_create๋กœ ๋ฐ›์€ epoll ์ธ์Šคํ„ด์Šค
์˜ fd. op : ์–ด๋–ค ๋™์ž‘์„ ํ•  ์ง€ ๊ฒฐ์ •. EPOLL_CTL_ADD๋Š” epoll ์ธ์Šคํ„ด์Šค์— ๊ฐ์‹œํ•  fd ์ถ”๊ฐ€,
EPOLL_CTL_MOD๋Š” ๋“ฑ๋ก๋œ fd์™€ ์—ฐ๊ด€๋œ event ๋ณ€๊ฒฝ, EPOLL_CTL_DEL์€ ๋“ฑ๋ก๋œ fd์˜ ์‚ญ
์ œ. ๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ํ†ต์ง€ ๋ฐ›์„ ์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •ํ•ด ๋„˜๊ธด๋‹ค.
epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout)
epoll_create๋กœ ๋งŒ๋“  ์ธ์Šคํ„ด์Šค์˜ ๋ฒˆํ˜ธ๋ฅผ ๋„˜๊ธฐ๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๋งŒํผ ๊ธฐ
๋‹ค๋ ธ๋‹ค๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ fd๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
03 IO Model
โ€ข	EPOLL
์˜ˆ์ œ ์ฝ”๋“œ
epollfd = epoll_create(10); //epoll ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
if (epollfd == -1) return -1;
ev.envents = EPOLLIN; //์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ง€(accept)
ev.data.fd = listenSock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listenSock, &ev) == -1)
	 return -1;
while (true){
	 if ((nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1)) == -1)
		return -1;
	 for (n = 0; n < nfds; ++n){
		if (events[n].data.fd == listenSock){
			connSock = accept(listen_sock, (struct sockaddr *) &local, &addrlen);
			if (connSock == -1) return -1;
			setnonblocking(connSock); // ๋…ผ๋ธ”๋กœํ‚น ์„ค์ •
			ev.events = EPOLLIN | EPOLLET;
			ev.data.fd = connSock;
			//accept๋œ socket๋„ epoll์— ์ถ”๊ฐ€(recv ์ด๋ฒคํŠธ ํ†ต์ง€).
			if (epoll_ctl(epollfd, EPOLL_CTL_ADD, connSock, &ev) == -1)
				return -1;
		}
		else
			do_use_fd(events[n].data.fd); //์ฝ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
	}
}
03 IO Model
โ€ข	EPOLL
์žฅ์ 
select์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” fd ๊ฐœ์ˆ˜์˜ ์ œํ•œ์ด ์—†๋‹ค.
๊ด€๋ฆฌํ•  fd๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋“ฑ๋กํ•˜๋ฉด ์ปค๋„์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ๋งŒ ๋„˜๊ฒจ์ฃผ๋ฏ€๋กœ ๋ฃจํ”„ ๋Œ ๋•Œ
๋งˆ๋‹ค ๋งค ๋ฒˆ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š” select๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.
๋‹จ์ 
๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6 ์ด์ƒ์—์„œ๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ด์‹์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
Async / Sync, Blocking / Non-blocking ?
Select์™€ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด์œ ๋กœ Synchronous.
Select์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ timeout์„ nullptr๋กœ ์„ค์ •ํ•˜๋ฉด ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•˜์ง€
์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ๋Š” Blocking์ด๊ณ , timeout๋ฅผ ์„ค์ •ํ•  ๊ฒฝ์šฐ Non-Blocking์ด ๋œ๋‹ค.
03 IO Model
โ€ข	WSAAsyncSelect
ํŠน์ • ์†Œ์ผ“์— ๋Œ€ํ•ด ํ†ต์ง€ ๋ฐ›์„ ์ด๋ฒคํŠธ์™€ ํ†ต์ง€ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•  ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€
์ƒ๊ธธ ๋•Œ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์ด์šฉํ•ด ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€์˜ ํ˜•ํƒœ๋กœ ํ†ต์ง€ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.
WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)
s : ์ด๋ฒคํŠธ๋ฅผ ํ†ต์ง€๋ฐ›์„ ์†Œ์ผ“.
hWnd : ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์œˆ๋„์šฐ์˜ ํ•ธ๋“ค.
wMsg : ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ํ†ต์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ๊ฐ’์ด๋‹ค.
lEvent : ํ†ต์ง€ ๋ฐ›์„ ์ด๋ฒคํŠธ. ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์œผ๋กœ FD_ACCEPT, FD_READ, FD_WRITE,
FD_CONNECT, FD_CLOSE๋“ฑ์ด ์žˆ๋‹ค.
03 IO Model
โ€ข	WSAAsyncSelect
์˜ˆ์ œ ์ฝ”๋“œ
int main()
{
	...
	 WSAAsyncSelect(socket, hWnd, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE);
	...
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	 switch(wMsg)
	{
	 case WM_SOCKET:
		switch(WSAGETSELECTEVENT(lParam))
		{
		case FD_READ:
			...
			break;
		case FD_WRITE:
			...
			break;
		}
		break;
	}
}
03 IO Model
โ€ข	WSAAsyncSelect
์žฅ์ 
์†Œ์ผ“ ์ด๋ฒคํŠธ๋ฅผ ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌํ•˜๋“ฏ์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜
๋ฆฌ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํŽธ๋ฆฌํ•˜๋‹ค.
๋‹จ์ 
์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ํ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์œˆ๋„์šฐ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋„์›Œ์•ผ ํ•œ๋‹ค.
ํ•˜๋‚˜์˜ ์œˆ๋„์šฐ์—์„œ ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€์™€ ์†Œ์ผ“ ๋ฉ”์‹œ์ง€๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ
๋‹ค.
Async / Sync, Blocking / Non-blocking ?
ํŠน์ • IO ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์šด์˜์ฒด์ œ๊ฐ€ ๊ทธ๋•Œ ๊ทธ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Asyncronous์ด๋‹ค.
WSAAsyncSelect ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น socket์ด ์ž๋™์œผ๋กœ non-blocking์œผ๋กœ ๋ฐ”๋€๋‹ค. ๋”ฐ
๋ผ์„œ ์ด socket์— ๋Œ€ํ•œ IO ์ž‘์—…๋„ non-blocking์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ non-blocking์ด๋‹ค.
03 IO Model
โ€ข	WSAEventSelect
WSAAsyncSelect๊ฐ€ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํŠน์ • ๋„คํŠธ์›Œํฌ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„
๋•Œ ์ด์™€ ์—ฐ๋™์‹œํ‚ฌ ์ด๋ฒคํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
WSAEVENT WSACreateEvent()
์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋Œ๋ ค์ค€๋‹ค.
int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents)
์†Œ์ผ“๊ณผ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ง์ง“๋Š”๋‹ค. s๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์†Œ์ผ“, hEventObject๋Š” ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ํ†ต์ง€
๋ฐ›๊ธฐ ์œ„ํ•œ ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ํ•ธ๋“ค, lNetworkEvents๋Š” ๊ฐ์ง€ํ•  ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜๋‹ค.
WSAAsyncSelect์™€ ๋™์ผํ•˜๊ฒŒ FD_READ, FD_WRITE, FD_ACCEPT, FD_CLOSE ๋“ฑ๋“ฑ์˜ ๊ฐ’
์„ ์ด์šฉํ•œ๋‹ค.
DWORD WSAWaitForMultipleEvents(DWORD cEvents, const WSAEVENT *
lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable)
์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.์ด๋ฒคํŠธ ๊ฐœ์ˆ˜, ์ด๋ฒคํŠธ๋“ค์˜ ๋ฐฐ์—ด, ์ „์ฒด ์ด๋ฒคํŠธ ๋ฐฐ์—ด์˜ signal์ด
๋ฐ”๋€” ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด์ง€ ์—ฌ๋ถ€, ํƒ€์ž„ ์•„์›ƒ ์‹œ๊ฐ„, alertable state ์„ค์ • ์—ฌ๋ถ€ ๋“ฑ์„ ์ง€์ •ํ•œ๋‹ค.
03 IO Model
โ€ข	WSAEventSelect
์˜ˆ์ œ ์ฝ”๋“œ
//event ์ƒ์„ฑ ๋ฐ ์„ค์ •
eventArray[0] = WSACreateEvent();
...
WSAEventSelect(sockets[0], eventArray[0], FD_READ | FD_CLOSE);
while(true)
{
	 index = WSAWaitForMultipleEvents(totalEvent, eventArray,
										 false, WSA_INFINITE, false);
	 index = index - WSA_WAIT_EVENT_0;
	 WSAEnumNetworkEvents(sockets[index], eventArray[index], &netEvents);
	 //๊ฐ ์ด๋ฒคํŠธ์— ๋งž๋Š” ์ฒ˜๋ฆฌ.
	 if(netEvents.lNetworkEvents & FD_READ)
	{
		...
	}
	 if(netEvents.lNetworkEvents & FD_CLOSE)
	{
		...
	}
}
03 IO Model
โ€ข	WSAEventSelect
์žฅ์ 
๋ฌด์กฐ๊ฑด ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๋Š” WSAAsyncSelect์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์ง€ ์•Š์•„
๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋‹จ์ 
WaitForMultipleObject์—์„œ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜๊ฐ€ 64๊ฐœ๋‹ค. ๊ทธ ์ด์ƒ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ
๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋Š˜๋ ค์•ผํ•œ๋‹ค.
WaitForMultipleObject๊ฐ€ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ ์ด๋ฒคํŠธ๊ฐ€ ์™”์„ ๊ฒฝ์šฐ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์•ž ์ธ๋ฑ์Šค๋ฅผ ๋Œ
๋ ค์ค€๋‹ค. ์ด๊ฒƒ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋’ค์ชฝ ์ด๋ฒคํŠธ๋Š” ์ž˜ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋“ค๋„ ํ™•
์ธ์„ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
Async / Sync, Blocking / Non-blocking ?
Select์™€ ๋น„์Šทํ•˜๊ฒŒ ํด๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ Synchronous์ด๋‹ค.
WSAEventSelect๋„ WSAAsyncSelect์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์†Œ์ผ“์„ ์ž๋™์œผ๋กœ non-blocking์œผ๋กœ
๋ฐ”๊พผ๋‹ค. ๋”ฐ๋ผ์„œ non-blocking์ด๋‹ค.
03 IO Model
โ€ข	Overlapped I/O Callback
WSASend, WSARecv๋ฅผ ํ•  ๋•Œ Overlapped ๊ตฌ์กฐ์ฒด ์„ค์ •์„ ํ†ตํ•ด I/O๋ฅผ ์ค‘์ฒฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์™„
๋ฃŒ ๋ฃจํ‹ด ํ•จ์ˆ˜๊นŒ์ง€ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ํ•ด๋‹น I/O ์ž‘์—…์ด ๋๋‚˜๊ณ  ๋‚œ ๋’ค ์™„๋ฃŒ ๋ฃจํ‹ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค.
WSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD
lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
์—ฌ๊ธฐ์„œ ์ฒ˜์Œ 5๊ฐœ ์ธ์ž๋Š” ์ผ๋ฐ˜์ ์ธ recv/ send ํ•จ์ˆ˜์™€ ๋ณ„๋ฐ˜ ๋‹ค๋ฅผ ๋ฐ” ์—†๋‹ค.
์ค‘์š”ํ•œ ๊ฑด lpOverlapped ์ธ์ž์™€ lpCompletionRoutine ์ธ์ž์ด๋‹ค. lpOverlapped ์ธ์ž๋กœ
WSAOVERLAPPED ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋„˜๊ธฐ๋Š”๋ฐ, ์ด ๊ตฌ์กฐ์ฒด์— I/O ์ž‘์—…์ด ๋๋‚ฌ์Œ์„ ํ†ต์ง€ํ•˜๊ธฐ
์œ„ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์„œ ๋„˜๊ธด๋‹ค. lpCompletionRoutine ์ธ์ž๋กœ๋Š” I/O ์ž‘์—…์ด ๋๋‚ฌ์„ ๋•Œ ์ˆ˜ํ–‰
ํ•  ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด I/O ์ž‘์—…์ด ๋๋‚œ ๋‹ค์Œ APC ํ์— ๋“ค์–ด๊ฐ€์„œ ํ•˜๋‚˜์”ฉ ์™„๋ฃŒ ๋ฃจํ‹ด ํ•จ
์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
03 IO Model
โ€ข	Overlapped I/O Callback
์˜ˆ์ œ ์ฝ”๋“œ
//์™„๋ฃŒ ๋ฃจํ‹ด ํ•จ์ˆ˜
void WINAPI IOCompletionRoutine(DWORD dwError, DWORD cbTransferred,
						LPOVERLAPPED lpOverlapped, DWORD dwFlags);
WSAOVERLAPPED overlapped;
WSABUF dataBuf;
char buffer[DATA_BUFSIZE] = { 0, };
overlapped.hEvent = WSACreateEvent();
dataBuf.len = DATA_BUFSIZE;
dataBuf.buf = buffer;
WSASend(socket, &dataBuf, &sendBytes, 0, &overlapped, IOCompletionRoutine);
//๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰
...
SleepEx(INFINITE, true);
03 IO Model
โ€ข	Overlapped I/O Callback
์žฅ์ 
์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฒ„ํผ๋กœ ๋ฐ”๋กœ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๋น„์šฉ์ด ์ค„์–ด๋“ ๋‹ค.
๋‹จ์ 
๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์— ํŠนํ™”๋œ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค.
Async / Sync, Blocking / Non-blocking ?
์šด์˜์ฒด์ œ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„๋™๊ธฐ IO ์ž‘์—…์„ ํ•œ ๋’ค IO ์ž‘์—…์ด ๋๋‚˜๋ฉด ๊ทธ ๊ฑธ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘
ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Asynchronous ๋ฐฉ์‹์ด๋‹ค.
๋˜ I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ํ•จ์ˆ˜๋Š” ๋ฐ”๋กœ ๋ฆฌํ„ด๋˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋„˜์–ด๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰
ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— non-blocking ๋ฐฉ์‹์ด๋‹ค.
Bonus
Coroutine
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Routine A Coroutine Routine B
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
Routine A
์ž‘์—… ์ง„ํ–‰
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
์ด ์‹œ์ ์—์„œ
Coroutine
ํ˜ธ์ถœํ•˜์—ฌ
Coroutine์˜
์ผ๋ถ€ ์ˆ˜ํ–‰
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
๋‹ค์‹œ ์›๋ž˜ ํ•จ
์ˆ˜ ํ˜ธ์ถœํ•˜์—ฌ
์ง„ํ–‰ํ•˜๋˜ ๋ถ€
๋ถ„๋ถ€ํ„ฐ ๋‹ค์Œ
๋ถ€๋ถ„ ์ง„ํ–‰
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
์ด ๋•Œ ๋‹ค๋ฅธ ๋ฃจ
ํ‹ด B์—์„œ ์ž๊ธฐ
์ž‘์—… ์ˆ˜ํ–‰
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
์ด ์‹œ์ ์—์„œ
Coroutine
ํ˜ธ์ถœ. ์ด์ „ ํ˜ธ
์ถœ ์ง€์ ์—์„œ
๋ถ€ํ„ฐ ์ด์–ด์„œ
์ง„ํ–‰๋จ.
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
๋‹ค์‹œ ์›๋ž˜ ํ•จ
์ˆ˜ ํ˜ธ์ถœํ•ด์„œ
ํ•˜๋˜ ์ž‘์—… ๋
๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
์ด ๋•Œ ๋ฃจํ‹ด
A์—์„œ ๋‹ค์‹œ
Coroutine
ํ˜ธ์ถœํ•˜๋ฉด ์ด
์ „ ๋ถ€๋ถ„๋ถ€ํ„ฐ
์ด์–ด์„œ ์ง„ํ–‰
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
Coroutine Routine BRoutine A
๋‹ค์‹œ
๋ฃจํ‹ด A
ํ˜ธ์ถœํ•˜์—ฌ
๋‚˜๋จธ์ง€ ์ˆ˜ํ–‰
Bonus Coroutine
โ€ข	Coroutine
ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ
ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— ๋น„๋™๊ธฐ์ ์ธ ๋กœ์ง ์ฒ˜๋ฆฌ์— ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. AI์˜ FSM ๊ตฌํ˜„
๋“ฑ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ๋“ฑ์—๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•จ.
C++์—์„œ์˜ ์‚ฌ์šฉ
C++ ์–ธ์–ด์—์„œ ์ •์‹์œผ๋กœ ์ง€์›ํ•˜์ง€๋Š” ์•Š๊ณ (MS์—์„œ C++ 17 ํ‘œ์ค€์— __resumable / __await
๋ผ๋Š” ์ฝ”๋ฃจํ‹ด ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ œ์ถœํ–ˆ๋‹ค๊ณ ๋Š” ํ•จ) boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฝ”๋ฃจํ‹ด์„ ์ด์šฉํ•  ์ˆ˜
์žˆ๊ธด ํ•˜๋‹ค.
Bonus Coroutine
โ€ข	Coroutine
์˜ˆ์ œ ์ฝ”๋“œ
template<typename T>
using coro_t = boost::coroutines::coroutine<T>;
void test(coro_t<void ()>::caller_type& caller)
{
	 printf(โ€œfirst testnโ€);
	caller();
	 printf(โ€œsecond testnโ€);
	caller();
}
int main()
{
	 printf(โ€œfirst mainnโ€);
	 coro_t<void ()> coro(test);
	 printf(โ€œsecond mainnโ€);
	coro();
	if(!coro)
	{
		printf(โ€œexitnโ€);
	}
	 return 0;
}
์‹คํ–‰ ๊ฒฐ๊ณผ
first main
first test
second main
second test
exit
End
Thank You!
End Thank You!
โ€ข	์ฐธ๊ณ  ์ž๋ฃŒ
โ€ข	 TCP State ๊ด€๋ จ
http://kuaaan.tistory.com/118
http://en.wikipedia.org/wiki/Nagleโ€™s_algorithm
โ€ข	 IO Multiplexing, Sync / Async IO ๊ด€๋ จ
http://www.terabit.com.au/docs/Comparison.htm
http://icourse.cuc.edu.cn/networkprogramming/lectures/
Unit9_WinSock_Multiplex.pdf
โ€ข	 Coroutine ๊ด€๋ จ
http://www.gamedevforever.com/200
http://gamedevforever.com/209
http://www.gamedevforever.com/289

More Related Content

What's hot

Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonSeungmo Koo
ย 
แ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ต
แ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ตแ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ต
แ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ตBrian Hong
ย 
NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„
NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„
NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„noerror
ย 
๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ
๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ
๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐHyunjik Bae
ย 
Ndc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABC
Ndc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABCNdc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABC
Ndc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABCHo Gyu Lee
ย 
Database
DatabaseDatabase
DatabaseNam Hyeonuk
ย 
ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3
ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3
ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3Heungsub Lee
ย 
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)Heungsub Lee
ย 
NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€
NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€
NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€์Šน๋ช… ์–‘
ย 
Effective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝEffective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝNam Hyeonuk
ย 
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„Heungsub Lee
ย 
์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012
์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012
์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012devCAT Studio, NEXON
ย 
ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)
ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)
ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)Heungsub Lee
ย 
KGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games Conference
KGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games ConferenceKGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games Conference
KGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games ConferenceXionglong Jin
ย 
Lock free queue
Lock free queueLock free queue
Lock free queueBongseok Cho
ย 
์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง
์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง
์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์งHoyoung Choi
ย 
ํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œ
ํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œ
ํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œQooJuice
ย 
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธSeungmo Koo
ย 
์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?
์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?
์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?๋‚ดํ›ˆ ์ •
ย 
๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ
๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ
๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑHyunjik Bae
ย 

What's hot (20)

Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
ย 
แ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ต
แ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ตแ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ต
แ„แ…ฎแ„แ…ตแ„…แ…ฅแ†ซ 1แ„‚แ…งแ†ซ, แ„‰แ…ฅแ„‡แ…ฅแ„€แ…ขแ„‡แ…กแ†ฏ แ„‡แ…ฎแ†ซแ„แ…ฎแ„€แ…ต
ย 
NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„
NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„
NDC12_Lockless๊ฒŒ์ž„์„œ๋ฒ„์„ค๊ณ„์™€๊ตฌํ˜„
ย 
๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ
๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ
๊ฒŒ์ž„ ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์กฐ
ย 
Ndc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABC
Ndc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABCNdc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABC
Ndc14 ๋ถ„์‚ฐ ์„œ๋ฒ„ ๊ตฌ์ถ•์˜ ABC
ย 
Database
DatabaseDatabase
Database
ย 
ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3
ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3
ใ€ˆ์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ใ€‰ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 3
ย 
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ Vol. 2 (์ž๋ง‰)
ย 
NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€
NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€
NDC 11 ์ž์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋น„๋ฐ€
ย 
Effective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝEffective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝ
ย 
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„
[์•ผ์ƒ์˜ ๋•…: ๋“€๋ž‘๊ณ ] ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ - SPOF ์—†๋Š” ๋ถ„์‚ฐ MMORPG ์„œ๋ฒ„
ย 
์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012
์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012
์ž„ํƒœํ˜„, MMO ์„œ๋ฒ„ ๊ฐœ๋ฐœ ํฌ์ŠคํŠธ ๋ชจํ…œ, NDC2012
ย 
ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)
ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)
ํŒŒ์ด์ฌ ์ƒ์กด ์•ˆ๋‚ด์„œ (์ž๋ง‰)
ย 
KGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games Conference
KGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games ConferenceKGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games Conference
KGC 2016: HTTPS ๋กœ ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ - Korea Games Conference
ย 
Lock free queue
Lock free queueLock free queue
Lock free queue
ย 
์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง
์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง
์ค‘์•™ ์„œ๋ฒ„ ์—†๋Š” ๊ฒŒ์ž„ ๋กœ์ง
ย 
ํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œ
ํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œ
ํ…Œ๋ผ๋กœ ์‚ดํŽด๋ณธ MMORPG์˜ ๋…ผํƒ€๊ฒŸํŒ… ์‹œ์Šคํ…œ
ย 
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #0 - TCP ๋ฐ ์ด๋ฒคํŠธ ํ†ต์ง€๋ชจ๋ธ
ย 
์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?
์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?
์‹œ์ฆŒ 2: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ์ด๋ฆฌ ํž˜๋“œ๋‚˜์š”?
ย 
๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ
๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ
๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๊ตฌ์„ฑ
ย 

Similar to Tcp ip & io model

Concurrent servers
Concurrent serversConcurrent servers
Concurrent serversTonyYoon12
ย 
๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“
๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“
๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“Eutark Park
ย 
Python์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ
Python์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐPython์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ
Python์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐTae Young Lee
ย 
์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ
์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ
์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ์„ธ๋นˆ ์ •
ย 
ํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐ
ํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐ
ํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐMijeong Park
ย 
Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?
Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?
Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?nexusz99
ย 
Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Kris Jeong
ย 
[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ
[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ
[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑNAVER D2
ย 
๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ
๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ
๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐkimkiweon
ย 
Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€
Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€
Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€SangIn Choung
ย 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
ย 
Asynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdfAsynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdfHYUNWOO KIM
ย 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in actionBingu Shim
ย 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
ย 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
ย 
[112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ 
[112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ [112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ 
[112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ NAVER D2
ย 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Sung-jae Park
ย 
[E6]2012. netty internals
[E6]2012. netty internals[E6]2012. netty internals
[E6]2012. netty internalsNAVER D2
ย 

Similar to Tcp ip & io model (20)

Concurrent servers
Concurrent serversConcurrent servers
Concurrent servers
ย 
๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“
๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“
๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” & ๋…ผ๋ธ”๋ก์†Œ์ผ“
ย 
Python์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ
Python์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐPython์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ
Python์œผ๋กœ ์ฑ„ํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ
ย 
์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ
์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ
์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ์š”์•ฝ
ย 
Zoo keeper ์†Œ๊ฐœ
Zoo keeper ์†Œ๊ฐœZoo keeper ์†Œ๊ฐœ
Zoo keeper ์†Œ๊ฐœ
ย 
ํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐ
ํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐ
ํ•˜๋“œ์›จ์–ด ์Šคํƒ€ํŠธ์—…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ด์•ผ๊ธฐ
ย 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
ย 
Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?
Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?
Dropbox์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?
ย 
Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015
ย 
[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ
[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ
[2D4]Python์—์„œ์˜ ๋™์‹œ์„ฑ_๋ณ‘๋ ฌ์„ฑ
ย 
๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ
๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ
๊ณ ๊ธ‰์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ
ย 
Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€
Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€
Io t์—์„œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‹จ์œ„ํ…Œ์ŠคํŠธ_์ ‘๊ทผ์‚ฌ๋ก€
ย 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
ย 
Asynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdfAsynchronous agents library(aal)pdf
Asynchronous agents library(aal)pdf
ย 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in action
ย 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
ย 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
ย 
[112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ 
[112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ [112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ 
[112]clova platform ์ธ๊ณต์ง€๋Šฅ์„ ์—ฎ๋Š” ๊ธฐ์ˆ 
ย 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
ย 
[E6]2012. netty internals
[E6]2012. netty internals[E6]2012. netty internals
[E6]2012. netty internals
ย 

More from Nam Hyeonuk

Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œNext ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œNam Hyeonuk
ย 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15Nam Hyeonuk
ย 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14Nam Hyeonuk
ย 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13Nam Hyeonuk
ย 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12Nam Hyeonuk
ย 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11Nam Hyeonuk
ย 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10Nam Hyeonuk
ย 
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9Nam Hyeonuk
ย 
Haskell study 8
Haskell study 8Haskell study 8
Haskell study 8Nam Hyeonuk
ย 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7Nam Hyeonuk
ย 
Haskell study 6
Haskell study 6Haskell study 6
Haskell study 6Nam Hyeonuk
ย 
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5Nam Hyeonuk
ย 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4Nam Hyeonuk
ย 
Haskell study 3
Haskell study 3Haskell study 3
Haskell study 3Nam Hyeonuk
ย 
Haskell study 2
Haskell study 2Haskell study 2
Haskell study 2Nam Hyeonuk
ย 
Haskell study 1
Haskell study 1Haskell study 1
Haskell study 1Nam Hyeonuk
ย 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0Nam Hyeonuk
ย 
Multi thread
Multi threadMulti thread
Multi threadNam Hyeonuk
ย 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object poolingNam Hyeonuk
ย 
Exception&log
Exception&logException&log
Exception&logNam Hyeonuk
ย 

More from Nam Hyeonuk (20)

Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œNext ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
ย 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
ย 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
ย 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
ย 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
ย 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
ย 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
ย 
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9
ย 
Haskell study 8
Haskell study 8Haskell study 8
Haskell study 8
ย 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
ย 
Haskell study 6
Haskell study 6Haskell study 6
Haskell study 6
ย 
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5
ย 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
ย 
Haskell study 3
Haskell study 3Haskell study 3
Haskell study 3
ย 
Haskell study 2
Haskell study 2Haskell study 2
Haskell study 2
ย 
Haskell study 1
Haskell study 1Haskell study 1
Haskell study 1
ย 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
ย 
Multi thread
Multi threadMulti thread
Multi thread
ย 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
ย 
Exception&log
Exception&logException&log
Exception&log
ย 

Tcp ip & io model

  • 1. TCP/IP Review & IO Model NHN NEXT ๋‚จํ˜„์šฑ
  • 2. 01 nagle algorithm โ€œ๊ฐ€๋Šฅํ•˜๋ฉด ์กฐ๊ธˆ์”ฉ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด์ง€ ๋ง๊ณ  ํ•œ ๋ฒˆ์— ๋งŽ์ด ๋ณด๋‚ด๋ผโ€
  • 3. 01 nagle algorithm โ€ข ์™œ ํ•„์š”ํ•œ๊ฐ€? ํŒจํ‚ท์€ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๊ณ ์ •์ ์ธ ๋น„์šฉ(packet header)์ด ํ•„์š”ํ•˜๋‹ค. ์ž‘์€ ํฌ๊ธฐ์˜ ํŒจํ‚ท์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ผ ๊ฒฝ์šฐ ์ด ๊ณ ์ • ๋น„์šฉ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ์ž์›์„ ๊ทธ๋งŒํผ ๋” ๋งŽ์ด ์“ฐ๊ฒŒ ๋œ๋‹ค. ์ด๊ฑธ ๋ฒ„ํผ์— ๋ชจ์•„๋‘์—ˆ ๋‹ค๊ฐ€ ๋˜๋„๋ก ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์— ๋ณด๋ƒ„์œผ๋กœ์จ ๋„คํŠธ์›Œํฌ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. โ€ข ๊ฒŒ์ž„์—์„œ๋Š”? Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๋ฉด ๋„คํŠธ์›Œํฌ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ์‘๋‹ต ์†๋„๊ฐ€ ์•ˆ ์ข‹์•„์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ ๋•Œ ๊ทธ ๋•Œ ๋ณด๋‚ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชจ์•„์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ. ๋”ฐ๋ผ์„œ ๋ฐ˜์‘ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒŒ ์ž„์˜ ๊ฒฝ์šฐ Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์„ ๋•Œ๋„ ๋งŽ๋‹ค. ๋ฌผ๋ก  ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด case by case์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ Nagle์„ ์“ฐ๋Š”๊ฒŒ ์ข‹๊ณ  ํ•ญ์ƒ Nagle์„ ์•ˆ ์“ฐ ๋Š”๊ฒŒ ์ข‹๊ณ  ์ด๋ ‡๊ฒŒ ์ด์•ผ๊ธฐํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ž์‹ ์ด ์ฒ˜ํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์“ธ ์ง€ ์•ˆ ์“ธ ์ง€ ์ ์ ˆํžˆ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.
  • 4. 01 nagle algorithm โ€ข ๋™์ž‘ ์›๋ฆฌ Host A Host B Host A Host B Nagle OFF Nagle ON ACK ACK ACK ACK ACK N A G L E N ACK ACK AGLE
  • 5. 01 nagle algorithm โ€ข C++์—์„œ์˜ ๊ตฌํ˜„ int opt = true; setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(int)); Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ON๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ์ง€ ์•Š๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ์œ„ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‚ฌ์šฉ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค. - setsockopt : ์†Œ์ผ“์˜ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋‹ค. ์ธ์ž๋กœ ์†Œ์ผ“ / ์†Œ์ผ“์˜ ๋ ˆ๋ฒจ / ์ง€์ •ํ•  ์˜ต์…˜ / ์˜ต์…˜ ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ธํ„ฐ / ์˜ต์…˜ ๊ฐ’์˜ ํฌ๊ธฐ ๋ฅผ ๋ฐ›๋Š”๋‹ค. - IPPROTO_TCP : soket์˜ ๋ ˆ๋ฒจ ๊ฐ’์œผ๋กœ๋Š” IPPROTO_TCP์™€ SOL_SOCKET ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ ๋‹ค. ์–ด๋–ค ๋ ˆ๋ฒจ์ด๋ƒ์— ๋”ฐ๋ผ ์ง€์ •๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด ๋‹ค๋ฅธ๋ฐ IPPROTO_TCP๋กœ ํ•ด์•ผ Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ ์šฉ์—ฌ๋ถ€ ์˜ต์…˜์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. - TCP_NODELAY : ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด ์˜ต์…˜ ๊ฐ’์„ 1๋กœ ํ•˜๋ฉด(์ ์šฉ์‹œ์ผœ์ฃผ๋ฉด) Nagle ์•Œ ๊ณ ๋ฆฌ์ฆ˜์ด ๊บผ์ง„๋‹ค.
  • 6. 02 TCP States โ€œ๋‹จ์ ˆ์„ ๊ฐ์ง€ํ•˜๊ณ , ์šฐ์•„ํ•˜๊ฒŒ ์—ฐ๊ฒฐ์„ ๋Š๋Š” ๋ฐฉ๋ฒ•์€?โ€
  • 7. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED
  • 8. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN
  • 9. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN 3way- handshaking ๊ณผ์ •์„ ํ†ตํ•œ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์‹œ์ž‘
  • 10. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN SYN RECEIVED SYN/SYN+ACK
  • 11. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN SYN RECEIVED SYN/SYN+ACK ESTABLISHED SYN+ACK/SYN ํด๋ผ์ด์–ธํŠธ ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ ์™„๋ฃŒ!
  • 12. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN SYN RECEIVED SYN/SYN+ACK ESTABLISHED SYN+ACK/SYN ESTABLISHED ACK ์„œ๋ฒ„๋„ ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ ์™„๋ฃŒ!
  • 13. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN SYN RECEIVED SYN/SYN+ACK ESTABLISHED SYN+ACK/SYN ESTABLISHED ACK ์ด์ œ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค.
  • 14. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN SYN RECEIVED SYN/SYN+ACK ESTABLISHED SYN+ACK/SYN ESTABLISHED ACK ์ด ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋‹ค ๊ฐ€ ํ•œ ์ชฝ์—์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด ์ง€๋ฉด? ๋น„์ •์ƒ์ ์ธ ์—ฐ๊ฒฐ ๋Š๊น€!
  • 15. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? Server Client CLOSED CLOSED LISTEN LISTEN SYN SENT CONNECT/SYN SYN RECEIVED SYN/SYN+ACK ESTABLISHED SYN+ACK/SYN ESTABLISHED ACK ์ •์ƒ์  ์ข…๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ฉด ์™œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ ์˜ค๋Š” ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ ๋‹ค๋ฆฐ๋‹ค! WAIT...
  • 16. 02 TCP States โ€ข ์œ ๋ น ์„ธ์…˜์€ ์™œ ์ƒ๊ธฐ๋‚˜? ์•„๊นŒ ์ „ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ •์ƒ์ ์œผ๋กœ โ€˜์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Œโ€™์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€ ์—†์ด ์—ฐ๊ฒฐ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ๋Š ๊ฒผ์„ ๊ฒฝ์šฐ ๋ฌดํ•œํžˆ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋–ค ๋„คํŠธ์›Œํฌ ์‚ฌ์ •๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ „์†ก์ด ๋Šฆ์–ด์ง€๋Š” ๊ฑด์ง€ ์•„ ๋‹ˆ๋ฉด ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋•Œ๋ฌธ์— ์œ ๋ น ์„ธ์…˜์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. โ€ข ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• TCP ํŠน์„ฑ ์ƒ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค. heartbeat : ์‹ฌ์žฅ ๋ฐ•๋™์ฒ˜๋Ÿผ ์ผ์ • ์ฃผ๊ธฐ๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒจํ‚ท์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด์„œ ์„œ๋กœ ์‚ด์•„ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. keepalive : ์†Œ์ผ“์—์„œ ์ž์ฒด์ ์œผ๋กœ heartbeat์ฒ˜๋Ÿผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ผ์ • ์‹œ๊ฐ„์„ ์„ค์ •ํ•œ ๋‹ค์Œ ๊ทธ ์‹œ๊ฐ„์„ ๋„˜์œผ๋ฉด ๊ฒ€์‚ฌ ํŒจํ‚ท์„ ๋ณด๋‚ด๊ณ  ์ผ์ • ์ด์ƒ ์‘๋‹ต์ด ์˜ค์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
  • 17. 02 TCP States โ€ข TCP_LINGER ์˜ต์…˜ ์†Œ์ผ“์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•  ๋•Œ ๋ฏธ์ฒ˜ ์ „์†ก๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฒ„ํผ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ด๋‹ค. l_onoff์™€ l_linger ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค. l_onoff๋Š” linger ์˜ต์…˜์„ ์‚ฌ ์šฉํ•  ๊ฑด์ง€ ๋ง ๊ฑด์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” linger ์˜ต์…˜ ์‚ฌ์šฉ ์•ˆํ•˜๊ณ , close ํ˜ธ์ถœ ์‹œ ๋‚ด๋ถ€์ ์œผ ๋กœ ์ •์ƒ์ ์ธ ์ข…๋ฃŒ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค. l_onoff = 1, l_linger = 0 closesocket() ์ฆ‰์‹œ ๋ฆฌํ„ด. ๋ฒ„ํผ์— ๋‚จ์•„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ํŒŒ๊ธฐํ•œ๋‹ค. l_onoff = 1, l_linger > 0 ์ผ๋‹จ ์ •์ƒ์ ์ธ ์ข…๋ฃŒ ๊ณผ์ •(Graceful Shutdown)์„ ์ง„ํ–‰ํ•˜๋˜, ์ง€์ •ํ•œ ์‹œ๊ฐ„(l_linger)์ด ์ง€๋‚˜๋„ ์ œ๋Œ€๋กœ ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œํ•˜๊ณ  ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฆ‰์‹œ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ํ›„ ๋‚จ์€ ๋ฐ์ดํ„ฐ๋Š” ํŒŒ๊ธฐ์‹œํ‚จ ๋‹ค.
  • 18. 02 TCP States โ€ข TCP_LINGER ์˜ต์…˜ ์‚ฌ์šฉ๋ฒ• ์ฝ”๋“œ ์˜ˆ์ œ //Linger ์˜ต์…˜ ์ง€์ •์šฉ ๊ตฌ์กฐ์ฒด LINGER ling = {0, }; ling.l_onoff = 1; //LINGER ์˜ต์…˜ ์‚ฌ์šฉ ling.l_linger = 0; //๋ช‡ ์ดˆ ๊ธฐ๋‹ค๋ฆด ์ง€ ์‹œ๊ฐ„ ์„ค์ • //LINGER ์˜ต์…˜ ํŠน์ • ์†Œ์ผ“์— ์ ์šฉ. setsockopt(socket, SOL_SOCKET, SO_LINGER, (CHAR*)&ling, sizeof(ling)); // ํ•ด๋‹น ์˜ต์…˜์ด ์ ์šฉ๋œ socket ์ข…๋ฃŒ ๊ณผ์ • ์ˆ˜ํ–‰. closesocket(socket);
  • 19. 02 TCP States โ€ข Graceful Shutdown ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •. ServerClient ESTABLISHED ESTABLISHED
  • 20. 02 TCP States โ€ข Graceful Shutdown ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •. ServerClient ESTABLISHED ESTABLISHED FIN FIN_WAIT_1 CLOSE_WAIT์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ Client์—์„œ FIN์„ ๋ณด๋‚ธ๋‹ค.
  • 21. 02 TCP States โ€ข Graceful Shutdown ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •. ServerClient ESTABLISHED ESTABLISHED FIN FIN_WAIT_1 CLOSE_WAIT ACK FIN_WAIT_2 Server๋Š” ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต ์„ ๋ณด๋‚ด๊ณ  ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜ ๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ํ•œ๋‹ค.
  • 22. 02 TCP States โ€ข Graceful Shutdown ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •. ServerClient ESTABLISHED ESTABLISHED FIN FIN_WAIT_1 CLOSE_WAIT ACK FIN_WAIT_2 LAST_ACK FIN TIME_WAIT ์ค€๋น„๊ฐ€ ๋๋‚˜๋ฉด client์— FIN์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒ ํ•  ๊ฒƒ์ž„์„ ์•Œ๋ฆฐ๋‹ค.
  • 23. 02 TCP States โ€ข Graceful Shutdown ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •. ServerClient ESTABLISHED ESTABLISHED FIN FIN_WAIT_1 CLOSE_WAIT ACK FIN_WAIT_2 LAST_ACK FIN TIME_WAIT CLOSED FIN์„ ๋ฐ›์•„๋„ Client๋Š” ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ํ•œ๋™์•ˆ TIME_WAIT๊ฐ€ ๋œ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ FIN๋ณด ๋‹ค ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋Š” ํŒจํ‚ท์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ. ACK
  • 24. 02 TCP States โ€ข Graceful Shutdown ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œ์ผ“ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •. ServerClient ESTABLISHED ESTABLISHED FIN FIN_WAIT_1 CLOSE_WAIT ACK FIN_WAIT_2 LAST_ACK FIN TIME_WAIT CLOSED ACK CLOSED ์ด๋ ‡๊ฒŒ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ข…๋ฃŒ์‹œํ‚ด.
  • 25. 02 TCP States โ€ข Graceful Shutdown Graceful Shutdown์—์„œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 1. TIME_WAIT๋Š” ๋จผ์ € ์ข…๋ฃŒ๋ฅผ ์‹œ์ž‘ํ•œ ์ชฝ์—์„œ ์ƒ๊ธด๋‹ค. Graceful Shutdown๊ณผ์ •์—์„œ TIME_WAIT๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฑด ๋ถˆ๊ฐ€ํ”ผํ•œ ์ผ์ด๋‹ค. ํ•˜์ง€๋งŒ TIME_ WAIT๋‹จ๊ณ„๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์„œ๋ฒ„ ๋ถ€ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ผญ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ข…๋ฃŒ ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์ž. 2. Server์—์„œ TIME_WAIT๊ฐ€ ์•ˆ ์ƒ๊ธฐ๊ฒŒ ํ•˜๋Š” ๋ฒ• โ€ข ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์— ์ข…๋ฃŒํ•˜๋ผ๋Š” ์ปค๋งจ๋“œ๋ฅผ ๋ณด๋‚ธ๋‹ค โ€ข ์ˆ˜์‹ ํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ข…๋ฃŒํ•˜๊ฒ ๋‹ค ์ „์†ก ํ›„ closesocket() ์ˆ˜ํ–‰ โ€ข ํด๋ผ์ด์–ธํŠธ์˜ ์ข…๋ฃŒํ•˜๊ฒ ๋‹ค๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ›์€ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์†Œ์ผ“์— ๋Œ€ํ•ด closesocket() ํ˜ธ์ถœ. ์ด ๋•Œ linger ์˜ต์…˜์„ ์ด์šฉํ•ด ํ˜น์‹œ ๋ชจ๋ฅผ TIME_OUT์„ ๋ง‰์Œ(์–ด์ฐจํ”ผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๋Š” ์—†์„๊ฒŒ ํ™•์‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์— linger ์˜ต์…˜์„ ์‚ฌ์šฉ)
  • 26. 03 IO Model โ€œ๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ IO ๋ชจ๋ธ์˜ ์žฅ๋‹จ์ ์„ ์•Œ์•„๋ณด์žโ€
  • 27. 03 IO Model โ€ข Synchronous Vs Asynchronous Synchronous(๋™๊ธฐ) ์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ . IO ์ž‘์—…์— ๋Œ€ํ•œ readiness๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ํŠน์ • IO ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š” ์ง€์— ์ง‘์ค‘. ๊ทธ ๋Ÿฐ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ ์ ํ•ฉํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. Asynchronous(๋น„๋™๊ธฐ) ์ž‘์—…์„ ์š”์ฒญํ•ด๋†“๊ณ  ๋”ด ์ผ์„ ํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๋•Œ ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ํ†ต์ง€ ๋ฐ›๊ณ  ๊ทธ์— ๋”ฐ ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. IO ์ž‘์—…์˜ completion์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์šด์˜์ฒด์ œ ๋‹จ๊ณ„์˜ ๋น„๋™๊ธฐ API๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ IO ์ž‘์—…์ด completion๋˜๋ฉด ๊ทธ์— ์ ํ•ฉํ•œ Handler๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • 28. 03 IO Model โ€ข Blocking Vs Non-blocking I/O ์ž‘์—…์—์„œ Blocking์œผ๋กœ ๋™์ž‘ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•˜๊ณ (I/O๊ฐ€ ๋๋‚˜๊ธฐ ์ „์—๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค), Non-Blocking์œผ๋กœ ๋™์ž‘ํ•  ๊ฒฝ์šฐ ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™„ ๋ฃŒํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋ฆฌํ„ดํ•ด๋ฒ„๋ฆฐ๋‹ค. Socket์—์„œ์˜ Non-Blocking ์„ค์ • ULONG isNonblocking = 1; ioctlsocket(socket, FIONBIO, &isNonBlocking); ioctlsocket : ํŠน์ • socket์˜ I/O ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. FIONBIO : 3๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜์–ด์˜จ ์†์„ฑ ๊ฐ’์ด 0์ด๋ฉด Blocking, 0์ด ์•„๋‹ˆ๋ฉด non-blocking์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. &isNonBlocking : ์†์„ฑ ๊ฐ’์„ ์ง€์ •ํ•œ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค.
  • 29. 03 IO Model โ€ข Blocking Vs Non-blocking Non-Blocking Socket์˜ IO non-blocking socket์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ๋ฐ›์œผ๋ ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ด์•ผํ•œ๋‹ค for (;;) { if (recvLen = recv(socket, str + length, strLen, 0) < 0) { if (WSAGetLastError() == WSAEWOULDBLOCK) Sleep(1000); // ๊ธฐ๋‹ค๋ฆผ } else { length += recvLen; if (length >= strLen) break; } } recvLen์€ ์ด๋ฒˆ์— ๋ฐ›์€ ์–‘, strLen์€ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ๊ธธ์ด, length๋Š” ๋ฐ›์€ ์–‘์˜ ๋ˆ„์  ํ•ฉ์ด๋‹ค. non-blocking์€ recv๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋ฐ”๋กœ ๋ฆฌํ„ด๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋๊นŒ์ง€ ์ฝ์ง€ ๋ชปํ–ˆ๊ฑฐ๋‚˜ ํ•˜๋‚˜ ๋„ ๋ชป ์ฝ์€ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ recv ํ˜ธ์ถœ ํ›„์— ์–ผ๋งŒํผ ์ฝ์—ˆ๋Š”์ง€, ํ˜„์žฌ socket์˜ ์ƒํƒœ ๊ฐ€ ์–ด๋–ค ์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ค˜์•ผ ํ•œ๋‹ค.
  • 30. 03 IO Model โ€ข IO ์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ ๊ตฌ์„ธ๋Œ€ ๋„คํŠธ์›Œํฌ I/O ๋ฐฉ์‹ Server Thread1 Thread2 Thread3 Thread4 Client1 Client2 Client3 Client4 ์ ‘์†ํ•œ ๊ฐ๊ฐ์˜ ํด๋ผ์ด์–ธ ํŠธ ๋ณ„๋กœ Thread๋ฅผ ํ•˜๋‚˜์”ฉ ๋‘๊ณ  ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค. ์ด์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก Thread๊ฐ„์˜ ์ปจํ…์ŠคํŠธ ์Šค ์œ„์นญ ๋น„์šฉ์ด ์ปค์ง„๋‹ค. I/O ์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ์ด ํ•„์š”ํ•œ ์ด์œ  ์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ์„ ์ด์šฉํ•˜๋ฉด Thread ๊ฐœ์ˆ˜๋ฅผ ํ›จ์”ฌ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋™์‹œ ์ ‘์†์ž ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ด ๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ์„ ์ด์šฉํ•˜๋Š” ํŽธ์ด ์„ฑ๋Šฅ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.
  • 31. 03 IO Model โ€ข SELECT SELECT๋Š” ์ด๋ฒคํŠธ ๋ณ„๋กœ ๊ฐ์‹œํ•  ์†Œ์ผ“๋“ค์„ ๋“ฑ๋กํ•˜๊ณ (fd_set), ๋“ฑ๋ก๋œ ์†Œ์ผ“์— ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๊ฒฝ์šฐ ๊ทธ๊ฑธ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout); ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๊ฒ€์‚ฌํ•  fd(file descriptor)์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค. 0~fd-1๊นŒ์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. readfds, writefds, errorfds๋Š” ๊ฐ๊ฐ์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•  ์†Œ์ผ“์˜ ๋ชฉ๋ก์„ ์ €์žฅํ•œ ๋น„ํŠธํ•„๋“œ ์˜ ํฌ์ธํ„ฐ์ด๋‹ค(nullptr์ด๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” ์ฒดํฌ ์•ˆํ•จ). fd_set์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ ๋“ค์„ ์ด์šฉํ•œ๋‹ค. void FD_ZERO(fd_set* fdset) : ํ•ด๋‹น fd_set์˜ ๊ฐ’์„ ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. void FD_CLR(int fd, fd_set* fdset) : ํ•ด๋‹น fd_set์—์„œ fd์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ ๋‹ค. void FD_SET(int fd, fd_set* fdset) : ํ•ด๋‹น fd_set์—์„œ fd์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๋ฅผ 1๋กœ ๋งŒ๋“ ๋‹ค. void FD_ISSET(int fd, fd_set* fdset) : fd_set์—์„œ fd์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๊ฐ€ 1์ธ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • 32. 03 IO Model โ€ข SELECT ์˜ˆ์ œ ์ฝ”๋“œ FD_ZERO(&readsets); while (true) { FD_SET(socket, &readsets); n = select(max_fd + 1, &readsets, nullptr, nullptr, nullptr); if (n < 0) //error ์ฒ˜๋ฆฌ return -1; for (int i = 0; i < max_fd; i++) { if (FD_ISSET(i, &readsets)) { // ... recv, accept ๋“ฑ ์ฒ˜๋ฆฌ } } }
  • 33. 03 IO Model โ€ข SELECT ์žฅ์  ์ง€์›ํ•˜๋Š” OS๊ฐ€ ๋งŽ์•„ ์ด์‹์„ฑ์ด ์ข‹๋‹ค(POSIX ํ‘œ์ค€). ๋‹จ์  ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” fd ๊ฐœ์ˆ˜์— ์ œํ•œ์ด ์žˆ๋‹ค(์ตœ๋Œ€ 1024๊ฐœ). ๋งค๋ฒˆ ๊ฒ€์‚ฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฃจํ”„๋กœ ์ „์ฒด fd๋ฅผ ๋‹ค ๊ฒ€์‚ฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. Async / Sync, Blocking / Non-blocking ? OS ๋ ˆ๋ฒจ์—์„œ ๋น„๋™๊ธฐ๋กœ IO ์ž‘์—…์„ ํ•˜๋ฉฐ IO๊ฐ€ ๋๋‚ฌ์Œ์„ ํ†ต์ง€ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž ์ฒด์ ์ธ event loop๋ฅผ ํ†ตํ•ด ๋งค๋ฒˆ ์†Œ์ผ“์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฏ€๋กœ Synchronous. timeout์„ nullptr๋กœ ์„ค์ •ํ•˜๋ฉด ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ๋Š” Blocking์ด๋‹ค. timeout๋ฅผ ์„ค์ •ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์•„๋ฌด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„๋„ ๋„˜์–ด๊ฐ€๋ฏ€๋กœ Non-blocking์ด ๋œ๋‹ค.
  • 34. 03 IO Model โ€ข EPOLL select์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•œ ๊ฒƒ์ด๋‹ค. select๊ฐ€ ๋งค๋ฒˆ ๋ชจ๋“  fd๋ฅผ ๋‹ค ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š” ๋ฐ˜๋ฉด epoll์€ ๊ฒ€์‚ฌํ•  fd๋งŒ ๋“ฑ๋กํ•ด ๋†“์œผ๋ฉด ์ปค๋„์ด ๊ทธ fd๋“ค์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋” ํšจ์œจ ์ด ๋›ฐ์–ด๋‚˜๋‹ค. epoll_create(int size) epoll์„ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ๊ทธ fd๋ฅผ ๋Œ๋ ค์ค€๋‹ค. epoll_ctl(int epfd, int op, int fd, struct epoll_event* event) epoll์— ์ด๋ฒคํŠธ ๋“ฑ๋ก ๋“ฑ์˜ ์ผ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. epfd: epoll_create๋กœ ๋ฐ›์€ epoll ์ธ์Šคํ„ด์Šค ์˜ fd. op : ์–ด๋–ค ๋™์ž‘์„ ํ•  ์ง€ ๊ฒฐ์ •. EPOLL_CTL_ADD๋Š” epoll ์ธ์Šคํ„ด์Šค์— ๊ฐ์‹œํ•  fd ์ถ”๊ฐ€, EPOLL_CTL_MOD๋Š” ๋“ฑ๋ก๋œ fd์™€ ์—ฐ๊ด€๋œ event ๋ณ€๊ฒฝ, EPOLL_CTL_DEL์€ ๋“ฑ๋ก๋œ fd์˜ ์‚ญ ์ œ. ๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ํ†ต์ง€ ๋ฐ›์„ ์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •ํ•ด ๋„˜๊ธด๋‹ค. epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout) epoll_create๋กœ ๋งŒ๋“  ์ธ์Šคํ„ด์Šค์˜ ๋ฒˆํ˜ธ๋ฅผ ๋„˜๊ธฐ๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๋งŒํผ ๊ธฐ ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ fd๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • 35. 03 IO Model โ€ข EPOLL ์˜ˆ์ œ ์ฝ”๋“œ epollfd = epoll_create(10); //epoll ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ if (epollfd == -1) return -1; ev.envents = EPOLLIN; //์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ง€(accept) ev.data.fd = listenSock; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listenSock, &ev) == -1) return -1; while (true){ if ((nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1)) == -1) return -1; for (n = 0; n < nfds; ++n){ if (events[n].data.fd == listenSock){ connSock = accept(listen_sock, (struct sockaddr *) &local, &addrlen); if (connSock == -1) return -1; setnonblocking(connSock); // ๋…ผ๋ธ”๋กœํ‚น ์„ค์ • ev.events = EPOLLIN | EPOLLET; ev.data.fd = connSock; //accept๋œ socket๋„ epoll์— ์ถ”๊ฐ€(recv ์ด๋ฒคํŠธ ํ†ต์ง€). if (epoll_ctl(epollfd, EPOLL_CTL_ADD, connSock, &ev) == -1) return -1; } else do_use_fd(events[n].data.fd); //์ฝ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ } }
  • 36. 03 IO Model โ€ข EPOLL ์žฅ์  select์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” fd ๊ฐœ์ˆ˜์˜ ์ œํ•œ์ด ์—†๋‹ค. ๊ด€๋ฆฌํ•  fd๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋“ฑ๋กํ•˜๋ฉด ์ปค๋„์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ๋งŒ ๋„˜๊ฒจ์ฃผ๋ฏ€๋กœ ๋ฃจํ”„ ๋Œ ๋•Œ ๋งˆ๋‹ค ๋งค ๋ฒˆ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š” select๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค. ๋‹จ์  ๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6 ์ด์ƒ์—์„œ๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ด์‹์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. Async / Sync, Blocking / Non-blocking ? Select์™€ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด์œ ๋กœ Synchronous. Select์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ timeout์„ nullptr๋กœ ์„ค์ •ํ•˜๋ฉด ๋ญ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ๋Š” Blocking์ด๊ณ , timeout๋ฅผ ์„ค์ •ํ•  ๊ฒฝ์šฐ Non-Blocking์ด ๋œ๋‹ค.
  • 37. 03 IO Model โ€ข WSAAsyncSelect ํŠน์ • ์†Œ์ผ“์— ๋Œ€ํ•ด ํ†ต์ง€ ๋ฐ›์„ ์ด๋ฒคํŠธ์™€ ํ†ต์ง€ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•  ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์ƒ๊ธธ ๋•Œ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์ด์šฉํ•ด ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€์˜ ํ˜•ํƒœ๋กœ ํ†ต์ง€ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent) s : ์ด๋ฒคํŠธ๋ฅผ ํ†ต์ง€๋ฐ›์„ ์†Œ์ผ“. hWnd : ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์œˆ๋„์šฐ์˜ ํ•ธ๋“ค. wMsg : ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ํ†ต์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ๊ฐ’์ด๋‹ค. lEvent : ํ†ต์ง€ ๋ฐ›์„ ์ด๋ฒคํŠธ. ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์œผ๋กœ FD_ACCEPT, FD_READ, FD_WRITE, FD_CONNECT, FD_CLOSE๋“ฑ์ด ์žˆ๋‹ค.
  • 38. 03 IO Model โ€ข WSAAsyncSelect ์˜ˆ์ œ ์ฝ”๋“œ int main() { ... WSAAsyncSelect(socket, hWnd, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE); ... } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch(wMsg) { case WM_SOCKET: switch(WSAGETSELECTEVENT(lParam)) { case FD_READ: ... break; case FD_WRITE: ... break; } break; } }
  • 39. 03 IO Model โ€ข WSAAsyncSelect ์žฅ์  ์†Œ์ผ“ ์ด๋ฒคํŠธ๋ฅผ ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌํ•˜๋“ฏ์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜ ๋ฆฌ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํŽธ๋ฆฌํ•˜๋‹ค. ๋‹จ์  ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€ ํ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์œˆ๋„์šฐ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋„์›Œ์•ผ ํ•œ๋‹ค. ํ•˜๋‚˜์˜ ์œˆ๋„์šฐ์—์„œ ์œˆ๋„์šฐ ๋ฉ”์‹œ์ง€์™€ ์†Œ์ผ“ ๋ฉ”์‹œ์ง€๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ ๋‹ค. Async / Sync, Blocking / Non-blocking ? ํŠน์ • IO ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์šด์˜์ฒด์ œ๊ฐ€ ๊ทธ๋•Œ ๊ทธ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Asyncronous์ด๋‹ค. WSAAsyncSelect ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น socket์ด ์ž๋™์œผ๋กœ non-blocking์œผ๋กœ ๋ฐ”๋€๋‹ค. ๋”ฐ ๋ผ์„œ ์ด socket์— ๋Œ€ํ•œ IO ์ž‘์—…๋„ non-blocking์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ non-blocking์ด๋‹ค.
  • 40. 03 IO Model โ€ข WSAEventSelect WSAAsyncSelect๊ฐ€ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํŠน์ • ๋„คํŠธ์›Œํฌ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด์™€ ์—ฐ๋™์‹œํ‚ฌ ์ด๋ฒคํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. WSAEVENT WSACreateEvent() ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋Œ๋ ค์ค€๋‹ค. int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents) ์†Œ์ผ“๊ณผ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ง์ง“๋Š”๋‹ค. s๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์†Œ์ผ“, hEventObject๋Š” ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ํ†ต์ง€ ๋ฐ›๊ธฐ ์œ„ํ•œ ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ํ•ธ๋“ค, lNetworkEvents๋Š” ๊ฐ์ง€ํ•  ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜๋‹ค. WSAAsyncSelect์™€ ๋™์ผํ•˜๊ฒŒ FD_READ, FD_WRITE, FD_ACCEPT, FD_CLOSE ๋“ฑ๋“ฑ์˜ ๊ฐ’ ์„ ์ด์šฉํ•œ๋‹ค. DWORD WSAWaitForMultipleEvents(DWORD cEvents, const WSAEVENT * lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable) ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.์ด๋ฒคํŠธ ๊ฐœ์ˆ˜, ์ด๋ฒคํŠธ๋“ค์˜ ๋ฐฐ์—ด, ์ „์ฒด ์ด๋ฒคํŠธ ๋ฐฐ์—ด์˜ signal์ด ๋ฐ”๋€” ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด์ง€ ์—ฌ๋ถ€, ํƒ€์ž„ ์•„์›ƒ ์‹œ๊ฐ„, alertable state ์„ค์ • ์—ฌ๋ถ€ ๋“ฑ์„ ์ง€์ •ํ•œ๋‹ค.
  • 41. 03 IO Model โ€ข WSAEventSelect ์˜ˆ์ œ ์ฝ”๋“œ //event ์ƒ์„ฑ ๋ฐ ์„ค์ • eventArray[0] = WSACreateEvent(); ... WSAEventSelect(sockets[0], eventArray[0], FD_READ | FD_CLOSE); while(true) { index = WSAWaitForMultipleEvents(totalEvent, eventArray, false, WSA_INFINITE, false); index = index - WSA_WAIT_EVENT_0; WSAEnumNetworkEvents(sockets[index], eventArray[index], &netEvents); //๊ฐ ์ด๋ฒคํŠธ์— ๋งž๋Š” ์ฒ˜๋ฆฌ. if(netEvents.lNetworkEvents & FD_READ) { ... } if(netEvents.lNetworkEvents & FD_CLOSE) { ... } }
  • 42. 03 IO Model โ€ข WSAEventSelect ์žฅ์  ๋ฌด์กฐ๊ฑด ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๋Š” WSAAsyncSelect์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์ง€ ์•Š์•„ ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ์  WaitForMultipleObject์—์„œ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜๊ฐ€ 64๊ฐœ๋‹ค. ๊ทธ ์ด์ƒ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋Š˜๋ ค์•ผํ•œ๋‹ค. WaitForMultipleObject๊ฐ€ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ ์ด๋ฒคํŠธ๊ฐ€ ์™”์„ ๊ฒฝ์šฐ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์•ž ์ธ๋ฑ์Šค๋ฅผ ๋Œ ๋ ค์ค€๋‹ค. ์ด๊ฒƒ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋’ค์ชฝ ์ด๋ฒคํŠธ๋Š” ์ž˜ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋“ค๋„ ํ™• ์ธ์„ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. Async / Sync, Blocking / Non-blocking ? Select์™€ ๋น„์Šทํ•˜๊ฒŒ ํด๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ Synchronous์ด๋‹ค. WSAEventSelect๋„ WSAAsyncSelect์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์†Œ์ผ“์„ ์ž๋™์œผ๋กœ non-blocking์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ๋”ฐ๋ผ์„œ non-blocking์ด๋‹ค.
  • 43. 03 IO Model โ€ข Overlapped I/O Callback WSASend, WSARecv๋ฅผ ํ•  ๋•Œ Overlapped ๊ตฌ์กฐ์ฒด ์„ค์ •์„ ํ†ตํ•ด I/O๋ฅผ ์ค‘์ฒฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์™„ ๋ฃŒ ๋ฃจํ‹ด ํ•จ์ˆ˜๊นŒ์ง€ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ํ•ด๋‹น I/O ์ž‘์—…์ด ๋๋‚˜๊ณ  ๋‚œ ๋’ค ์™„๋ฃŒ ๋ฃจํ‹ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค. WSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) ์—ฌ๊ธฐ์„œ ์ฒ˜์Œ 5๊ฐœ ์ธ์ž๋Š” ์ผ๋ฐ˜์ ์ธ recv/ send ํ•จ์ˆ˜์™€ ๋ณ„๋ฐ˜ ๋‹ค๋ฅผ ๋ฐ” ์—†๋‹ค. ์ค‘์š”ํ•œ ๊ฑด lpOverlapped ์ธ์ž์™€ lpCompletionRoutine ์ธ์ž์ด๋‹ค. lpOverlapped ์ธ์ž๋กœ WSAOVERLAPPED ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋„˜๊ธฐ๋Š”๋ฐ, ์ด ๊ตฌ์กฐ์ฒด์— I/O ์ž‘์—…์ด ๋๋‚ฌ์Œ์„ ํ†ต์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์„œ ๋„˜๊ธด๋‹ค. lpCompletionRoutine ์ธ์ž๋กœ๋Š” I/O ์ž‘์—…์ด ๋๋‚ฌ์„ ๋•Œ ์ˆ˜ํ–‰ ํ•  ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด I/O ์ž‘์—…์ด ๋๋‚œ ๋‹ค์Œ APC ํ์— ๋“ค์–ด๊ฐ€์„œ ํ•˜๋‚˜์”ฉ ์™„๋ฃŒ ๋ฃจํ‹ด ํ•จ ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
  • 44. 03 IO Model โ€ข Overlapped I/O Callback ์˜ˆ์ œ ์ฝ”๋“œ //์™„๋ฃŒ ๋ฃจํ‹ด ํ•จ์ˆ˜ void WINAPI IOCompletionRoutine(DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpOverlapped, DWORD dwFlags); WSAOVERLAPPED overlapped; WSABUF dataBuf; char buffer[DATA_BUFSIZE] = { 0, }; overlapped.hEvent = WSACreateEvent(); dataBuf.len = DATA_BUFSIZE; dataBuf.buf = buffer; WSASend(socket, &dataBuf, &sendBytes, 0, &overlapped, IOCompletionRoutine); //๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰ ... SleepEx(INFINITE, true);
  • 45. 03 IO Model โ€ข Overlapped I/O Callback ์žฅ์  ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฒ„ํผ๋กœ ๋ฐ”๋กœ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๋น„์šฉ์ด ์ค„์–ด๋“ ๋‹ค. ๋‹จ์  ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์— ํŠนํ™”๋œ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค. Async / Sync, Blocking / Non-blocking ? ์šด์˜์ฒด์ œ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„๋™๊ธฐ IO ์ž‘์—…์„ ํ•œ ๋’ค IO ์ž‘์—…์ด ๋๋‚˜๋ฉด ๊ทธ ๊ฑธ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Asynchronous ๋ฐฉ์‹์ด๋‹ค. ๋˜ I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ํ•จ์ˆ˜๋Š” ๋ฐ”๋กœ ๋ฆฌํ„ด๋˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋„˜์–ด๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— non-blocking ๋ฐฉ์‹์ด๋‹ค.
  • 47. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Routine A Coroutine Routine B
  • 48. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A Routine A ์ž‘์—… ์ง„ํ–‰
  • 49. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ์ด ์‹œ์ ์—์„œ Coroutine ํ˜ธ์ถœํ•˜์—ฌ Coroutine์˜ ์ผ๋ถ€ ์ˆ˜ํ–‰
  • 50. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ๋‹ค์‹œ ์›๋ž˜ ํ•จ ์ˆ˜ ํ˜ธ์ถœํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋˜ ๋ถ€ ๋ถ„๋ถ€ํ„ฐ ๋‹ค์Œ ๋ถ€๋ถ„ ์ง„ํ–‰
  • 51. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ์ด ๋•Œ ๋‹ค๋ฅธ ๋ฃจ ํ‹ด B์—์„œ ์ž๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
  • 52. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ์ด ์‹œ์ ์—์„œ Coroutine ํ˜ธ์ถœ. ์ด์ „ ํ˜ธ ์ถœ ์ง€์ ์—์„œ ๋ถ€ํ„ฐ ์ด์–ด์„œ ์ง„ํ–‰๋จ.
  • 53. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ๋‹ค์‹œ ์›๋ž˜ ํ•จ ์ˆ˜ ํ˜ธ์ถœํ•ด์„œ ํ•˜๋˜ ์ž‘์—… ๋ ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ
  • 54. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ์ด ๋•Œ ๋ฃจํ‹ด A์—์„œ ๋‹ค์‹œ Coroutine ํ˜ธ์ถœํ•˜๋ฉด ์ด ์ „ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ด์–ด์„œ ์ง„ํ–‰
  • 55. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. Coroutine Routine BRoutine A ๋‹ค์‹œ ๋ฃจํ‹ด A ํ˜ธ์ถœํ•˜์—ฌ ๋‚˜๋จธ์ง€ ์ˆ˜ํ–‰
  • 56. Bonus Coroutine โ€ข Coroutine ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœํ•œ ์ชฝ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์‹œ ๋‹ค๋ฅธ routine์—์„œ ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ์ง€์ ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— ๋น„๋™๊ธฐ์ ์ธ ๋กœ์ง ์ฒ˜๋ฆฌ์— ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. AI์˜ FSM ๊ตฌํ˜„ ๋“ฑ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ๋“ฑ์—๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•จ. C++์—์„œ์˜ ์‚ฌ์šฉ C++ ์–ธ์–ด์—์„œ ์ •์‹์œผ๋กœ ์ง€์›ํ•˜์ง€๋Š” ์•Š๊ณ (MS์—์„œ C++ 17 ํ‘œ์ค€์— __resumable / __await ๋ผ๋Š” ์ฝ”๋ฃจํ‹ด ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ œ์ถœํ–ˆ๋‹ค๊ณ ๋Š” ํ•จ) boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฝ”๋ฃจํ‹ด์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค.
  • 57. Bonus Coroutine โ€ข Coroutine ์˜ˆ์ œ ์ฝ”๋“œ template<typename T> using coro_t = boost::coroutines::coroutine<T>; void test(coro_t<void ()>::caller_type& caller) { printf(โ€œfirst testnโ€); caller(); printf(โ€œsecond testnโ€); caller(); } int main() { printf(โ€œfirst mainnโ€); coro_t<void ()> coro(test); printf(โ€œsecond mainnโ€); coro(); if(!coro) { printf(โ€œexitnโ€); } return 0; } ์‹คํ–‰ ๊ฒฐ๊ณผ first main first test second main second test exit
  • 59. End Thank You! โ€ข ์ฐธ๊ณ  ์ž๋ฃŒ โ€ข TCP State ๊ด€๋ จ http://kuaaan.tistory.com/118 http://en.wikipedia.org/wiki/Nagleโ€™s_algorithm โ€ข IO Multiplexing, Sync / Async IO ๊ด€๋ จ http://www.terabit.com.au/docs/Comparison.htm http://icourse.cuc.edu.cn/networkprogramming/lectures/ Unit9_WinSock_Multiplex.pdf โ€ข Coroutine ๊ด€๋ จ http://www.gamedevforever.com/200 http://gamedevforever.com/209 http://www.gamedevforever.com/289