๐ Multithreading
๋ฉํฐ ์ค๋ ๋ฉ๊ณผ ์ฑ๋ฅ
ํ ๊ฐ๊ฒ์ ์ง์์ด ๋ง์์ง์๋ก ๊ฐ๊ฒ๋ ๋ ๋นจ๋ฆฌ ๋์๊ฐ๊น?
์ง๊ด์ ์ผ๋ก๋ ๊ทธ๋ ๋ค๊ณ ์๊ฐํ ์ ์๋ค.
ํ์ง๋ง ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ค.
์ง์์ด ๋๋ฌด ๋ง์์ง๋ฉด ์คํ๋ ค ์๋ก ๋์ ์ด ๊ผฌ์ด๊ณ
๋๊ฐ ์ด๋ค ์ผ์ ํ๋์ง ํผ๋์ด ์๊ธธ ์๋ ์๋ค.
์ปดํจํฐ ํ๋ก๊ทธ๋จ์์๋ ๋น์ทํ ์ผ์ด ๋ฐ์ํ๋ค.
์ฌ๋ฌ ์์
์ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฉํฐ ์ค๋ ๋ฉ(Multithreading)์ ์ฌ์ฉํ์ง๋ง
์ค๋ ๋๊ฐ ๋ง๋ค๊ณ ํด์ ํญ์ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ด ์ข์์ง๋ ๊ฒ์ ์๋๋ค.
์ด๋ฒ์๋ ๋ฉํฐ ์ค๋ ๋ฉ์ด ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง,
๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ํฉ์์ ๋ฉํฐ ์ค๋ ๋ฉ์ด ํจ๊ณผ์ ์ธ์ง ์ดํด๋ณด๋ ค๊ณ ํ๋ค.
๋๊ธฐํ ๋น์ฉ (Synchronization Cost)
๋ฉํฐ ์ค๋ ๋๋ ๊ฐ์ ํ๋ก์ธ์ค ์์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ก ๊ณต์ ํ๋ค.
์ด ๊ตฌ์กฐ ๋๋ถ์ ์ค๋ ๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ์ฝ๊ณ ํ๋ก์ธ์ค๋ฅผ ์๋ก ์์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์๋ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์์ ํ ์ ์๋ค๋ ์ ์ด๋ค.
์๋ฅผ ๋ค์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ํ๋์ ์ ์ญ ๋ณ์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์์ ์์ ํ๊ฒ ๋๋ฉด
๋ฐ์ดํฐ ๊ฐ์ด ๊ผฌ์ด๊ฑฐ๋ ์์ํ์ง ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด์ฒ๋ผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋ ์์ญ์ ์๊ณ ์์ญ(Critical Section)์ด๋ผ๊ณ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ์ํฉ์์๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ์ ํ์ฑ์ ์ ์งํ๊ธฐ ์ํด
๋๊ธฐํ(Synchronization) ๊ธฐ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
๋๊ธฐํ ๊ธฐ๋ฒ์๋ ๋ํ์ ์ผ๋ก ๋ฎคํ
์ค(Mutex) ๋ ์ธ๋งํฌ์ด(Semaphore)์ด ์๋ค.
์ด๋ค์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ์์์ ์ ๊ทผํ๋๋ก ์ ํํ์ฌ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ ์ฌ๊ธฐ์ ๋๋์ง ์๋๋ค.
๋๊ธฐํ๋ฅผ ์ํด ์ฌ์ฉํ๋ Lock์ ๊ณต์ ์์์ ๋ณดํธํด ์ฃผ์ง๋ง, ๋์์ ํ๋ก๊ทธ๋จ์ ๋ณ๋ ฌ์ฑ์ ์ ํํ๋ ์์๊ฐ ๋๊ธฐ๋ ํ๋ค.
์ค๋ ๋๋ ๊ณต์ ์์์ ์ ๊ทผํ๊ธฐ์ํด Lock ํ๋, ์์
์ํ, Lock ํด์ ์ ๊ฐ์ ๊ณผ์ ์ด ํ์ํ๋ค.
์ด๋ ํ ์ค๋ ๋๊ฐ Lock์ ์ก๊ณ ์๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๋ค์ ํด๋น ์์์ ์ ๊ทผํ์ง ๋ชปํ๊ณ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ด๋ฌํ ์ํฉ์ Lock ๊ฒฝ์(Contention)์ด๋ผ๊ณ ํ๋ค.
์ค๋ ๋ ์๊ฐ ๋ง์์ง์๋ก ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๊ฐ์ ์์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด์
Lock ๊ฒฝ์๊ณผ ๋๊ธฐ ์๊ฐ์ด ์ ์ ์ฆ๊ฐํ๊ฒ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ
์ค์ ๋ก๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์์
์ ์ํํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
์ฆ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง๋ง
์ค์ ๋ก๋ ์ฑ๊ธ ์ค๋ ๋์ ๋น์ทํ๊ฒ ๋์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ๋จ์ํ ์ค๋ ๋๋ฅผ ๋ง์ด ๋ง๋๋ ๊ฒ๋ณด๋ค
๊ณต์ ์์์ ์ต์ํํ๊ณ ์๊ณ ์์ญ์ ์ต๋ํ ์งง๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ฌผ๋ก ๊ทธ๋ ๋ค๊ณ ํด์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ ๋ต์ ์๋๋ค.
๋ฉํฐ ์ค๋ ๋๋ ์ฌ์ ํ CPU ์ฝ์ด๋ฅผ ๋์์ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋ง์ ์ํฉ์์ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ค.
๋ค๋ง ์ค์ํ ์ ์ ์ค๋ ๋ ์๋ฅผ ๋ฌด์์ ๋๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ
ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ์ ์์
ํน์ฑ์ ๋ง๊ฒ ์ค๊ณํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
Context Switching ์ค๋ฒํค๋
์ฌ๋ฌ ์ค๋ ๋๊ฐ ์กด์ฌํ๋ฉด CPU๋ ์ค๋ ๋๋ฅผ ๋ฒ๊ฐ์ ์คํํด์ผ ํ๋ค.
์ด ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋น์ฉ์ด Context Switching ์ค๋ฒํค๋์ด๋ค.
Context Switching์ ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋์ ์ํ๋ฅผ ์ ์ฅํ๊ณ
๋ค๋ฅธ ์ค๋ ๋์ ์ํ๋ฅผ ๋ถ๋ฌ์ค๋ ์์
์ ์๋ฏธํ๋ค.
์ฑ๊ธ ์ค๋ ๋๋ ์คํ ํ๋ฆ์ด ํ๋๋ฟ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ ํ์ด ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ค๋ ๋ ์๊ฐ ๋ง์์ง์๋ก
CPU๊ฐ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๊ณ์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์คํํด์ผ ํ๋ค.
ํนํ CPU ์ฝ์ด ์๋ณด๋ค ํจ์ฌ ๋ง์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด
CPU๋ ์ค์ ์์
๋ณด๋ค ์ค๋ ๋ ์ ํ์ ๋ ๋ง์ ์๊ฐ์ ์ฌ์ฉํ๊ฒ ๋ ์๋ ์๋ค.
์๋ฅผ ๋ค์ด 1๋ถํฐ 1000๊น์ง ๋ง์
์ ํ๋ ์์
์ 100๋ฒ ์ํํ๋ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฑ๊ธ ์ค๋ ๋๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์์ฑํ ์ ์๋ค.
long sum = 0;
for(int j=0; j<100; j++) {
for(int i=0; i<1000; i++) {
sum += i;
}
}
์ด ์ฝ๋๋ ํ๋์ ์ค๋ ๋๊ฐ ์์๋๋ก ๊ณ์ฐ์ ์ํํ๋ค.
๋ฐ๋ฉด ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด
๊ฐ ์์
์ ์ฌ๋ฌ ์ค๋ ๋๋ก ๋๋์ด ๋์์ ์คํํ ์๋ ์๋ค.
long sum = 0;
/* ์ค๋ ๋ 1 */
new Thread(() -> {
for (int i = 0; i < 10000000; i++) {
sum += i;
}
}).start();
/* ์ค๋ ๋ 2 */
new Thread(() -> {
for (int i = 0; i < 10000000; i++) {
sum += i;
}
}).start();
// ... ์ค๋ ๋ 3~99 ...
/* ์ค๋ ๋ 100 */
new Thread(() -> {
for (int i = 0; i < 10000000; i++) {
sum += i;
}
}).start();
์ง๊ด์ ์ผ๋ก ์๊ฐํ๋ฉด ๋ฉํฐ ์ค๋ ๋๋ 100๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ์คํ๋๊ธฐ ๋๋ฌธ์
์ฑ๊ธ ์ค๋ ๋๋ณด๋ค ํจ์ฌ ๋น ๋ฅผ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ ์๋ ์๋ค.
์ค๋ ๋ ์๊ฐ ๋ง์์ง์๋ก CPU๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋ฒ๊ฐ์ ์คํํด์ผ ํ๊ณ
๊ทธ ๊ณผ์ ์์ Context Switching์ด ๊ณ์ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด ์ ํ ๊ณผ์ ์์๋ CPU ์๊ฐ๊ณผ ์์์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ์ค์ ๊ณ์ฐ ์์
๋ณด๋ค ์ค๋ ๋ ์ ํ ๋น์ฉ์ด ๋ ์ปค์ง ์๋ ์๋ค.
์ฆ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ํญ์ ์ฑ๋ฅ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฒ์ ์๋๋ค.
โ์ค๋ ๋๊ฐ ๋ง์์๋ก ์์
์ ๋ถ๋ฆฌํด์ ๋์์ ์ฒ๋ฆฌํ๋๊น ํญ์ ๋น ๋ฅด๋คโ๋ ๊ณ ์ ๊ด๋
์ ํ๋ ธ๋ค๋ ๊ฒ์ด๋ค.
ํนํ CPU ์ฝ์ด ์๋ณด๋ค ํจ์ฌ ๋ง์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด CPU๋ ๊ณ์ ์ค๋ ๋๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์คํํด์ผ ํ๊ณ
์ด๋ก ์ธํด ์คํ๋ ค ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ด ๋จ์ด์ง ์๋ ์๋ค.
๊ทธ๋์ ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ CPU ์ฝ์ด ์์ ๋ง๋ ์ ์ ํ ์ค๋ ๋ ์๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
Thread Pool
๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ํญ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ์ผ์ ํ๋ ๊ฒ์ ์๋๋ค.
์๋น์ค๊ฐ ํ์ฐํ ์๊ฐ์๋ ๋ง์ ์ค๋ ๋๊ฐ ์๋ฌด ์์
๋ ํ์ง ์๊ณ ๋๊ธฐ ์ํ์ ์์ ์ ์๋ค.
ํ์ง๋ง ์ค๋ ๋๊ฐ ๋๊ธฐ ์ํ๋ผ๊ณ ํด์ ์๋ฌด ์์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์๋๋ค.
์ค๋ ๋๋ ์กด์ฌ ์์ฒด๋ง์ผ๋ก ๋ฉ๋ชจ๋ฆฌ, CPU ์ค์ผ์ค๋ง ์์์ ์ฌ์ฉํ๋ค.
๊ทธ๋์ ๋๋ฌด ๋ง์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด๋ถํ์ํ ์์ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด Thread Pool์ด๋ค.
Thread Pool์ ๋ง ๊ทธ๋๋ก ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ ์ค๋ ๋๋ค์ ์งํฉ์ด๋ค.
ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์ผ์ ๊ฐ์์ ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ๋๊ณ , ์์
์ด ๋ฐ์ํ๋ฉด ์๋ก์ด ์ค๋ ๋๋ฅผ ๋ง๋ค์ง ์๊ณ ์ด๋ฏธ ์กด์ฌํ๋ ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
๋งฅ๋๋ ๋ ๋น์ ๋ก ๋ค์ ์๊ฐํด๋ณด์.
์๋์ด ์ฌ ๋๋ง๋ค ์ง์์ ์๋ก ๋ฝ๋๋ค๋ฉด ์ฑ์ฉ ๊ณผ์ ๋ง์ผ๋ก๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ณดํต์ ์ ๋นํ ์์ ์ง์์ด ํญ์ ๋๊ธฐํ๊ณ ์๋ค๊ฐ ์๋์ด ์ค๋ฉด ๋ฐ๋ก ์ผ์ ์ฒ๋ฆฌํ๋ค.
Thread Pool๋ ๊ฐ์ ๊ฐ๋
์ด๋ค.
ํ์ํ ๋งํผ์ ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ์์
์ด ์๊ธธ ๋ ํด๋น ์ค๋ ๋๋ฅผ ํ ๋นํ๋ ๋ฐฉ์์ด๋ค.
์น ์๋ฒ๋ฅผ ์๋ก ๋ค์ด๋ณด์.
์ฌ์ฉ์ ์์ฒญ์ด ๋์์ ๋ง์ด ๋ค์ด์ฌ ๋ ์๋ฒ๋ ์ฌ๋ฌ ์์
์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์ด๋ ๋งค๋ฒ ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด ์ฑ๋ฅ์ ๋ถ๋ด์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์
Thread Pool์ ์ฌ์ฉํด ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
from concurrent.futures import ThreadPoolExecutor
import time
# ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํจ์
def handle_request(user_id):
print(f"์ฌ์ฉ์ {user_id} ์์ฒญ ์ฒ๋ฆฌ ์์")
# ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ 2์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์
time.sleep(2)
print(f"์ฌ์ฉ์ {user_id} ์์ฒญ ์ฒ๋ฆฌ ์๋ฃ")
# ์ต๋ 3๊ฐ์ ์ค๋ ๋๋ฅผ ๊ฐ์ง Thread Pool ์์ฑ
with ThreadPoolExecutor(max_workers=3) as executor:
# ์ฌ์ฉ์ 5๋ช
์ด ๋์์ ์์ฒญํ๋ค๊ณ ๊ฐ์
for user in range(1, 6):
executor.submit(handle_request, user)
์ด ์ฝ๋์์๋ 3๊ฐ์ ์ค๋ ๋๋ก ์ด๋ฃจ์ด์ง Thread Pool์ ๋ง๋ค๊ณ 5๊ฐ์ ์์ ์ ์คํํ๋ค.
Thread 1 โ ์ฌ์ฉ์ 1 ์์ฒญ ์ฒ๋ฆฌ
Thread 2 โ ์ฌ์ฉ์ 2 ์์ฒญ ์ฒ๋ฆฌ
Thread 3 โ ์ฌ์ฉ์ 3 ์์ฒญ ์ฒ๋ฆฌ
์์ฒญ์ด ๋๋๋ฉด ๊ธฐ์กด ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํด ๋ค์ ์์ฒญ์ ์ฒ๋ฆฌ
Thread 1 โ ์ฌ์ฉ์ 4 ์์ฒญ ์ฒ๋ฆฌ
Thread 2 โ ์ฌ์ฉ์ 5 ์์ฒญ ์ฒ๋ฆฌ
์ค๋ ๋๋ฅผ ๊ณ์ ์๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ฉฐ ์์
์ ์ฒ๋ฆฌํ๋ ์์ผ๋ก ๋์์ ํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ Thread Pool์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
ํ์ง๋ง ์ค๋ ๋๋ฅผ ๊ณ์ ์์ฑํ๊ณ ์ ๊ฑฐํ๋ ์์
์ ์๊ฐ๋ณด๋ค ๋ง์ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
๊ทธ๋์ ์ค์ ์๋ฒ ํ๋ก๊ทธ๋จ์์๋ ์์ ๊ฐ์ด Thread Pool ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
CPU Bound vs I/O Bound
๋ฉํฐ ์ค๋ ๋ฉ์ ํจ๊ณผ๋ ํ๋ก๊ทธ๋จ์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
๋ํ์ ์ผ๋ก CPU Bound์ I/O Bound ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
์ฐ์ CPU Bound๋ CPU ์ฐ์ฐ์ ์์กดํ๋ ์์
. ์ฆ CPU ๊ณ์ฐ์ด ๋๋ถ๋ถ์ธ ์์
์ด๋ค.
์์์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๋ถ์, ์ํธํ ์ฐ์ฐ ๋ฑ์ด ์๋๋ฐ ์ด ๊ฒฝ์ฐ ์ค๋ ๋๋ฅผ ๋๋ฌด ๋ง์ด ์์ฑํ๋ฉด
CPU๊ฐ ๊ณ์ ์ค๋ ๋๋ฅผ ๋ฐ๊พธ๋๋ผ ์คํ๋ ค ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค.
๊ทธ๋์ ๋ณดํต ์ค๋ ๋ ์(์ค๋ ๋ ์ โ CPU ์ฝ์ด ์)๊ฐ ์ ์ ํ๋ค๊ณ ์๋ ค์ ธ ์๋ค.
I/O Bound๋ ์
์ถ๋ ฅ ์์
์ด ๋ง์ ํ๋ก๊ทธ๋จ, ์ฆ I/O ์ฅ์น์ ์๋ต ์๋์ ์์กดํ๋ ์์
์ ๋งํ๋ค.
๋ํ์ ์ธ ์๋ก๋ ์น ์๋ฒ, ํ์ผ ๋ค์ด๋ก๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒญ๊ณผ ๊ฐ์ ์์
์ด ์๋ค.
์ด๋ฌํ ์์
๋ค์ ๋๋ถ๋ถ CPU ์ฐ์ฐ๋ณด๋ค ์
์ถ๋ ฅ ์ฅ์น์ ์๋ต ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฐ๋ค.
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ํ์ผ์ ์ฝ์ด์ค๋ ์์
์ ๋์คํฌ ์ ๊ทผ์ด๋ ๋คํธ์ํฌ ํต์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ CPU ๊ณ์ฐ๋ณด๋ค ํจ์ฌ ๋๋ฆฌ๋ค.
์ด๋ ์ฑ๊ธ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ์
์ถ๋ ฅ ์์
์ด ์๋ฃ๋ ๋๊น์ง CPU๋ ๋ค์ ์์
์ ์ํํ์ง ๋ชปํ๊ณ ๋๊ธฐ ์ํ(Blocked)์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ฆ ํ๋ก๊ทธ๋จ์ ์ค์ ๋ก ์๋ฌด ์ผ๋ ํ์ง ๋ชปํ ์ฑ I/O ์์
์ด ๋๋๊ธฐ๋ง์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฉ์ด ๋ฌ๋ผ์ง๋ค.
ํ ์ค๋ ๋๊ฐ I/O ์์
์ ์ํํ๋ฉฐ ๋๊ธฐํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ CPU๋ฅผ ์ฌ์ฉํด ๋ค์ ์์
์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ ํ๋ฉด CPU๊ฐ ๋์ง ์๊ณ ๊ณ์ ์์
์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์์คํ
์ ์ฒ๋ฆฌ๋์ด ํฌ๊ฒ ํฅ์๋๋ค.
๊ทธ๋์ I/O ์์
์ด ๋ง์ ํ๋ก๊ทธ๋จ์์๋ CPU ์ฝ์ด ์๋ณด๋ค ๋ ๋ง์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์คํ๋ ค ์ฑ๋ฅ์ ๋์์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
ํ์ง๋ง ์ค๋ ๋๋ฅผ ๊ณ์ ๋๋ฆฌ๋ฉด Context Switching ์ฆ๊ฐ, ๋๊ธฐํ ๋น์ฉ ์ฆ๊ฐ, ๋ถํ์ํ ์์์ฌ์ฉ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋๋ฐ??๋ผ๋ ์๋ฌธ์ด ๋ค์์๋ค. ์ ๋ต์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด๋ ๋ฐ๋ก ๋น๋๊ธฐ I/O ๊ธฐ๋ฐ์ ์ด๋ฒคํธ ๋ชจ๋ธ์ด ์กด์ฌํ๋ค. ์ด์ ๋ํด์๋ ์ถํ ๋ค๋ฅธ ๊ธ์์ ์ค๋ช
์ ํ๊ฒ ๋ค.
์ ๋ฆฌ
์ฑ๊ธ ์ค๋ ๋๋ ๋จ ํ๋์ ์ค๋ ๋๊ฐ ๋ชจ๋ ์์
์ ์ฒ๋ฆฌํ๊ธฐ์ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๊ฐ ๋จ์ํ์ฌ ๊ฐ๋ฐ์ด ๋ ์ฝ๊ณ CPU, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ๋ฉํฐ ์ค๋ ๋๋ ์์ ์ธ๊ธํ๋ฏ์ด Race Condition, Deadlock, Synchronization๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๊ฐ ํจ์ฌ ๋ณต์กํด์ง๊ณ ๊ฐ๋ฐ ๋์ด๋๋ ํฌ๊ฒ ์ฌ๋ผ๊ฐ๋ค.
๋ฉํฐ ์ค๋ ๋๋ ๋ถ๋ช
์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ด์ง๋ง, ๋ฌดํฑ๋๊ณ ์ ์ฉํ๋ค๊ณ ํด์ ํญ์ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ ๊ฒ์ ์๋๋ค.
์๋ชป ์ค๊ณํ๋ฉด ์ฑ๋ฅ๊ณผ ์์ ์ฑ ๋ชจ๋๋ฅผ ์์ด๋ฒ๋ฆฌ๋ ์ํฉ์ด ๋ฐ์ํ ์๋ ์๋ค.
์ค์ํ ๊ฒ์ โ์ค๋ ๋๋ฅผ ๋ง์ด ๋ง๋๋ ๊ฒโ์ด ์๋๋ผ
โ์ ์ ํ ์์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒโ์ด๋ค.