reference: kocw์ ๋ฐํจ๊ฒฝ ๊ต์๋ ๊ฐ์์ ๊ถ์ง์ฑ ๊ต์๋ ๊ฐ์(๋ํ ์ ๊ท ์์
)
์์
์ ๋ฃ๊ณ ๋์ ๊ฐ์ ๊ต์ฌ๋ฅผ ํ์ดํํ๊ณ ํ๊ธฐํ ๋ถ๋ถ์ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฆฌํ์์ต๋๋ค.
์น๋ทฐ์์ toc๋ฅผ ์ ๊ณตํฉ๋๋ค.
github์ md ํ์ผ๋ก ๋ณด๋ ๊ฒ ํธํ์๋ค๋ฉด, ์ฌ๊ธฐ๋ก ์ด๋ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
1. ํ๋ก์ธ์ค ์์ฑ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑ
- ํ๋ก์ธ์ค์ ํธ๋ฆฌ(๊ณ์ธต ๊ตฌ์กฐ) ํ์ฑ
- ํ๋ก์ธ์ค๋ ์์์ ํ์๋ก ํจ
- ์ด์์ฒด์ ๋ก๋ถํฐ ๊ฐ๊ฐ ๋ฐ๋๋ค (๋๋ถ๋ถ)
- ๋ถ๋ชจ์ ๊ณต์ ํ๋ค (์ด๋ก์ ์)
- ์์์ ๊ณต์
- ๋ถ๋ชจ์ ์์์ด ๋ชจ๋ ์์์ ๊ณต์ ํ๋ ๋ชจ๋ธ
- ์ผ๋ถ ๊ณต์ ํ๋ ๋ชจ๋ธ
- ์ ํ ๊ณต์ ํ์ง ์๋ ๋ชจ๋ธ (๋๋ถ๋ถ)
- ์ํ
- ๋ถ๋ชจ์ ์์์ ๊ณต์กดํ๋ฉฐ ์ํ๋๋ ๋ชจ๋ธ
- ์์์ด ์ข ๋ฃ๋ ๋๊ฐ์ง ๋ถ๋ชจ๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๋ชจ๋ธ
- ์ฃผ์ ๊ณต๊ฐ (Address space - code, data, stack)
- ์์์ ๋ถ๋ชจ์ ๊ณต๊ฐ์ ๋ณต์ฌํจ
- ์์์ ๊ทธ ๊ณต๊ฐ์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์ฌ๋ฆผ
- ์ ๋์ค์ ์
- fork() ์์คํ
์ฝ๋ก ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ์์ฑ
- ๋ถ๋ชจ ๊ทธ๋๋ก ๋ณต์ฌ (PID๋ฅผ ์ ์ธํ OS data)
- ์ฃผ์ ๊ณต๊ฐ์ ํ ๋น๋ฐ์
- fork ๋ค์์ ์ด์ด์ง๋ exec() ์์คํ ์ฝ์ ํตํด ์์ ํ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆผ.
- fork() ์์คํ
์ฝ๋ก ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ์์ฑ
2. ํ๋ก์ธ์ค ์ข ๋ฃ
<์๋ฐ์ > : ํ๋ก์ธ์ค๊ฐ ๋ง์ง๋ง ๋ช ๋ น์ ์ํํ ํ ์ด์์ฒด์ ์๊ฒ ์ด๋ฅผ ์๋ ค์ค (exit)
- ์์์ด ๋ถ๋ชจ์๊ฒ output data๋ฅผ ๋ณด๋
- ํ๋ก์ธ์ค์ ๊ฐ์ข ์์๋ค์ด ์ด์์ฒด์ ์๊ฒ ๋ฐ๋ฉ๋จ
<๊ฐ์ ๋ก> : ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์์ ์ํ์ ์ข ๋ฃ์ํด (abort)
- ์์์ด ํ ๋น ์์์ ํ๊ณ์น๋ฅผ ๋์ด์ฌ
- ์์์๊ฒ ํ ๋น๋ ํ์คํฌ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์
- ๋ถ๋ชจ๋ฅผ ์ข
๋ฃํ๋ ค๋ฉด?
- ์ด์์ฒด์ ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃํ๋ ๊ฒฝ์ฐ, ์์์ด ๋ ์ด์ ์ํ๋๋๋ก ๋์ง ์๋๋ค.
- ์์ ๊ด๊ณ์์ ๋ง๋จ์ ์๋ ํ๋ก์ธ์ค๋ถํฐ ๋จ๊ณ์ ์ผ๋ก ์ข ๋ฃ๊ฐ ๋๋ค.
3. ํ๋ก์ธ์ค์ ๊ด๋ จํ ์์คํ ์ฝ
- fork(): create a child (copy)
- exec(): overlay new image
- wait(): sleep until child is done
- exit(): frees all the resources, notify parent
- ์์์ ๋ค ๋ฐ๋ฉํ๊ณ ๋ถ๋ชจ ํ๋ก์ธ์ค์๊ฒ ๋ณธ์ธ์ด ์ฃฝ๋๋ค๋ ๊ฒ์ ์ ๋ฌํจ์ผ๋ก์จ ํ๋ก์ธ์ค๋ ์ด๋ช ์ ๋คํ๊ฒ ๋๋ ๊ฒ
3-1. fork() ์์คํ ์ฝ
ํ๋ก์ธ์ค ์์ฑ
int main() {
int pid;
pid = fork();
if (pid == 0)
// this is child
else if (0 < pid)
// this is parent
}
fork() ์์คํ ์ฝ์ ํด๋น ๊ตฌ์กฐ(์ฝ๋)๋ฅผ ๊ฐ์ง ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ์์ฑํ๋ค. ์ด ๋ ์๊ธฐ ์์ ์ context ์ฆ memory ์ฃผ์ ๊ณต๊ฐ๊ณผ CPU์ ๋ฌธ๋งฅ (ํ์ฌ register๊ฐ, program counter)๋ ๋ณต์ ๋์ด ์๋ก ์์ฑ๋๋ค.
๋ฐ๋ผ์ ๋ณต์ ๋ ํ๋ก์ธ์ค๋ if๋ฌธ๋ถํฐ ์์ํ๋ค. ๋ถ๋ชจ์ ๋ฌธ๋งฅ์ ์ด์ด๋ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.
Q. ๊ทธ๋ ๋ค๋ฉด ๋์ ๋ณ๊ฐ์ ํ๋ก์ธ์ค์ธ๋ฐ ์ด๋ป๊ฒ ๋ถ๋ชจ-์์์ ๊ตฌ๋ถํ ๊น?
A. fork()๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๊ฐ (return value)๊ฐ ๋ถ๋ชจ์ธ ๊ฒฝ์ฐ pid๋ฅผ ์์๋ก ๋ฐ๊ณ ์์์ 0์ ๊ฐ์ง.
3-2. exec() ์์คํ ์ฝ
ํ๋ก์ธ์ค๋ฅผ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฎ์ด ์์ ๋ค๋ฅธ ์๋น์ค๋ฅผ ํจ.
int main() {
int pid;
pid = fork();
if (pid == 0) {
// this is child
execlp("/bin/date", "/bin/date", (char *) 0);
// ๊ฒฝ๋ก๋ฅผ ํฌํจํ ํ๋ก๊ทธ๋จ ์ด๋ฆ์ 2๋ฒ ์ ์ด์ฃผ๊ณ 3๋ฒ์งธ ์ธ์๋ถํฐ๋ ํด๋น ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ argument๋ฅผ ๋์ฐํ ๋ค์ zero pointer (character null)๋ฅผ ์ฐ๋ฉด ์คํ๋๋ค.
printf("์ถ๋ ฅ ์๋จ, exec ์ดํ์ ์ฝ๋๋ ์คํ ์ ๋จ.");
// ํด๋น ํ๋ก๊ทธ๋จ์ด ์์ ํ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฎ์ฌ์ ์์๋ถ๋ถ๋ถํฐ ์คํ๋๊ธฐ ๋๋ฌธ.
// return value ์ฒ๋ผ ๋๋์์ค๊ณ ์ด๋ฐ ๊ฑฐ ์ ํ ์์.
// ์จ์ ํ ์๋ก์ด ์ฌ๋์ผ๋ก ํ์ด๋์ ๊ทธ ์ธ๊ณ์์ ํ์ ์ด์์ผํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
} else if (0 < pid)
// this is parent
}
3-3. wait() ์์คํ ์ฝ
- ํ๋ก์ธ์ค A๊ฐ wait() ์์คํ ์ฝ์ ํธ์ถํ๋ฉด ์ปค๋์ child๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ํ๋ก์ธ์ค A๋ฅผ sleep ์ํจ๋ค (block ์ํ)
- Child process๊ฐ ์ข ๋ฃ๋๋ฉด ์ปค๋์ ํ๋ก์ธ์ค A๋ฅผ ๊นจ์ด๋ค (ready ์ํ)
int main {
int pid;
pid = fork();
if (pid == 0)
// this is child
else if (0 < pid)
// this is parent
wait();
}
Q. ์ ์ด ๊ธฐ๋ฅ์ ์ง์? ์ธ์ ์ฐ์ด์ง?
A. Linux command๋ฅผ ์๊ฐํด๋ณด์. vi editor ํธ์ง ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง๋ ๋จ๋ ๊ฒ ์๋ค๊ฐ (๋ถ๋ชจ๋ blocked) ์ข ๋ฃํ๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ ์ ์๋ ์ํ๊ฐ ๋จ.
linux์์ command๋ฅผ ์ ๋ ฅํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก shell์ด๋ผ๋ ํ๋ก์ธ์ค๊ฐ ๋ ์๊ณ ls ์ด๋ฐ ํ๋์ process (์ด๋ฉด์ ๋ช ๋ น์ด)๋ฅผ ์คํ์ํค๋ฉด ์์ ํ๋ก์ธ์ค ํํ๋ก ์คํ๋จ.
๋ถ๋ชจ๊ฐ wait์ ์ํ๋ฉด ๊ฒฝ์ ๊ด๊ณ๊ฐ ๋๋ค. CPU๋ฅผ ๋จผ์ ์ป์ผ๋ ค๋ ๋ ๋ฆฝ์ ์ธ ํ๋ก์ธ์ค์ด๊ธฐ์.
3-4. exit() ์์คํ ์ฝ
ํ๋ก์ธ์ค์ ์ข ๋ฃ.
- ์๋ฐ์ ์ข
๋ฃ
- ๋ง์ง๋ง statement ์ํ ํ exit() ์์คํ ์ฝ์ ํตํด ์ข ๋ฃ๋จ
- ํ๋ก๊ทธ๋จ์ ๋ช ์์ ์ผ๋ก ์ ์ด์ฃผ์ง ์์๋ main ํจ์๊ฐ ๋ฆฌํด๋๋ ์์น์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฃ์ด์ค
- ๋น์๋ฐ์ ์ข
๋ฃ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข
๋ฃ์ํด
- ์์ ํ๋ก์ธ์ค๊ฐ ํ๊ณ์น๋ฅผ ๋์ด์๋ ์์ ์์ฒญ (OS๊ฐ ์ฃฝ์ผ ์๋ ์์)
- ์์์๊ฒ ํ ๋น๋ ํ์คํฌ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์
- ํค๋ณด๋๋ก kill, break ๋ฑ์ ์น ๊ฒฝ์ฐ
- ๋ถ๋ชจ๊ฐ ์ข
๋ฃํ๋ ๊ฒฝ์ฐ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃํ๊ธฐ ์ ์ ์์๋ค์ด ๋จผ์ ์ข ๋ฃ๋จ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข
๋ฃ์ํด
4. ํ๋ก์ธ์ค ๊ฐ ํ๋ ฅ
4-1. ๋ ๋ฆฝ์ ํ๋ก์ธ์ค(Indepedent process)
ํ๋ก์ธ์ค๋ ๊ฐ์์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์ํ๋๋ฏ๋ก, ์์น์ ์ผ๋ก ํ๋์ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํ์ ์ํฅ์ ๋ฏธ์น์ง ๋ชปํจ
4-2. ํ๋ ฅ ํ๋ก์ธ์ค(Cooperating process)
ํ๋ก์ธ์ค ํ๋ ฅ ๋งค์ปค๋์ฆ์ ํตํด ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํ์ ์ํฅ์ ๋ฏธ์น ์ ์์
- message passing: ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
- Direct Communication: ํต์ ํ๋ ค๋ ํ๋ก์ธ์ค์ ์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ํ์
- Indirect Communication: mailbox (๋๋ port)๋ฅผ ํตํด ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ ๋ฌ
P๋ message๋ฅผ mailbox์ ๋ด๊ณ ์ด ์ข๊ฒ Q๊ฐ mailbox๋ฅผ ์ด์ด๋ณด๋ฉด message๋ฅผ ๋ฐ๊ฒ ๋๊ฑฐ๋ ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ mailbox๋ฅผ ์ด์ด ๊ฐ์ ธ๊ฐ ์ ์์
- ํ๋ก์ธ์ค ์ฌ์ด์ ๊ณต์ ๋ณ์๋ฅผ ์ผ์ฒด ์ฌ์ฉํ์ง ์๊ณ ์ปค๋์ ํตํด ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํ์ฌ ํต์ ํ๋ค.
- shared memory: ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ์๋ ์ผ๋ถ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๊ฒ ํ๋ shared memort ๋ฉ์ปค๋์ฆ์ด ์์.
- ํ๋ก์ธ์ค๊ฐ ์ด์์ฒด์ ์ system call๋ก ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐ๊ณ ์ถ๋ค๊ณ ๋ถํํ๋ฉด, ์๋ก ์ ๋ขฐํ ์ ์๋ค๋ ๊ฐ์ ํ์ ๋ฉ๋ชจ๋ฆฌ ์ผ๋ถ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ฉด ์๋ก ํ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.
'OS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
7์ฅ Deadlock (0) | 2021.06.19 |
---|---|
6์ฅ Process Synchronization (0) | 2021.06.19 |
5์ฅ CPU scheduling (0) | 2021.06.18 |
3์ฅ Process (0) | 2021.06.18 |
2์ฅ System Structure & Program Execution (0) | 2021.06.18 |
1์ฅ Introduction to Operating System (0) | 2021.06.18 |