์คํฐ๋๋ฅผ ์ด์ํ๊ณ ์์ต๋๋ค. ํด๋น repository์ ๊ฐ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ณด์ค ์ ์์ต๋๋ค!
https://github.com/JulSaMo/CS-start
๐ I/O ์์
์ฃผ๋ก ํ์ผ์ ์ ์ถ๋ ฅ์ ๋ค๋ฃฐ ๋ ํํ ๋ณผ ์ ์๋ค. ๋คํธ์ํฌ์์๋ ํํ ๋ณผ ์ ์๋๋ฐ, ์๋ฅผ๋ค์ด ์์ผ์ read์ send๋ฅผ ์๊ฐํ๋ฉด ๋ ๊ฒ์ด๋ค.
๋ ์ฝ๊ฒ ์๋ฅผ ๋ค์๋ฉด, ๋ ๋ ์ด์์ ์ปดํจํฐ๋ผ๋ฆฌ ์๋ก ๋คํธ์ํฌ๋ฅผ ํตํด ํต์ ์ ํ๋ค๊ณ ๊ฐ์ ํ ๋,
ํ ์ปดํจํฐ์์ ์ถ๋ ฅ(send)ํ๊ณ , ๋ค๋ฅธ ํ ์ปดํจํฐ์์ ์
๋ ฅ(read)์ ๋ฐ๋ ๊ณผ์ ์ ํตํด ํต์ ํ ์ ์๋ค.
I/O ์์ ์ User๋ ๋ฒจ์์ ์ง์ ์ํํ ์ ์๊ณ , ์ค์ IO ์์ ์ ์ํํ๋ ์์น๋ Kernel(์ปค๋, ์ฆ ์ด์์ฒด์ )์์๋ง ๊ฐ๋ฅํ๋ค. ์ ์ ํ๋ก์ธ์ค (or ์ค๋ ๋)๋ ์ปค๋์๊ฒ ์์ฒญ์ ํ๊ณ ์์ ์๋ฃ ํ ์ปค๋์ ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆด ๋ฟ์ด๋ค.
์๋ ๋๋ํ ๊ฐ๋ฐ์ TV ์ ์๋์ ์์์ ๋ณด๋ฉด, user ์์ kernel๋ก file open ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ๊ฒ kernel์์ ์ฒ๋ฆฌ๋ ๋ block๊ณผ non-blocking์ด ์ด๋ค ์์ธ๋ฅผ ์ทจํ๋์ง ์์ธํ๊ฒ ์ค๋ช ํด์ค๋ค.
https://www.youtube.com/watch?v=XNGfl3sfErc
๐ ์ ๊น, ๊ณต๋ถํ๊ธฐ์ ์ ์๊ณ ๋์ด๊ฐ ๊ฐ๋
๐ธ ์์ผ (Socket)
๋คํธ์ํฌ ์์์ ๋์ํ๋ ํ๋ก๊ทธ๋จ ๊ฐ ํต์ ์ ์ข ์ฐฉ์ ์ด๋ค. (Endpoint) ๊ฐ๋จํ ๋งํด์๋ ํน์ ๋ฌธ์๋ค์ ์กฐํฉํ์ฌ ๋ง๋ ๋คํธ์ํฌ ์ฃผ์์ด๋ค.
์์บฃ์ ํ๋ก์ธ์ค๊ฐ ๋คํธ์ํฌ ์ธ๊ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๊ฑฐ๋ ํน์ ๋คํธ์ํฌ ์ธ๊ณ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ธฐ์ํ ์ค์ ์ ์ธ ์ฐฝ๊ตฌ ์ญํ ์ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์์ผ์ ์ด์ด์ ์์ผ์ ๋ฐ์ดํฐ๋ฅผ ์จ๋ณด๋ด๊ฑฐ๋, ์์ผ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ฌ์ผํ๋ค.
๐ ์์ผ์ ํ๋กํ ์ฝ, IP์ฃผ์, ํฌํธ๋๋ฒ๋ก ์ ์๋๋ค.
- ํ๋กํ ์ฝ: ํต์ ์ ์ํ ํ๊ฒ ์์ฉํ๋๋ก ํด์ฃผ๋ ํต์ ๊ท์ฝ
- IP : ์ ์ธ๊ณ ์ปดํจํฐ์ ๋ถ์ฌ๋ ๊ณ ์ ์ ์๋ณ ์ฃผ์
- ํฌํธ: "๋
ผ๋ฆฌ์ ์ธ ์ ์์ฅ์"์ด๋ค. ํนํ ์ธํฐ๋ท ํ๋กํ ์ฝ์ธ TCP/IP๋ฅผ ์ฌ์ฉํ ๋์๋ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ด ๋คํธ์ํฌ ์์ ํน์ ์๋ฒ ํ๋ก๊ทธ๋จ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋๋ค. ๋คํธ์ํฌ ์์์ ํต์ ์ ํ ๋ IP๋ฅผ ํ ๋๋ก ํด๋น ์๋ฒ๊ฐ ์๋ ์ปดํจํฐ์ ์ ๊ทผํ๋ค. ๊ทธ๋ฐ๋ฐ ํ๋์ ์ปดํจํฐ์์๋ ์ฌ๋ฌ ๊ฐ์ ์๋ฒ๊ฐ ์คํ๋ ์ ์๋ค. ์ปดํจํฐ์ ์ฌ๋ฌ ๊ฐ์ ์๋ฒ๊ฐ ์คํ๋๊ณ ์๋ค๋ฉด ์ด๋ ์๋ฒ์ ์ ์ํด์ผํ๋์ง ์๋ ค์ฃผ์ด์ผํ๋ค. ์ด๋ ์ฌ์ฉ๋๋ ๊ฒ์ด "ํฌํธ๋๋ฒ" ์ด๋ค. (๋ ์์ธํ ์ฐธ๊ณ : https://study-recording.tistory.com/13)
๐ ์์ผ ํต์ ์ ํ๋ฆ (๊ฐ๋จํ๊ฒ ์ด๋ ๊ฒ ๋์ํ๋ค, ๊น์ง๋ง ์๊ณ ๋์ด๊ฐ๋ณด์.)
๐ธ recvfrom()
C์ธ์ด์์ UDP/IP ํต์ ์์ ์์ผ์ผ๋ก๋ถํฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ํจ์์ด๋ค. (์ฌ๊ธฐ๊น์ง๋ง ๋ฑ ์๊ณ ์์!)
๐ธ EWOULDBLOCK
๐ Blocking I/O (๋ธ๋กํน)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ I/O ๋ชจ๋ธ๋ก, Linux์์์ ๋ชจ๋ ์์ผ ํต์ ์ ๊ธฐ๋ณธ Blocking ์ผ๋ก ๋์ํ๋ค.
I/O ์์
์ด ์งํ๋๋ ๋์ ์ ์ ํ๋ก์ธ์ค๋ ์์ ์ ์์
์ ์ค๋จํ ์ฑ ๋๊ธฐํ๋ ๋ฐฉ์์ด๋ค.
1. ์ ์ ๋ ์ปค๋์๊ฒ read ์์ ์ ์์ฒญํ๊ณ (์ ์ด๊ถ์ ๋๊ฒจ์ค๋ค)
2. ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋ ๋ ๊น์ง ๋๊ธฐํ๋ค๊ฐ (์ ์ด๊ถ์ ๋๊ฒจ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ๋ค. ์๊ธฐ ์์ ์ ์ ์ดํ ์ ์๋ค.)
3. ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋๋ฉด ์ ์ ์๊ฒ ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ๋์ด์ผ๋ง ์ ์ ์์ ์ ์์ ์ ๋น๋ก์ ๋ณต๊ทํ ์ ์๋ค. (์ ์ด๊ถ์ ๋๊ฒจ๋ฐ๋๋ค)
๋ง๊ทธ๋๋ก block์ด ๋๊ณ , ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ค๋ฅธ ์์ ์ ์ํํ์ง ๋ชปํ๊ณ ๋๊ธฐํ๊ฒ ๋๋ฏ๋ก, ์์์ด ๋ญ๋น๋๋ค.
๐ Non-Blocking I/O (๋ธ๋กํน)
์์ ๊ฐ์ blocking๋ฐฉ์์ ๋นํจ์จ์ฑ์ ๊ทน๋ณตํ๊ณ ์ ๋์
๋ ๋ฐฉ์์ด๋ค.
I/O์์
์ด ์งํ๋๋ ๋์ ์ ์ ํ๋ก์ธ์ค์ ์์
์ ์ค๋จ์ํค์ง ์๋ ๋ฐฉ์์ด๋ค.
1. ์ ์ ๊ฐ ์ปค๋์๊ฒ read์์ ์ ์์ฒญํ๋ฉด
2. ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ์ด ๋๋ ์๋๋ ์์ฒญํ๋ ๊ทธ ์๊ฐ, ๋ฐ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ค.
์ด๋ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ ๊ฒฐ๊ณผ ๋ฉ์ธ์ง (EWOULDBLOCK)์ ๋ฐํํ๋ค.
3. ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๊น์ง 1,2๋ฒ์ ๋ฐ๋ณตํ๋ค. → 2๋ฒ์์ ๊ฒฐ๊ณผ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ์ ์ ๋ ๋ค๋ฅธ ์์ ์งํ์ด ๊ฐ๋ฅํ๋ค.
(์ ์ด๊ถ์ ๋๊ฒจ์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์, ๊ณ์ํด์ ๋ณธ์ธ์ ์์ ์ ์ด์ด๊ฐ ์ ์๋ค.)
4. ์ ๋ ฅ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ ์ ์๊ฒ ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ๋๋ค.
์ด ๊ฒฝ์ฐ I/O์ ์งํ์๊ฐ๊ณผ ๊ด๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ (๋๊ธฐํ์ง ์์์) application์์ ์์ ์ ์ค๋ ์๊ฐ ์ค์งํ์ง ์๊ณ I/O์์ ์ ์งํํ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ณต์ ์ผ๋ก ์์คํ ํธ์ถ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ ์ญ์ ์์์ด ๋ญ๋น๋๋ค.
๐ I/O ์ด๋ฒคํธ ํต์ง ๋ชจ๋ธ
๋ฒ์ธ๋ก Non-blocking ์ ์ ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ ์๋ ๋ชจ๋ธ๋ค์ด๋ค. I/O์ด๋ฒคํธ ํต์ง ๋ฐฉ์์๋ Async/Sync ๋ชจ๋ธ๋ก ๋ถ๋ฅ๊ฐ ๊ฐ๋ฅํ๋ค.
์ฆ, Blocking / Non-Blockiing / Async / Sync ๋ฅผ ํฌ๋ก์ค์ค๋ฒํ 4๊ฐ์ง์ ์ข ๋ฅ๊ฐ ์๋ค.
ํด๋น ๋ชจ๋ธ๋ค์ ๋ํ ์ค๋ช ์ ์๋ ๊ธ์์ ๋ ์์ธํ๊ฒ ๊ณต๋ถ๊ฐ ๊ฐ๋ฅํ๋ค!
https://didu-story.tistory.com/306
๐ Reference
https://ju3un.github.io/network-basic-1/
'Computer > Computer Science' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Operating System] (iOS) PCB์ Context Switching (4) | 2022.09.07 |
---|---|
[Operating System] (iOS) System Call (์์คํ ์ฝ, ์์คํ ํธ์ถ์ด๋?) (0) | 2022.09.07 |
[Network] HTTP์ HTTPS์ ๋์๊ณผ์ ์ค๋ช ํ๊ธฐ (2) | 2022.09.05 |
[Network] TCP์ UDP์ ๊ฐ๋ , ๊ณตํต์ , ์ฐจ์ด์ (0) | 2022.09.04 |
[Network] (Swift) Blocking๊ณผ Non-Blocking , Sync์ Asyn์ ์ฐจ์ด๋? (0) | 2022.09.04 |