๋๊ธฐ์ ๋น๋๊ธฐ & Blocking๊ณผ Non-Blocking
1. ๋๊ธฐ(Synchronous)์ ๋น๋๊ธฐ(Asynchronous)
- ํจ์๋ฅผ ์คํ์ํด๊ณผ ๋์์ ๋ฐํ ๊ฐ์ด ๊ธฐ๋๋๋ ๊ฒฝ์ฐ๋ ๋๊ธฐ๋ผ ํํํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ๋น๋๊ธฐ๋ผ๊ณ ํํํ๋ค.
- ๋๊ธฐ: ์คํ๋์์ ๋ ๊ฐ์ด ๋ฐํ๋๊ธฐ ์ ๊น์ง๋ Blocking ์ํ์ด๋ค.
- ๋น๋๊ธฐ: Blocking ๋์ง ์๊ณ ์ด๋ฒคํธ ํ์ ๋ฃ๊ฑฐ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์๊ฒ ํด๋น task๋ฅผ ์์ํ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฏ๋ก ๊ธฐ๋๋๋ ๊ฐ์ด ๋ฐ๋ก ๋ฐํ๋์ง ์๋๋ค.
2. Blocking๊ณผ Non-Blocking
๊ฐ๋จํ ๋งํด์ ํธ์ถ๋ ํจ์๊ฐ ํธ์ถํ ํจ์์๊ฒ ์ ์ด๊ถ์ ๊ฑด๋ค์ฃผ๋ ์ ๋ฌด์ ์ฐจ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
1) Blocking I/O
- ํ๋ก์ธ์ค(์ค๋ ๋)๊ฐ ์ปค๋์๊ฒ ์ ์ถ๋ ฅ ์์ ์ ์์ฒญํ๋ recvfrom() ํจ์ ํธ์ถ → ์ปค๋์ด ์์ ์ ์๋ฃํ๋ฉด ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ → ์ ์ถ๋ ฅ ์์ ์ด ์งํ๋๋ ๋์ ์ฌ์ฉ์ ํ๋ก์ธ์ค(์ค๋ ๋)๋ ์์ ์ ์์ ์ ์ค๋จํ ์ฑ ๋๊ธฐํด์ผ ํ๋ค.
- ์ ์ถ๋ ฅ ์์ ์ด CPU ์์์ ๊ฑฐ์ ์ฐ์ง ์์ผ๋ฏ๋ก ์์ ๋ญ๋น๊ฐ ์ฌํ๋ค.
์ฌ๋ฌ Client๊ฐ ์ ์ํ๋ ์๋ฒ๋ฅผ Blocking ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ
์ ์ถ๋ ฅ ์์ ์ ์งํํ๋ ํ๋ก์ธ์ค(์ค๋ ๋) ์ค์ง → ๋ค๋ฅธ Client๊ฐ ์งํ ์ค์ธ ์์ ์ ์ค์งํ๋ฉด ์ ๋๋ฏ๋ก ๋ณ๋์ Clinet Thread๋ฅผ ์์ฑ → ์ ์์ ์๊ฐ ๋งค์ฐ ๋ง์์ง
๊ฒฐ๊ตญ ๋ง์์ง CPU๋ก ๋ฌธ๋งฅ ๊ตํ ํ์๊ฐ ์ฆ๊ฐํ๊ฒ ๋์ด ๋นํจ์จ์ ์ธ ๋์ ๋ฐฉ์์ ๊ฐ์ง๋ค.
2) Non-Blocking I/O
- Blocking ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ํ๋ก์ธ์ค(์ค๋ ๋)๋ ๋ค๋ฅธ ์์ ์ ์งํํ ์ ์๋ค.
- ํ๋ก์ธ์ค(์ค๋ ๋)๊ฐ recvfrom() ํจ์ ํธ์ถ → ์ปค๋์ ๋ฐ๋ก recvBuffer๋ฅผ ์ฑ์์ ๋ณด๋ด์ง ๋ชปํ๋ฏ๋ก "EWOULDBLOCK" ๋ฐํ → recvBuffer์ ์ฌ์ฉ์๊ฐ ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋ Buffer๋ก๋ถํฐ ๋น ๋ฅธ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ ๋ฐ์ดํฐ ๊ธธ์ด์ ํจ๊ป ๋ฐํํ๋ค.
- recvBuffer๋ ์ปค๋์ด ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋์ด ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ฐ ๋ณต์ฌ๋ก ์ธํด ์ ์ถ๋ ฅ๋ณด๋ค ๋น ๋ฅธ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋ค.