์คํฐ๋๋ฅผ ์ด์ํ๊ณ ์์ต๋๋ค. ํด๋น repository์ ๊ฐ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ณด์ค ์ ์์ต๋๋ค!
https://github.com/JulSaMo/CS-start
๐ Blocking (๋ธ๋กํน)
์์ ์ ์์ ์ ์งํํ๋ค๊ฐ ๋ค๋ฅธ ์ฃผ์ฒด์ ์์์ด ์์๋๋ฉด ๋ค๋ฅธ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์์ ์ ์์ ์ ์์ํ๋ ๊ฒ
์ฒ์์๋ A๊ฐ ์์ ์ ํ๊ณ ์๋ค. ๊ทธ๋ฌ๋ค๊ฐ B์์ ์ด ์์๋๋ฉด, B์์ ์ ์งํํ๋ ๋์ A๋ ๊ฐ๋งํ ๊ธฐ๋ค๋ฆฐ๋ค.
B์์ ์ด ๋๋ ํ์ ๋ค์ A ์์ ์ด ์์๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด ์ด๋ ๊ฒ ์์ ์ด ์ด์ด์ง๋ค.
๐ Non-Blocking (๋๋ธ๋กํน)
๋ค๋ฅธ ์ฃผ์ฒด ์์ ๊ณผ ๊ด๋ จ ์์ด ์์ ์ ์์ ์ ํ๋ ๊ฒ
์ฒ์์ A์์ ์ด ์์๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ B์์ ์ด ์์๋๋ค.
A๋ ์์ ์ ๋ฉ์ถ์ง ์๊ณ ๊ทธ๋๋ก ๊ณ์ ๋์์ ์์ ์ ์ํํ๋ค.
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋์์ Application์์๋ ์์ ์ด ๋๊ธฐ์ง ์๊ณ ๊ณ์ ์์ ์ ์์ ์ ์ํํ๋ค.
๐ Blocking VS Non-Blocking
Blocking๊ณผ Non-blocking์ ํธ์ถ๋ ํจ์๊ฐ ํธ์ถํ ํจ์์๊ฒ ์ ์ด๊ถ์ ๋ฐ๋ก ์ฃผ๋๋ ์๋๋์์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
์์ ๊ทธ๋ฆผ์์ ๋ดค๋ฏ์ด, Blocking์ Aํจ์๊ฐ Bํจ์๋ฅผ ํธ์ถ ํ ๋, Bํจ์๊ฐ ์์ ์ ์์ ์ด ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง A ํจ์์๊ฒ ์ ์ด๊ถ์ ๋๋ ค์ฃผ์ง ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐ๋ฉด์ Non-blocking์ Bํจ์๊ฐ ์ ์ด๊ถ์ ๋ฐ๋ก A์๊ฒ ๋๊ฒจ์ฃผ๋ฉด์ A ํจ์๊ฐ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐ Sync (๋๊ธฐ)
์์ ์ ๋์์ ์ํํ๊ฑฐ๋, ๋์์ ๋๋๊ฑฐ๋, ๋๋๋ ๋์์ ์์ํ๋ ๊ฒ์ ์๋ฏธ
A์์ ์ด ์์๋๊ณ , A์์ ์ด B์์ ์๊ฒ ๋์์ ์์ฒญํ๋ค.
๋์์ ์์ฒญ๋ฐ์ B์์ ์ด ์ํ๋๋ค. ๊ทธ๋์ A๋ ์์ ์ ํ์ง ์๋๋ค.
B์์ ํ ์ป์ ๋ฐ์ดํฐ(์์ ๋ฌผ) ๋ฅผ A์์ ์๊ฒ ์ ๋ฌํด์ฃผ๊ณ , ๊ทธ ๋ฐ์ดํฐ(์์ ๋ฌผ)์ ๊ฐ์ง๊ณ A์์ ์์ ์ ๋ค์ ์งํํ๋ค.
๐ Async (๋น๋๊ธฐ)
์์๊ณผ ์ข ๋ฃ๊ฐ ์ผ์นํ์ง ์์ผ๋ฉฐ, ๋๋๋ ๋์์ ์์ ์ ์์ํ์ง ์๋ ๊ฒ์ ์๋ฏธ
A๊ฐ B์๊ฒ ์์ ์ ์์ฒญํ๋ค. ํ์ง๋ง A๋ ๊ฒฐ๊ณผ๋ฌผ์ด ์ค์ํ์ง ์๋ค. ๊ทธ๋ฅ A๋๋ก ์์ ์ ์งํํ๋ค.
A๊ฐ ์์ ์ ์งํํ๋ ๋์ค, B์ ๊ฒฐ๊ณผ๊ฐ ๋์ฐฉํ๋ค. ํ์ง๋ง B์ ๊ฒฐ๊ณผ๋ฌผ์ ์ฌ์ฉํ ์ง ์ํ ์ง๋ ๋ชจ๋ฅธ๋ค.
๐ Sync VS Async (๋๊ธฐ vs ๋น๋๊ธฐ)
Sync์ Async์ ์ฐจ์ด๋ ํธ์ถ๋ ํจ์์ ์ข
๋ฃ๋ฅผ ํธ์ถํ ํจ์๊ฐ ์ฒ๋ฆฌ(A๊ฐ ์ฒ๋ฆฌํ๋ Sync)ํ๋๋, ํธ์ถ๋ ํจ์๊ฐ ์ฒ๋ฆฌํ๋๋(B์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋ฐฑ์ผ๋ก B๊ฐ ์ง์ ์ฒ๋ฆฌํ๋ Async)์ ์ฐจ์ด์ด๋ค.
(์ฆ, ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ์์ ๋ ์์์ ๊ฒฐ๊ณผ์ ๊ด์ฌ์ด ์๋์ง ์๋์ง๋ก ํ๋จํ ์ ์๋ค. )
Sync๋ A ํจ์๊ฐ Bํจ์๋ฅผ ํธ์ถํ ๋, Bํจ์์ ๊ฒฐ๊ณผ๋ฅผ Aํจ์๊ฐ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด์ Async๋ Bํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋ฐฑ์ผ๋ก Bํจ์๊ฐ ์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐ iOS์์์ ๋ธ๋กํน๊ณผ ๋ ผ๋ธ๋กํน, ๊ทธ๋ฆฌ๊ณ ๋๊ธฐ์ ๋น๋๊ธฐ
iOSํ๋ก๊ทธ๋๋ฐ ์์๋ async๋ non-blocking์ผ๋ก๋ง ๋ค๋ฃจ๊ณ , sync๋ blocking์ผ๋ก๋ง ๋ค๋ฃจ๊ณ ์๋ค๊ณ ํ๋ค.
https://www.inflearn.com/questions/25632
(์ถ๊ฐ) ๐ ํฌ๋ก์ค ์ค๋ฒํ 4๊ฐ์ง
๊ถ๊ธ์ฆ) iOS์์๋ aysnc๋ non-blocking์ผ๋ก๋ง ๋ค๋ฃจ๊ณ , sync๋ blocking์ผ๋ก๋ง ๋ค๋ฃจ๋๊น, ์ฌ๊ธฐ์์๋
non-blocking / Async ์ Blocking/Sync ๋ง ์ฌ์ฉ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ ค๋? (๋ง๋๋ฏ..?๐)
๐ธ Blocking / Sync
blocking์๋ ์ ์ด๊ถ์ ๊ด์ , sync์๋ ๊ฒฐ๊ณผ์ ์ฒ๋ฆฌ์ ๊ด์ ์ ๋๋ค.
์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์์ ์ ์งํํ๊ณ , Blocking์ธ ๋งํผ Kernel์ ์์ ์ด ๋๋๊ธฐ ์ ์๋ ์ ๋ ์ ์ด๊ถ์ Application์ ์ฃผ์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ Sync์ธ ๋งํผ Kernel์์ ์์ ํ ๊ฒฐ๊ณผ๋ฌผ์ด โค๏ธ๋ผ๊ณ ์น๋ฉด, ์ด ๊ฒฐ๊ณผ โค๏ธ์ ๋ํ ์ ๋ฌด๋ฅผ ๋ฐ๋ก Application์์ ์ฒ๋ฆฌํ๋ค.
๐ Blocking / Sync๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น? (๊ฐ๋จํ ์์)
๊ฐ๋จํ ์์๋ก ๋ค๋ฉด, ์ ๋ ฅ์์ฒญ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. ์ ๋ ฅ์์ฒญ์ ํ๊ฒ ๋๋ฉด, ์ฌ์ฉ์์๊ฒ ์ ๋ ฅ์ ๋ฐ๊ธฐ์ ๊น์ง๋, ์ ์ด๊ถ์ด ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํจ์๋ค์ด ์ผ์ ๋์ํ์ง ์๋๋ค. ์ฌ์ฉ์์๊ฒ ์ ๋ ฅ์ ๋ฐ๊ฒ ๋๋ฉด, ์ฆ๊ฐ์ผ๋ก ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ sync์ด๋ค.
func blockingSync() -> {
let input = Int(readLine()!)!
print("๋ธ๋กํน ๋๊ธฐ๋ ์
๋ ฅ์ ๋ฐ์์ผํฉ๋๋ค. \(input)"
}
๐ Blocking / Sync ์ ๋ฆฌ
Blocking/Sync ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปค๋๋ก ์์ ์ ์์ฒญํ๊ณ , ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ ์ดํ ๋ก์ง์ ์ํํ๋ค. ๋ํ์ ์ผ๋ก Spring MVC ํ๋ ์์ํฌ๊ฐ ์ด๋ฌํ Blocking / Sync ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
๐ธ Non-Blocking / Sync
non-blocking์ด๊ธฐ ๋๋ฌธ์ ์ ์ด๊ถ์ ์์ง ์๋๋ค. ๊ทธ๋์ ๐ต๋ ๊ณ์ํด์ ์์ ์ ์ด์ด๋๊ฐ ์ ์๋ค.
๐ข๋ ์์ฒญ๋ฐ์ ์์ ์ ์งํํ๋ค. ํ์ง๋ง sync์ด๊ธฐ ๋๋ฌธ์ ๐ต๋ ๐ข์ ๊ฒฐ๊ณผ๊ฐ ์ค์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๋ฐ์์ ์ฒ๋ฆฌํด์ผํ๋ค. ๊ทธ๋์ ๐ต๋ ์ง์์ ์ผ๋ก ๐ข์ ์์ ์ด ์๋ฃ๋์๋์ง (๊ฒฐ๊ณผ๊ฐ ๋์๋์ง)์ ๋ํด์ ํ์ธํด์ผํ๋ค.
๐ Non-Blocking / Sync๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น? (๊ฐ๋จํ ์์)
non-blocking / sync๋ blocking/sync๋ ๊ฑฐ์ ์ฐจ์ด๊ฐ ๋์ง ์๋๋ค๊ณ ํ๋ค. ์ด์ฐจํผ ๐ข์ ์์ ์ ๋ฐ์์, ๐ต์ด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ๊ทธ๋ผ ์ด๋จ๋ non-blocking/sync๊ฐ ์ฌ์ฉ๋ ๊น.
Front end์ UI ๊ด์ ์์ ์๊ฐํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๋ค ์ ์์ ๊ฒ์ด๋ค.
'๊ฒ์'์์ ๋งต์ ์ด๋ํ ๋ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ๋งต์ ์ ํํ ๋ ํ๋ฉด์, ์ฌ์ฉ์์ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ๋ก๋๋๋์ง 'progress bar'๋ฅผ ๋์์ค์ผํ ๋๊ฐ ์๋ค. ์ด๋ด๋ progressbar๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ณผ์ ์ด ๊ณ์ํด์ ๐ต์ด ๐ข์ ๊ฒฐ๊ณผ๊ฐ ๋์๋๊ณ ํ์ธํ๋ ๊ณผ์ ์ด๊ณ , ๐ข์์ ๊ฒฐ๊ณผ๊ฐ ๋ค ๋์ค๋ฉด ๋ฌด์ฌํ ๋งต์ด ์ ํ๋๋ ๊ฒ์ด ๋ฐ๋ก ๐ข๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ sync๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
func moveMap() -> {
while true {
//ํ๋ฉด์ progress๋ฅผ ํ์ํ ์ฝ๋ ์์ฑ
}
// ํ๋ฉด ์ ํ ์ฝ๋
}
๐ธ Blocking / Async
Application์์ ์์ ์ ์์ํ๋ค. ์ด์ด์ Kernel์ ์์ ์ ์์ฒญํ๋๋ฐ,
(Blocking) ์ ์ด๊ถ์ ๋นผ์๊ฒผ๊ธฐ ๋๋ฌธ์ ๋์ด์ ๐ต๋ ์์ ์ ํ์ง ์๋๋ค.
ํ์ง๋ง, async์ด๊ธฐ ๋๋ฌธ์ ๐ข์์ ๋์จ ๊ฒฐ๊ด๊ฐ์ ๋ค์ ๐ต์์ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
๐ ๊ตณ์ด blocking์ธ๋ฐ async๋ฅผ ์ฌ์ฉํด์ผํ ๊น?
non-blocking์ผ๋ก ๊ตฌํํ๊ณ ์ถ์๋๋ฐ ๋ณดํต ๊ฐ๋ฐ์์ ์ค์๋ก blocking/async๋ก ์์ ํ๊ฒ ๋ ์๋ ์๋ค๊ณ ํ๋ค. ์ด๋ง์ ์ฆ,,, ์ด๊ฑด ์ ์์ด๋ค๋ ์ด์ผ๊ธด๊ฐ? (์ฐ์ํํ ํฌ์ฝ์ค - https://www.youtube.com/watch?v=oEIoqGd-Sns)
๐ ์ด๋์ blocking/sync๋ฅผ ์ธ๊น?
Blocking/Async ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปค๋๋ก ์์ ์ ์์ฒญํ๊ณ , ์ปค๋์ ์์ ์ ์์ ์ ์ํํ๋ค๊ฐ ์ค๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ด๊ถ์ ๋ ๋๊ฒจ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ฐ์ ์ปค๋์ ์์ ๊ถ์ ๋ค์ ๋๊ฒจ์ฃผ๋ ์์ผ๋ก ์๋ก ์ ์ด๊ถ์ ์์ํ๋ฉฐ ์์ ์ ์์ํ๋ค. ์๋ฐ ์์ผ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค๋ฒ ์์ผ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋์๋์ง๋ฅผ ์ฒดํฌํ๋ฉฐ ๋ค๋ฅธ ๋ก์ง์ ์ํํ๋ ์ผ์ด์ค๋ก ๋ณผ ์ ์๋ค.
๐ธ Non-Blocking / Async
Non-blocking์ kernel์ ์์ ์ด ์คํ์ค์ ์์ด๋, ๐ต์ ์์ ์ ๋ฉ์ถ์ง ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์์ชฝ์์ ์๋ก ๊ฐ์ ์์ ์ ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ Async๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๐ข์์ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค.
๐ Non-Blocking / Async๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น? (๊ฐ๋จํ ์์)
API์์ฒญ์ ํ๊ณ ๋ค๋ฅธ ์์ ์ ํ๋ค๊ฐ ์ฝ๋ฐฑ์ ํตํด์ ์ถ๊ฐ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ค.
// JS์ฝ๋๋ก ๋์ฒด
fethc('url', option)
.then((response) => {
return response.json();
})
.then((data) => {
something(data);
});
์,, cs ์คํฐ๋ํ๋ฉด์ ๋์ผ๋ก๋ง ์ฝ์ผ๋ฉด ๋๋ฌด ์ง์ค๋ ์๋๊ณ , ๋จธ๋ฆฌ์ ๋จ๋๊ฒ ์๊ธธ๋ ์ง์ ํ๊ธฐํ๋ฉด์ ํด๋ดค๋๋ฐ ์๊ฐ์ด ์๋นํ ์ค๋๊ฑธ๋ฆฐ๋ค. ๊ทธ๋งํผ ์ ๋ ๊น๋จน์ง ์๊ฒ ๋ค... ๋ด์ผ ๋ ๋ง์ ์๊ฐ์ ํฌ์ํด์ผ๊ฒ๋ค ใ ใ ํํ,, ๊ณต๋ถํ ๊ฑฐ ์ค์ผ ๋ง์! ์์์ ์ฆ๊ฒ๋ค ^____^ โจ
'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] Blocking I/O ์ Non-Blocking I/O ์ ๋ํด์ ์์๋ณด์ (0) | 2022.09.04 |