Blocking,Non Blocking, Synchronous, Asynchronous - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
Sync,Async,Blocking, Non-Blocking
sync,async๋
์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ํน์ง
(I/O ๋ชจ๋ธ) blocking,non-blocking I/Oํธ์ถํ ์ ์ฅ์์์ ํน์ง
(์ด๋ฒคํธ ํต์ง ๋ชจ๋ธ)
-
async
- ์์ ์ ์คํํ๊ณ ์์ฒญ ์ค๋ ๋๋ ๋ค๋ฅธ ์์ ์ ์คํ
- ํด๋น ์ค๋ ๋๊ฐ ์ฃฝ๋ ์ง ๋ง๋ ์ง don't care
- ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์
-
sync
- ์ด๋ฒคํธ๋ฅผ ์์ ์ด ์ง์ ์ฒ๋ฆฌ(ํ์ธ์ ์ฃผ์ฒด๊ฐ ์ ์ ํ๋ก์ธ์ค์ด๋ฉฐ, ๋ค ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ค์ค๋ก ํ์ธ)
- ๋ฉ์๋,์์ ๋ฑ์ ์คํํ๊ณ ํด๋น ๋ฉ์๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ฌ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์
-
block
- ์๋ฃ๊น์ง ๋๊ธฐ(๋ฆฌํด๋๊ธฐ ์ ๊น์ง ๋ฉ์ถค)
-
non-block
- ๋ฏธ์๋ฃ๋ผ๋ ์ฆ์ ๋ฆฌํด
I/O๋ฅผ ์ฒ๋ฆฌํ ๋ ์ด๋ป๊ฒ ์กฐํฉ์ ํ๋์ ๋ฐ๋ผ์ 4๊ฐ์ง ๋ชจ๋ธ๋ก ๊ตฌ๋ถํ ์ ์๋ค. 4๊ฐ์ง ๋ชจ๋ธ์ ํ์ค์ธ๊ณ์ ๋น์ ํด์ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
Synchronous Blocking
1. ์นดํ์ ๊ฐ์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธ
2. ์๋๊ฐ ์์ผ๋ฉด ์ปคํผ๋ฅผ ๋ด๋ ค์ค๋ค.
3. ์๋๊ฐ ์๋๊ฒฝ์ฐ "์ ๊น๋ง์ ์ฌ๊ธฐ์ ๊ธฐ๋ค๋ ค์ฃผ์ธ์" ํ๊ณ ์ฌ๋ฌ๊ฐ๋ค.
4. ์ปคํผ๊ฐ ๋ง๋ค์ด์ก๋์ง ์๋ง๋ค์๋์ง ๋ด๊ฐ ๊ณ์ ํ์ธํ๋ค.
Synchronous Non-Blocking
1. ์นดํ์ ๊ฐ์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธ
2. ์๋๊ฐ ์์ผ๋ฉด ์ปคํผ๋ฅผ ๋ด๋ ค์ค๋ค.
3. ์๋๊ฐ ์๋๊ฒฝ์ฐ "์๋์ฌ์ ์ค๋๋์ ์ ๊น ๋ค๋ฅธ์ผ ํ์ธ์"ํ๊ณ ์๋๋ฅผ์ฌ๋ฌ๊ฐ๋ค.
4. ์ปคํผ๊ฐ ๋ง๋ค์ด์ก๋์ง ์๋ง๋ค์๋์ง ๋ด๊ฐ ๊ณ์ ํ์ธํ๋ค.
Asynchronous Blocking
1. ์นดํ์ ๊ฐ์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธ
2. ์๋๊ฐ ์์ผ๋ฉด ์ปคํผ๋ฅผ ๋ด๋ ค์ค๋ค.
3. ์๋๊ฐ ์๋๊ฒฝ์ฐ "์ ๊น๋ง์ ์ฌ๊ธฐ์ ๊ธฐ๋ค๋ ค์ฃผ์ธ์" ํ๊ณ ์ฌ๋ฌ๊ฐ๋ค.
4. ๋ฒจ์ด ์ธ๋ฆฌ๋ฉด ๋ฐ์ผ๋ฌ ๊ฐ๋ค.
Asynchronous Non-Blocking
1. ์นดํ์ ๊ฐ์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธ
2. ์๋๊ฐ ์์ผ๋ฉด ์ปคํผ๋ฅผ ๋ด๋ ค์ค๋ค.
3. ์๋๊ฐ ์๋๊ฒฝ์ฐ "์๋์ฌ์ ์ค๋๋์ ์ ๊น ๋ค๋ฅธ์ผ ํ์ธ์" ํ๊ณ ์๋๋ฅผ์ฌ๋ฌ๊ฐ๋ค.
4. ๋ฒจ์ด ์ธ๋ฆฌ๋ฉด ๋ฐ์ผ๋ฌ ๊ฐ๋ค.
I/O ๋ชจ๋ธ
- I/O ์์ ์ ์ฌ์ฉ์ ๋ชจ๋์์ ์ง์ ์ํํ ์ ์๋ค. ์ค์ I/O ์์ ์ ์ปค๋์๊ฒ system call์ ํตํด์ ์์ฒญํ๋ค.
- ์ฌ์ฉ์ ๋ ๋ฒจ์์ system call์ ๋ณด๋ด๊ณ ์๋ต ๋ฐ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ blocking model๊ณผ non-blocking๋ชจ๋ธ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
Blocking vs Non-Blocking
ํธ์ถํ ์ ์ฅ์์์ ํน์ง
- ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์คํํ๊ณ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ (Block)
- ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์คํํ๊ณ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ (Non-block)
ํ์ค๋ก ์ค๋ช ํ๋ฉด I/O ์์ ์์คํ ์ฝ์ ํ๊ณ ์ค๋ ๋๊ฐ ready qeueue์ ๋ค์ด๊ฐ์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ฐ๋๋ผ๋ฉด blocking์ด๋ค. ๋ฐ๋ฉด, ready queue์ ๋ค์ด๊ฐ์ง ์๊ณ ๋ฐ๋ก ์๋ต์ ๋ณด๋ด๋ฉด non-blocking๋ชจ๋ธ์ด๋ค.
Blocking IO
- I/O์์ ์ด ํ์ํ API Call์ํ ๋, ์๋ต์ ์ฆ์ ๋ฐ์์ ์๊ณ ๋๋ ์ด๊ฐ ๋ฐ์ํ๋ค.
- ํ๋ ๋์คํฌ์ ํ์ผ์ ์ ์ฅํ๋๊ฒฝ์ฐ SATA ์ผ์ด๋ธ์ ํตํด์ ์ ์ก
- ๋คํธ์ํฌ๋ก ๋ถํฐ ์ค๋ ๋ฐ์ดํฐ๋ ๋คํธ์ํฌ ํ ์ด๋ธ์ ๋ฐ๋ผ์ ์ ์ก๋๊ณ ๋ผ์ฐํฐ๋ฅผ ํต๊ณผํ๊ณ ๋คํธ์ํฌ ์ธํฐํ์ด์ค ์นด๋๋ฅผ ํตํด์ ์์ ํ๊ฒ ๋๋ค.
- I/O์์ ์ด ํ์ํ API Call์ํ๋ฉด running ์ํ์ ์ค๋ ๋๋ฅผ block ์ํ๋ก ๋ง๋ ๋ค.(์์ฒญํ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋์ด์ return๋ ๋๊น์ง)
- ๋ฆฌ๋ ์ค ์ด์์ฒด์ ๋ฅผ ์๋ก๋ค๋ฉด ํด๋น ์ค๋ ๋๋ sleep ์ํ๊ฐ ๋๊ณ , cpu์ ์ ๊ทผํ ์ ์๋ ์ํ๊ฐ ๋๋ค.
- ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ํด๋น ์ค๋ ๋๋ Runnable ์ํ๊ฐ ๋๋ค.
- ํด๋น ์ค๋ ๋๋ ready queue์์ ๋๊ธฐํ๋ค๊ฐ ์ค์ผ์ค๋ฌ์ ์ํด์ cpu ์ ์ด๊ถ์ ๊ฐ์ ธ๊ฐ๋ค.
์ค๋ ๋์ ์ํ๋ ์ด์์ฒด์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
- ๋ฆฌ๋ ์ค : running ,not-running
- JVM : new,runnable,blocked,waiting,timed_waiting,terminated
CPU-bound blocking
- 3D ์ฐ์ฐ๊ณผ ๊ฐ์ด CPU์ ์ง์ค๋๋ ์์ ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๋ blocking ๋นํ๋ค.
- CPU ํ๋ก์ธ์๊ฐ ์ค๋์๊ฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ blocking
IO-bound blocking
- IO์์์ผ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด์ ์ค๋ ๋๊ฐ blocking ๋นํ๋ ์ํฉ์ด๋ค.
- IO ์์ฒญ์ํ๊ณ ์ปค๋์ ์ง๊ธ๋น์ฅ ๋ฆฌํดํ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ์๋ ค์ฃผ๋ฉด์ ํด๋น ์ค๋ ๋๋ sleepํ๊ฒ ๋๋ค.
- CPU๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋๋ค.
Non-Blocking IO
-
Blocking IO๋ ๋ฆฌํดํ ๋ฐ์ดํฐ๊ฐ ์์๋ ๊น์ง๊ณ์ ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ํ๋ค.
-
Non-Blocking API๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
-
ํธ์ถ๊ณผ ๋์์ ์ฆ์ ๋ฆฌํดํ๊ณ ์ค๋ ๋๋ block๋นํ์ง ์๋๋ค.
-
์ค๋ ๋๋ ์ฆ์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ค(I/O Call ํ๋จ์ ์ ์ ์ฝ๋)
-
IO์ฅ์น๋ก๋ถํฐ ๋ฐ์ดํฐ๊ฐ ์ค๋ฉด, ํธ์ถ์ธก์์๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์๋ค๋๊ฒ์ ์๊ฒ๋๋ค.
-
์ผ๋ฐ์ ์ผ๋ก callback ํจ์๊ฐ ์๋ต๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
-
๊ฐ์ ์์ I/O์์ ์ ํ๋๋ฐ Blocking IO๋ชจ๋ค ์ ์ ์ค๋ ๋๊ฐ ํ์ํ๋ค.
-
์ฌ๋ฌ๊ฐ์ I/O ์์ฒญ์ด Blocking IO์์ ๋ฐ์ํ๋ฉด ๊ฐ๊ฐ์ call๋ง๋ค ์ค๋ ๋๊ฐ ์์ฑ๋๋ค.
-
์ค๋ ๋๋ฅผ ์์ฑํ๋ ๋น์ฉ๊ณผ ์ค๋ ๋๊ฐ context-switing์ด ๋ฐ์ํ๋๊ฒ์ ์๊ฐํ๋ฉด ๋นํจ์จ์ ์ธ ์ธก๋ฉด์ด ์๋ค.
non-blocking API๋ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๊ฒ์ ์ด๋ป๊ฒ ํต์งํ ๊น?
- non-blocking API๋ฅผ ํธ์ถํ๋ฉด ํธ์ถ์ธก์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์๋ค๋๊ฒ์ ๋ฐ๋์ ์์์ผํ๋ค.
- ํธ์ถ์ธก์ ์ด๋ป๊ฒ ์๊ฒ๋ ๊น?
- CPU๋ ์ธ์คํธ๋ญ์ (๋ช ๋ น์ด)์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ์ด๋ป๊ฒ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์๋ค๋๊ฒ์ ํต์งํ ๊น?
- ์ด์์ฒด์ ready queue์ ๋ค์ด๊ฐ์ง ์๊ณ ๋ฐ๋ก ์๋ต์ ํ๋ค. ๋ฐ๋ก ์๋ตํ๊ธฐ ํ๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ฐํํ๋๋ฐ ์ ์๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋๊น์ง ๊ณ์ํด์ ์์ฒญ์ ๋ค์ ๋ณด๋ธ๋ค.
- blocking ๋ฐฉ์์ ๋นํจ์จ์ ์ธ ๋ถ๋ถ์ ํด๊ฒฐํ๊ธฐ ์ํด์ non-blocking์ ์ฌ์ฉํ๋๋ฐ ๊ณ์ํด์ ์์ฒญ์ ๋ค์ ๋ณด๋ด๋ฉด์ ์์์ ๋ญ๋นํ๊ฒ ๋๋ค(์์คํ ํธ์ถ์ด ๋น๋ฒํ๊ฒ ๋ฐ์)
์ด๋ฒคํธ ํต์ง ๋ชจ๋ธ
๋งค๋ฒ ํธ์ถ์ธก์์ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์๋์ง ํ์ธํ๋๊ฒ์ ๋นํจ์จ์ ์ด๋ค. ์์ ๋ฒํผ๋ ์ถ๋ ฅ ๋ฒํผ์ธก์์ ์ด๋ฒคํธ๋กค ํต์งํ๋ฉด ์ด๋จ๊น? I/O ์์ ๊ฒฐ๊ณผ ๋ฐํ ๋ฐฉ์์ ๋ฐ๋ผ ๋๊ธฐ,๋น๋๊ธฐ ๋ชจ๋ธ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
Synchronous Model
- I/O ์์
์ด ์งํ๋๋ ๋์
์ ์ ํ๋ก์ธ์ค๋
๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ์ด๋ฒคํธ๋ฅผ ์ง์ ์ฒ๋ฆฌ
ํ๋ ๋ฐฉ์ notify
๋ฅผ ์ ์ ํ๋ก์ธ์ค(ํธ์ถ์ธก)์ด ๋ด๋นํ์ฌ ์ฃผ์ฒด์ ์ผ๋ก ์งํํ๋ฉด ์ปค๋์ ์ ์ ํ๋ก์ธ์ค์ ์์ฒญ์ ์๋์ ์ ์๋ตํ๋ค.
Asynchronous Model
- I/O ์์
์ด ์งํ๋๋ ๋์
์ ์ ํ๋ก์ธ์ค
๋ ์์ ์ ์ผ์ ํ๋ค๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ํด ์๋ฆผ์ด ์ค๋ฉด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. notify
๋ฅผ ์ปค๋์ด ๋ด๋นํ์ฌ ์ฃผ์ฒด์ ์ผ๋ก ์งํ(์ฝ๋ฐฑ์ ๋๊ฒจ์ฃผ๋ ํํ)ํ๊ณ ํธ์ถ์ธก์ ์๋์ ์ธ ์ ์ฅ์์ ํต์ง๊ฐ ์ค๋ฉด ๊ทธ๋ I/O ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ๋ฐ๋๋ค.
Non-Blocking IO๋ ๋ด๋ถ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ ๊น?
์ด๋ฒคํธ ๋ฃจํ
- ๋๋ถ๋ถ์ non-blocking ํ๋ ์์ํฌ๋ค์ ๋ฌดํ๋ฃจํ๋ฅผ ํตํด ์๋ต๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ง์์ ์ผ๋ก ํ์ธํ๋ค.(poll) ์ด๋ฅผ
์ด๋ฒคํธ ๋ฃจํ
๋ผ๊ณ ๋ถ๋ฅธ๋ค - ์ด์์ฒด์ ๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์ปค๋์์ค API๋ฅผ ์ ๊ณตํ๋ค.
- ๋ฆฌ๋ ์ค epoll, io_uring (์๋ฐ NIO์์ ์๋์ฐ๋ select, ๋งฅ์ kqueue, ๋ฆฌ๋ ์ค๋ epoll์ ์ง์)
- ์๋์ฐ IOCP
- ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด์ socket์์ ์ฝ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ๊ณ์ ํ์ธํ๋ค.
- ์ ๋์ค ์์คํ
์์ ๋ชจ๋ ํ์ผ,ํ๋์จ์ด ์ฅ์น, ์์ผ๋ฑ์ ํ์ผ๋ก ์ทจ๊ธ (FD(File Descriptor))
- FD 0๋ฒ : ํ์ค ์ ๋ ฅ(ํค๋ณด๋)
- FD 1๋ฒ : ํ์ค ์ถ๋ ฅ
- FD 2๋ฒ : ํ์ค ์๋ฌ
- 3๋ฒ๋ถํฐ๋ ์ฌ์ฉ์๊ฐ ๊ฐ์คํ๋ ์์ผ์ด๋ ๋ถ๋ฌ์ค๋ ํ์ผ์ ์ํด ๋ฐฐ์
- ์ ํํ๊ฒ ์ด๋ฒคํธ ๋ฃจํ์์ FD์ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์๋์ง ํ์ธ