I/O์ Sync์ Blocking ๊ทธ๋ฆฌ๊ณ Multiplexing
by JiwonDevํด๋น ๊ธ์ ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ์ ๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค. ์ฐธ๊ณ ๋ก I/O๋ ํ์ผ ์ ์ถ๋ ฅ (Input/Output)์ ์๋ฏธํฉ๋๋ค.
Everything is a FIle
Server ๋ด์์ ์ฝ๊ณ ์ฐ๋ ๊ฒ๋ ํ์ผ I/O ์ด๊ณ
Server-Client ๊ฐ ๋คํธ์ํฌ ํต์ ์ ํ ๋ ์ฐ๋ ๊ฒ๋ ํ์ผ I/O์
๋๋ค.
๋ฌด์จ ํ์๋ฆฐ๊ฐ ์ถ์ง๋ง, ๋ฆฌ๋
์ค์์ ๋คํธ์ํฌ ํต์ ์ ์ฌ์ฉํ๋ socket ๋ ๊ฒฐ๊ตญ์๋ File Descriptor๋ก ๊ด๋ฆฌ๋๋ ํ๋์ ํ์ผ์
๋๋ค. Low-Level์ ํ์ผ ํธ๋ค๋ง์ ๊ธฐ๋ฐ์ผ๋ก socket ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ก์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฆ, ์์ผ ํต์ ์ ํ๋ ๋คํธ์ํฌ I/O๋ ๊ฒฐ๊ตญ ์ด์์ฒด์ ์์ ํ์ผ์ ๋ค๋ฃจ๋ ๊ฒ๊ณผ ๊ฐ๋
์ ๋ค๋ฅด์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ํ์ผ์
๋๋ค.
# ํ์ผ I/O์ ์ข ๋ฅ
ํ์ผ ์ ์ถ๋ ฅ์ user ์์ญ์์ ์ง์ ์ํ ํ ์ ์๊ธฐ๋๋ฌธ์ user process๊ฐ ์ด์์ฒด์ ์ปค๋์ I/O ์์ ์ '์์ฒญ'ํ๊ณ '์๋ต'์ ๋ฐ๋ ๊ตฌ์กฐ์ ๋๋ค. ์ฌ๊ธฐ์์ ์๋ต์ ์ด๋ค ์์๋ก ๋ฐ๋์ง (synchronous/asynchronous), ์ด๋ค ํ์ด๋ฐ์ ๋ฐ๋์ง(blocking/non-blocking)์ ๋ฐ๋ผ ํ์ผ์ ๋ค๋ฃจ๋ ์ฌ๋ฌ ๋ชจ๋ธ๋ก ๋ถ๋ฅ๊ฐ ๋ฉ๋๋ค.
์์ ์ ์์๋ฅผ ๋ณด์ฅํ๋ค๋๊ฒ ๋ฌด์จ๋ง์ด์ฃ ?
์์ ์ ์์๋ฅผ ๋ณด์ฅํ๋ค๋ ๊ฒ์ 'ํ์ฌ ์์ ์ ์๋ต'์ ๋ฐ๋ ์์ ๊ณผ '๋ค์ ์์ ์ ์์ฒญ'ํ๋ ์์ ์ ๋ง์ถ๋ ์ผ์ ๋๋ค. ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ์ฝ์ต๋๋ค. ๋ค์ ์์ ์ด ์๋ค๋ ๊ฒ ์์ฒด๊ฐ ์์๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ์ด์ ์์ ์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง ๋ค์ ์์ ์ด ์ํ๋์ง ์์ต๋๋ค.
์์ ์๊ด์๋ ์์ ์ด๋๋ผ ํ๋๋ผ๋ ์์๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ๋ณ ์ง์ฐ์ด ๋ฐ์ํฉ๋๋ค.
@ Synchronous, ๋๊ธฐ
์์ ์ ์์๊ฐ ์์ผ๋ฉฐ, ํ ์์ ์ด ๋๋ ํ ๋ค์ ์์ ์ ์คํํฉ๋๋ค.
- ๋ชจ๋ I/O ์์ฒญ-์๋ต ์์ ์ด ์ผ๋ จ์ ์์๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์ฆ ์์ ์ ์์๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
- ์์ ์๋ฃ๋ฅผ user ์์ญ์์ ํ๋จํ๊ณ , ๋ค์ ์์ ์ ์ธ์ ์์ฒญํ ์ง ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.
- ์ผ๋ จ์ ํ์ดํ๋ผ์ธ์ ์ค์ํ๋ ๊ตฌ์กฐ์์ ํจ์จ์ ์ ๋๋ค.
@Asynchronous, ๋น๋๊ธฐ
์์ ์์๋ฅผ ๊ณ ๋ ค์ํ๊ณ ์ฌ๋ฌ ์์ ์ ๋์์ ํฉ๋๋ค. (* ๊ฐ ์์ ์ด ๋ ๋ฆฝ์ ์ด๋ผ ๋์์คํ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ)
- ์ปค๋์ I/O ์์ ์ ์์ฒญํ๋ค ๋ฐ๋ก ๋ค๋ฅธ ์์ ์ ํ ์ ์์ต๋๋ค. ํ๋ ์์ ์ ์์๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค.
- ์์ ์ด ์๋ฃ๋๋ฉด ์ปค๋ ์์ญ์์ ํต๋ณด๋ฅผ ํด์ค๋๋ค. ์ ์ด๊ถ์ด ์์ด user ์์ญ์์ ํ๋จ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฐ ์์ ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์์ ์คํ๊ฐ๋ฅํฉ๋๋ค. ์์ ๋ณ ์ง์ฐ์ด ํฐ ๊ฒฝ์ฐ ํจ์จ์ ์ ๋๋ค.
@Blocking, ๋ธ๋กํน
ํด๋น ์์ ์ ๋ฐํ ๊ฐ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ ์ด๊ถ์ ๋ฐํ๊ฐ์ ์ฃผ๋ ์์ ์ด ๊ฐ์ง๊ณ ์๊ธฐ์ ๊ณ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
- ์์ฒญํ ์์ ์ด ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ, ์๋ฃ๋ ๋ ์๋ต๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ต๋๋ค. ( ๋๊ธฐ ๆ )
- ์์ฒญํ ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
@Non-Blocking ๋-๋ธ๋กํน
ํด๋น ์์ ์ ๋ฐํ ๊ฐ์ ๊ธฐ๋ค๋ฆฌ์ง์๊ณ ๋ค๋ฅธ ์ผ์ ํฉ๋๋ค. ์์ฒญํ์๋ง์ ๋ฐ๋ก ์ ์ด๊ถ์ ๋๋ ค๋ฐ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ์์ ์ ํ ์ ์์ต๋๋ค. ๋ค๋ง ์ค๊ฐ์ ์ํํ์ธ(polling)์ ๊ณ์ํ์ฌ ๋ฐํ ๊ฐ์ด ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
- ์์ ์์ฒญ ์ดํ ๊ฒฐ๊ณผ๋ ๋์ค์ ํ์ํ ๋ ์ ๋ฌ๋ฐ์ต๋๋ค. ( ๋๊ธฐ ็ก )
- ์์ฒญํ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
- ์ค๊ฐ์ค๊ฐ ํ์ํ ๋ ์ํ ํ์ธ์ ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค. (polling)
@ Non-Blocking ๊ณผ asynchronous์ ์ฐจ์ด
์์ฒญ๋ I/O ์์ ์์๊ฐ ๋ณด์ฅ(synchronous) ๋๊ณ , ๊ฐ ์์ ๋ง๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์(blocking) ๋ณด๋ ๋ฐฉ์์ด ๊ฐ์ฅ ํํฉ๋๋ค. ๊ทธ๋์ sync์ blocking ๊ฐ๋ ์ ํผ๋ํ๊ธฐ ์ฌ์ด๋ฐ, ์ด ๋๊ฐ๋ ์์ ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ ์ ๋๋ค.
๋น๋๊ธฐ(async) ์์ ์ด ๊ฒฐ๊ตญ non-blocking์ ์๋ฏธํ๋๊ฒ ์๋๋๊ณ ์๋ชป ์ดํดํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์๋ฅผ ๋ค์ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ block๋ ๋์ ์์ ๋ค๋ฅธ ์์ ์ด ์์ํ ์ ์๋ ์๋๋ ์์์ ๋ฌธ์ ์ด๋ฏ๋ก sync/async์ ๊ด๋ จ๋ฉ๋๋ค. ๋ณดํต์ ์์ ์์ด ์ฌ๋ฌ ์์ ์ ์ฒ๋ฆฌํ๋ ์ํฉ(async)์์ ํ ์์ ์ ์์ํ ๋ค ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ๊ฒ๋ ์ฒ๋ฆฌ(non-blocking)ํด์ผ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ [๊ฐ ์์ ๋ค์ด ์๋ก ์๊ด์ด ์์ด ๋ ๋ฆฝ์ ์ธ ๊ฒฝ์ฐ] ๊ฐ ๋ง์์ต๋๋ค. ๋๋ฌธ์ ๋ณดํต non-blocking ์์ ์ ๊ฒฝ์ฐ์ ์์ ์์, ์ฆ ์ข ๋ฃ์์ ์ด ๋ฌ๋ผ๋(async) ์๊ด ์๋๊ฒ ๋๋ถ๋ถ์ด์์ ๋ฟ์ ๋๋ค.
์ฆ non-blocking(์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋ ๊ฒ)๊ณผ asynchronous(์์ ์ ์์๊ฐ ์๋ ๊ฒ)์ ์๋ก ๋น๊ต๋๋ ๊ฐ๋ ์ด ์๋๋๋ค.
# ์ฌ๋ฌ๊ฐ์ง I/O ์ฒ๋ฆฌ ๋ฐฉ์( I/O Model )
sync/async์ block/non-block์ ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์์ ๋ค์ ํ๋ฒ ์๊ธฐํ๋ฉฐ, ํด๋น ํน์ง์์ ์กฐํฉ์ ๋ฐ๋ฅธ I/O Model์ ์์๋ด ์๋ค. ์ฐธ๊ณ ๋ก ์ด 4๊ฐ์ง ๊ฐ๋ ์ ์ ๋งคํ๊ฒ ์์ฑํ๋ ๊ณณ์ด ๋ง๋ค๋ณด๋ ๊ฐ์ ๋ชจ๋ธ์ ์ค๋ช ํ๋๋ผ๋ ๋ช ์นญ์ด ํท๊ฐ๋ฆด ๋๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ธ์ ์๋ฏธ์ ๋ถํฉํ๋ค๊ณ ์๊ฐํ๋ ์ ์๋ฅผ ์ด์ฉํด model์ ๋ถ๋ฅํ๊ณ , ๊ฐ ๋ชจ๋ธ์ ๊ตฌ๋ถ์ง์ด ์์๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋ธ์ O.S์ ๊ตฌํ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ธ๋ถ์ ์ธ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ง๊ธ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฆฌ๋ ์ค ๊ธฐ๋ฐ์ I/O ๋ชจ๋ธ์ ๊ธฐ์ค์ผ๋ก ์์๋ณด๊ฒ ์ต๋๋ค. ์๋์ ๊ทธ๋ฆผ์ ๊ฐ์ฅ ํํ๊ณ ์ ๋ช ํ IBM Developer์ I/O ๋ชจ๋ธ ๋ถ๋ฅ ํ์ ๋๋ค.
4๊ฐ์ง ๋ชจ๋ธ์ ํธ์นญ์ ๋ํ์ฌ
์ฌ์ค I/O Multiplexing ์ด async + blocking ๋ฐฉ์์ธ์ง์ ๋ํด ๋ค์ํ ์๊ฒฌ์ด ์์ต๋๋ค. ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ์์ง๋ง, ์ด๋์ ๊ด์ ์ ๋๋์ ๋ฐ๋ผ blocking, non-blocking์ผ๋ก ๊ฐ๋ฆฌ๊ธฐ๋ํ๋ฉฐ ์ค์ I/O ๋์์ sync ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
์ฌ์ง์ด ๊ฐ ๊ธฐ๋ฒ์ ๋ฐ๋ผ ์ธ๋ถ์ ์ธ ๋ก์ง๊ณผ ๊ฒฐ๊ณผ ์๋ฆผ๋ฐฉ์์ด ๋ฌ๋ผ Multiplexing์ ๋จ์ํ async + blocking ๋ฐฉ์์ด๋ผ๊ณ ์ค๋ช ํ๋๊ฑด ์ ๋งคํฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ง ์์งํ ์ฑ, ํด๋น ๋ชจ๋ธ์ด ์ด๋ค๊ธฐ๋ฒ์ ์ฌ์ฉํ๋์ง ์์ฃผ๋ก ์ดํดํ๋๊ฑธ ์ถ์ฒํฉ๋๋ค.
- Synchronous Blocking I/O → [ Blocking I/O ]
- Synchronous Non-Blocking I/O → [ Non-Blocking I/O ]
- Asynchronous Blocking I/O → [ I/O Multiplexing ]
- Asynchronous Non-Blocking I/O → [ Asynchronous I/O ]
@1. Blocking I/O (sync + blocking)
๊ฐ์ฅ ํํ๊ฒ ์ฌ์ฉํ๋ I/O ๋ชจ๋ธ๋ก user ๊ณต๊ฐ์ ์กด์ฌํ๋ process๋ ์ด์์ฒด์ ์ปค๋์๊ฒ I/O๋ฅผ ์์ฒญํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. (system call) ๊ทธ๋ฆฌ๊ณ ์ปค๋์ด ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๊น์ง ์ค๋จ๋ ์ฑ ๋๊ธฐ(block)ํฉ๋๋ค. ์ด๋ user process๋ CPU๋ฅผ ์ ์ ํ์ง ์์ผ๋ฉฐ ์ปค๋์ ์๋ต์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
์ด ๊ณผ์ ์์ singal์ ์ด์ฉํด system call์ด ์ค์ง๋ ์ ์์ผ๋, ๋ณดํต ์ปค๋์ ์๋ต์ด ๋๋์์ด๊ณผ ๋์์ ๋ฐํ๋ ๊ฒฐ๊ณผ๊ฐ user ๊ณต๊ฐ์ buffer๋ก ๋์์ค๊ฒ ๋๊ณ (sync) ๊ทธ์ ์์ผ user process๋ ๋ง์นจ๋ด unblocking๋์ด ๋ฐํ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
ํธ์ถํ ๋๋ง๋ค I/O ์์ฒญ ์ค๋ ๋๋ฅผ ์์ฑํ๋ฏ๋ก I/O ์ ๊ทผ์ด ๋ง์์ง๊ฒ ๋๋ค๋ฉด ํ ์์ ๋น ํ๋์ context-switching์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๋ํ block ๋ user process ๋ ์ปค๋์ ๊ฒฐ๊ณผ์๋ต์ด ์ค๊ธฐ์ ๊น์ง CPU๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ์ฌ์ฉ ํจ์จ๋ ๋์ฉ๋๋ค.
@2. Non-Blocking I/O (sync + non-blocking)
@1์์ Non-blockํ๊ฒ ๋์ํ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด socket ์์ฑ ์ O_NONBLOCK ์ต์ ์ ์ฃผ๋ฉด ๋ฉ๋๋ค. ํด๋น socket์ผ๋ก ์ปค๋์ I/O ์์ฒญ, ์ฆ [ I/O system call ]์ ํ๊ฒ๋๋ฉด block ์์ด ์์ฒญ ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ต๋๋ค.
block๊ณผ ๋ค๋ฅด๊ฒ ๋ฐํํ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์ง ์์๋๋ผ๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ -1 ์ ๋์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฐํ์ด ๋ถ๊ฐ๋ฅํ์ง์ ๋ํ ์ค๋ฅ ์ฝ๋(errno)๋ฅผ ๊ฐ์ด ์ ๊ณตํฉ๋๋ค. ๋ณดํต ์ค๋ฅ์ฝ๋๋ก EAGAIN ๋๋ EWOULDBLOCK์ ๋ฐํ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์์ฒญ ๊ฒฐ๊ณผ์ errno๋ฅผ ์ฆ์ ๋ฐ์๋ณด๊ณ ์ปค๋์ ๋ ๋ฌผ์ด๋ณผ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ I/O ์์ ์ด ์๋ฃ๋์ง ์์๋ user process๋ block ๋์ง ์์ต๋๋ค. ์์ฒญํ [ I/O system call ] ์ ๋ํด ์ปค๋์ด user process๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋๊ฒ ์๋๋ผ ์์ง ๋๋์ผ๋ฉด ๋๋๋ค๊ณ ๋ฌผ์ด๋ณผ ๋ ๋ง๋ค ์๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ user process๊ฐ ์ ์ด๊ถ์ ๋ฐํ๋ฐ๊ณ ๋๋ฉด ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ Blocking I/O๋ณด๋ค ๋ ์ข์ ๋ชจ๋ธ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํ์ง๋ง non-blocking์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ user process๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ ๋๊น์ง ๊ณ์ํด์ ์ปค๋์ ์ํ๋ฅผ ์ฒดํฌํด์ผํฉ๋๋ค. (์ด๋ฅผ ๋ณดํต busy-wait์ด๋ผ ํํํฉ๋๋ค.)
๋๊ธฐ์(sync)์ผ๋ก ๋์ํ๊ธฐ์ user process๋ block๋ง ์๋์์ ๋ฟ, ํ์ฌ ์์ ์ด ์๋ฃ ๋ ๋๊น์ง ๋ค๋ฅธ ์ผ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ I/O ์๋ฃ๋ง ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๊ณ์ context-switching๋ฅผ ์ผ์ผํค๋ ๊ตฌ์กฐ์ธ๊ฑฐ์ฃ . ๋ํ ๊ณ์ํด์ ์ปค๋ ์ํ๋ฅผ ์ฒดํฌํด์ผํ๋ ์ ์ ํ polling ์ฃผ๊ธฐ๊ฐ ํ์ํ๋ฐ ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ๊ธธ ๊ฒฝ์ฐ ์ค๋น๊ฐ ์๋ฃ๋์์์๋ ๋ฆ๊ฒ ์์ฒญํ์ฌ ์ง์ฐ์ด ์๊ธธ ์ ์๊ณ ๋ฐ๋๋ก ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ์งง์ผ๋ฉด ์ปค๋์์ ์๋ฏธ์๋ ์์ฒญ ๋ฐํ์ ๊ณ์ํด์ค์ผํ๋ I/O ์์ ์ ์ง์ฐ์ ์ด๋ํ ์ ์์ต๋๋ค.
์์ ์ดํด๋ณธ Syncronous ๋ชจ๋ธ์ Block์ด๋ Non-Block ์ด๋ ๊ฒฐ๊ตญ ์์ฒญํ ์์๋๋ก ์์ ์ ์๋ฃ์ํต๋๋ค. ์ด๋ฐ ๋ฐฉ์์ ์์ ์ ํ๋ฆ์ด ์ง๊ด์ ์ด์ง๋ง 2๊ฐ ์ด์์ ํ์ผ์ ๋์์ ๋ค๋ฃฐ ๋์๋ multi-process ๋๋ multi-thread๋ก ๊ตฌํํด์ผ ํฉ๋๋ค. ํ์ง๋ง ๋ฉํฐ์ฐ๋ ๋, ๋ฉํฐํ๋ก์ธ์ค๋ก ๊ตฌ์ฑํ๊ฒ๋๋ฉด IPC๋ ๋๊ธฐํ(Semaphore, Mutex) ์์ ์ ์ถ๊ฐ๋ก ๊ณ ๋ คํด์ผํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ ์ค๊ณ๊ฐ ๋ณต์กํด์ง๋๋ค. ๊ทธ ๋๋ฌธ์ ๋ค์์ ๋์ฌ @3 Multiplexing, ๋ค์คํ ๊ธฐ๋ฒ์ด ์ฃผ๋ชฉ๋ฐ๊ฒ ๋ฉ๋๋ค.
@3. I/O Multiplexing (async + blocking)
๋ฉํฐํ๋ ์ฑ์ ๋ง์ง๋ง์ ์ ๋ฆฌํด์ ์ฝ๊ฒ ์ค๋ช ํ ๊ฑฐ๋, ์ผ๋จ @4 ๊น์ง ์ญ ์ฝ์ด์ฃผ์ธ์.
์ด ๋ชจ๋ธ์ ๋น๋๊ธฐ๋ธ๋ญ๋ณด๋ค๋ Multiplexing ๋ผ๋ ์ด๋ฆ์ด ์ด์ธ๋ฆฝ๋๋ค. '๋ค์คํ', ์ฌ์ค Multiplexing์ ๊ตฌํ ๋ฐฉ๋ฒ์ด๋ ์ฌ์ฉ์ ๊ด์ , ์๋ฒ ํ๋ก์ธ์ค ๊ด์ , ์ด์์ฒด์ ๊ด์ ์ ๋ฐ๋ผ ๋น๋๊ธฐ, ๋๊ธฐ๊ฐ ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ ํํ๊ฒ๋ ํน์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ I/O ์์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
๋ค์คํ๋ ๊ฐ๋จํ๊ฒ 'ํ๋'๋ฅผ '์ฌ๋ฌ ๊ฐ'์ฒ๋ผ ๋ณด์ด๊ฒ ๋์ํ๋ค๋ ๋ป์ ๋๋ค. ์ด๋ฅผ I/O ๊ด์ ์์ ๋งํ๋ฉด ํ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ ํ์ผ(file)์ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฒ์ด๋ผ๊ณ ํฉ๋๋ค. [ํ์ผ๊ณผ ํ์ผI/O]๋ ํ๋ก์ธ์ค๊ฐ ์ปค๋์ ์ง์ ํ ์ ์๋๋ก ๋ค๋ฆฌ์ญํ ์ ํ๋ ์ผ์ข ์ ์ธํฐํ์ด์ค์ ๋๋ค. ๋ง์ฝ ํ ์ปดํจํฐ๊ฐ ์๋ server-client ๋คํธ์ํฌ ํ๊ฒฝ์ด๋ผ๋ฉด, ํ๋์ server์์ ์ฌ๋ฌ socket, ์ฆ ํ์ผ์ ๊ด๋ฆฌํ์ฌ ์ฌ๋ฌ client๊ฐ ์ ์ ํ ์์๊ฒ ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฒ์์ ๋งํ์ง๋ง socket ๋ํ IP/Port ์ ๋ณด๋ฅผ ๊ฐ์ง ์ผ์ข ์ ํ์ผ์ด๋๊น์.
ํ๋ก์ธ์ค์์ ์ด์์ฒด์ ๋ฅผ ํตํด ํน์ ํ์ผ์ ์ ๊ทผ ํ ๋์๋ File Descriptor(FD,ํ์ผ ํธ๋ค๋ฌ)๋ผ๋ ์ถ์์ ์ธ ๊ฐ์ ์ด์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด FD๋ค์ ์ด๋ป๊ฒ ๊ฐ์ํ๋๋๊ฒ I/O Multiplexing์ ํต์ฌ์ ๋๋ค. ์ฌ๊ธฐ์์ ์ด๋ค ์ํ๋ก ๋๊ธฐํ๋๋์ ๋ฐ๋ผ ์ ๋ง ๋ค์ํ ๊ธฐ๋ฒ๋ค (select, poll, linux_epoll, bsd_kqueue, window_iocp)๋ฑ ๋ค์ํ ๊ธฐ๋ฒ๋ค์ด ๋ฑ์ฅํ์ฃ .
์ฐ์ @1, @2์ ๋์ผํ๊ฒ IBM ์์ ์ ์๋ ๋ถ๋ฅ๊ธฐ์ค์ผ๋ก Async block I/O๋ก ๊ตฌํํ Multiplexing ๋ชจ๋ธ์ ์ดํด๋ด ์๋ค. ์๋์ ๊ทธ๋ฆผ์์ ์ปค๋์ I/O ์์ฒญ์ ๋ฐ์ผ๋ฉฐ ์ฒ๋ฆฌ๋ฅผ ์์ํจ๊ณผ ๋์์ user porcess์๊ฒ ๋ฏธ์๋ฃ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์์์ ์ค๋ช ํ non-blocking์ด๋ ํฌ๊ฒ ๋ค๋ฅธ๊ฒ ์์ฃ . ๊ทธ๋์ ๋ณดํต blocking์ธ์ง non-blocking์ธ์ง ๋ง์ด ํท๊ฐ๋ คํฉ๋๋ค.
๋ช ํํ ๊ตฌ๋ถํ์๋ฉด user process์์ read, write๊ฐ์ I/O ์์ ์์ฒด๊ฐ block๋๋๊ฑด ์๋๋๋ค. select, poll ๊ฐ์ Mutilplexing ๊ด๋ จ [ system call ]์ ๋ํ ์ปค๋์ ์๋ต์ด block ๋๋ค๊ณ ๋ด์ผํฉ๋๋ค.
์ฌ๊ธฐ์ ์ฒซ read ์์ฒญ์ ๋ํด ์ฆ๊ฐ ๋ฏธ์๋ฃ ์ํ๋ฅผ ๋ฐํ๋ฐ๋ non-blocking socket์ ๋์์ ๋ณด์ฌ์ฃผ๋๋ฐ, select์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ read/write system call์ ์ํํ๊ฒ๋ ๊ตฌํํ๋ฉด ์ ๊ทธ๋ฆผ์์ Non-blocking ์์๋ฅผ ์์ ๋๊ฑด ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ํน์ํ ์ํฉ๋ค, ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ(checksum) ์คํจ๋ก ํ๊ธฐ๊ฐ ๋๋ค๋ฉด select()๊ฐ ์ด๋ค FD์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋, ์ฝ์ผ๋ผ๊ณ ์๋ ค์์ ์ฝ์๋ค๊ฐ socket์ด block๋๋ ๊ฒฝ์ฐ๊ฐ ๋์ฌ ์ ์์ต๋๋ค. (๋ฌผ๋ก ์ด๋ด ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ socket์ non-blocking์ผ๋ก ๊ตฌ์ฑํ์ฌ EWOULDBLOCK errno ๋ง ๋ฐํํ๊ฒ๋ ์ค๊ณํ๋๊ฒ ์์ ์ฑ์ ๋ ๋์ผ ์ ์์ต๋๋ค.)
์ด์ด์ ์ปค๋์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ค๋ณด๋ฉด, ์ปค๋์์ ๊ฒฐ๊ณผ ๊ฐ์ด ์ค๋น๋์๋ค๋ callback ์ ํธ๊ฐ ์ค๊ฒ๋ฉ๋๋ค. ๊ทธ๋ผ user process๋ ์์ ์ buffer๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ต๋๋ค. ์ฌ์ค select ๋ฐฉ์์ ์ค์ ๊ตฌํ์ผ๋ก ๋ค์ด๊ฐ๋ฉด select ํธ์ถ ๊ฒฐ๊ณผ๊ฐ ์ ์๋ฏธํ ๊ฐ์ผ๋ก ๋์ฌ ๋ ๊น์ง user process์์ ๋ฃจํ๋ฅผ ๋๋ฉฐ ๋๊ธฐํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ตญ select๋ฅผ ์์ฒญํ user process๊ฐ ๋ฐํ ๊ฐ์ ๋ณด๊ณ ํ์ ์์ ์ ๋ฌด๋ฅผ ํ๋จํ๋ ๊ฒ์ด์ฃ . ์์ธกํ ์ ์๋ ์ฌ๋ฌ I/O ์์ฒญ์ ํ ๋ฒ์ ๊ด๋ฆฌํ๋ ์ธก๋ฉด์๋ ๋น๋๊ธฐ์ด์ง๋ง, ๊ฒฐ๊ตญ ์ค์ ๋ด๋ถ I/O๋์์ ๋๊ธฐ์ ์ธ ๋ฃจํ๋ฌธ์ ๋๊ณ ์์ต๋๋ค.
๋ฉํฐํ๋ ์ค๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ
@4. Asynchronous I/O (AIO, async + non-blocking)
@4 Async I/O ํ๊ฒฝ์์ user process๋ ์ปค๋ I/O system call ์ดํ ์ฒ๋ฆฌ์ ์์ ์ ๊ฒฝ์ฐ๊ณ ์์ง ์๋ค๊ฐ, ์์ ์ด ์๋ฃ๋๋ฉด ์ปค๋๋ก๋ถํฐ ์ ํธ(singal)์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์๋ต์ด ์ค๊ธฐ ์ ๊น์ง user process๋ I/O๋ฅผ ์ ๊ฒฝ์ฐ์ง์๊ณ ๋ค๋ฅธ ์์ ์ ๋์์ ํ ์ ์์ต๋๋ค. (* ๋จ, ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๊ฐ๋ฅํ ๋ค๋ฅธ์์ ์ธ ๊ฒฝ์ฐ)
ํ์ง๋ง ์ํ๊น๊ฒ๋ Linux AIO(Asyn Non-blocking)์์๋ ๊ฐ์๋ง ๋์์ ๋ฟ ์์ง๊น์ง๋ ์์ ํ ํํ์ API๋ก ํด๋น ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๊ทธ๋์ ๋ฆฌ๋ ์ค์์ ์ด์ ๊ฐ์ด ์ฌ์ฉํ๋ ค๋ฉด ์ปค๋์ด ์๋ user ์์ญ์์ POSIX AIO๋ผ๋๊ฑธ ์ฌ์ฉํฉ๋๋ค.
POSXI AIO๋ ์ปค๋์์ ์ ๊ณตํ๋ AIO๋ฅผ ์ฌ์ฉ ํ๋๊ฒ์ด ์๋๋ผ user ๊ณต๊ฐ์ ํ์ ๋ ๊ตฌํ์ฒด์ ๋๋ค. ์ด๋ I/O ์์ ์ ์ํ ์ฌ๋ฌ ์ฐ๋ ๋ ๊ด๋ฆฌํ๋๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋ฌธ์ ์ ์ ์ ๋ฐํฉ๋๋ค.
์ด๋ฏธ ์๋ ์ ๊ฑธ์ณ AIO ์์คํ ์ ๋ง์ ๊ฐ์ ์๋๊ฐ ์ด๋ฃจ์ด์ง๊ณ ์์ต๋๋ค. ๋ฌผ๋ก ํ์ฌ(2021) libaio๋ผ๋ ์ด๋ฆ์ผ๋ก ์ปค๋ ์์ญ์์ ์ ๊ณตํ๋ Linux AIO๊ฐ ์๊ธดํ์ง๋ง ๊ตฌํ์ด ์ด๋ ค์ ์ฌ์ฉํ๊ธฐ์ ์์ ํ ์์ค์ ์๋๋๋ค.
# I/O ๋ฉํฐํ๋ ์ฑ์ ๋ํ์ฌ
- ๋ฉํฐํ๋ ์ฑ์ ๋ฑ ๋ญ์ ์ํ๋ค๊ณ ๋งํ๊ธฐ ์ ๋งคํ๋ค. ๋๊ฒ๋ณด๋ ์ข๊ฒ๋ณด๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
- ๋ ธ๋๋ ์ฌ์ฉ์ ์์ฒญ์ ๋จ์ผ ์ค๋ ๋๋ก ๋ฐ๋๋ค
- I/O๋ ์ด๋ฒคํธ ๋ฃจํ(callback)๊ธฐ๋ฐ์ผ๋ก Syncํ๊ฒ ๋์.
- ์์๋ฅผ ์์ธก ํ ์์๋ ์ฌ๋ฌ ์ปค๋ I/O์์ฒญ๋ค์ select๋ฑ์ ๊ธฐ๋ฒ์ผ๋ก ํ๋ฒ์ ๋ชจ์ ๊ด๋ฆฌํ๋ ์ธก๋ฉด์์ Asyncํ๋ค๊ณ ๋ ๋ณผ์์๋ค.
- ํ์ง๋ง ์ปค๋์ ์๋ต๋ค์ ๋ฐ๋ select์ ์ด๋ฒคํธ ๋ฃจํ๋ ๋จ์ผ์ค๋ ๋/๋๊ธฐ๋ก ๋๊ณ ์๋๊ฑด ๋ณํจ์๋ค.
- ์ฆ I/O ๋ฉํฐํ๋์ฑ์ ํ๋ก์ธ์ค์์ ํ๋์ ์ค๋ ๋๋ก Syncํ๊ฒ ๋์๋๋ค. -> ์ฆ ์ฝ์ด๋ ํ๋๋ง ๋๋ค.
- Node๋ ๋์์ฑ์ ๊ฐ๋ฅํ์ง๋ง ๋ณ๋ ฌ์ฑ์ ๋ถ๊ฐ๋ฅํ๋ค.
Node-MySQL๋ก ์๋ฅผ ๋ค์ด๋ณด๋ฉด, ๋ฉํฐํ๋ ์ฑ์ ๋ค์คํ์ผ ์ด๋ฒคํธ๊ธฐ๋ฐ ์ฒ๋ฆฌ๋ ์ด์ฐจํผ Node์์ ๋น๋๊ธฐ/๋ ผ๋ธ๋ญ ๋ฉํฐ์ค๋ ๋๋ก select๋ฅผ ๊ตฌํ ํ๋ค MySQL์์ ๋ธ๋ก๋นํ๊ธฐ์ ์ด๋ฒคํธ์ฒ๋ฆฌ ๋ฃจํ๊ฐ ๋๊ธฐํ๊ฒ๋๋ค. ๊ทธ๋์ ์ฑ๊ธ์ค๋ ๋/๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ์ฑ๋ฅ์ด ํฌ๊ฒ ๋ค๋ฅด์ง์๋ค.์ด๋ ๊ฒ ๋ ธ๋์ฒ๋ผ ์ฑ๊ธ ์ค๋ ๋๋ก ์ฌ์ฉ์ ์์ฒญ๊ณผ I/O callback์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ค๋ ๋ ์ฅ์ ์ ๋์ํ๊ฒ ์ค๊ณํ๊ธฐ ์ด๋ ต๋ค. ํด๋น ์์ ์ ๋์ฒดํด์ค ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์์ผ๋๊น์ค์ ๋ก node๋ ๊ฐ๊ฐ์ ์์ ์ด ๊ฑฐ๋ํ๊ฒฝ์ฐ ์ ํฉํ์ง ์์ ์ ํ์ด๋ค. (=๋ด๋ถ์ ์ธ ์์ ํ์ ๋๊ธฐํ๋ ์์ฒญ์ด ๋ง์์ง๋ค. ์ฐธ๊ณ ๋ก ๋ ธ๋์ V8์์ง์ ๋ฉํฐ์ค๋ ๋ API๋ฅผ ์ง์ํ์ง์๋๋ค)
# ๋ฉํฐํ๋ ์ฑ์ ๋ํ ์ธ์ค ์์ฝ
1. ์ด์์ฒด์ ์ปค๋์ ๋น๋๊ธฐ/๋ธ๋ญ์ผ๋ก ๋๊ณ ์๋๋ฐ ๊ทธ๊ฑธ callback์ผ๋ก ๋ฐ์์ฐ๋ [๋ฉํฐํ๋ ์ฑ I/O ์๋ฒ]๋ ๋๊ธฐ/๋ธ๋ญ์ด๋ค.
2. ํ์ง๋ง ์ฌ์ฉ์ ์
์ฅ์์๋ ์ฝ๋ฐฑํจ์๋ก ๋น๋๊ธฐ/๋
ผ๋ธ๋กํน์ฒ๋ผ ์ธ ์ ์๋ค. (* ๋ธ๋กํน์ด ํ์ํ ์์
์ด ์๋๊ฒฝ์ฐ)
3. ์ฆ ์ฌ์ฉ์, ์๋ฒ, ์ด์์ฒด์ ์ ๊ด์ ์ ๋ฐ๋ผ ๋ธ๋กํน, ๋ ผ๋ธ๋กํน, ๋๊ธฐ, ๋น๋๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
'๐๊ธฐ๋ณธ ์ง์ > CS ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์ธ๋ฑ์ค์์๋ ์ HashTable์ ์ฌ์ฉํ์ง ์์๊น? (0) | 2024.01.10 |
---|---|
๋คํธ์ํฌ L4, L7 ๋ก๋๋ฐธ๋ฐ์ฑ (Load balancing) (0) | 2021.09.08 |
์ ์์ผ๊ณผ ์ต์คํธ๋ฆผ ํ๋ก๊ทธ๋๋ฐ(Agile , XP) (0) | 2021.08.25 |
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค(DB Isolation Level) (0) | 2021.08.10 |
Java์์์ ์๊ณ์์ญ๊ณผ ๋ฐ๋๋ฝ ํด๊ฒฐ (sync, ๋ชจ๋ํฐ) (0) | 2021.07.28 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev