๐ ํ๋ก์ธ์ค ์์ฑ (Process Creation)

์ ์ฒด ์์ฝ
์ด์์ฒด์ ๋ fork() ์์คํ ์ฝ์ ํตํด ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ (fork), exec()์ผ๋ก ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค.
๊ตฌ์กฐ ๋ฐ ์ฉ์ด ์ค๋ช
โถ ์ฃผ์ ๊ณต๊ฐ (Address Space)
- code / data / stack ์ ์ฒด๋ฅผ ํฌํจ
- ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ ๋ ๋ฆฝ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๋ณต์ ๋จ
- โ๏ธ ํ๊ธฐ: โcode, data, stack ์ ๋ถ ํฌํจ๋จโ
โถ fork()
- ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๊ทธ๋๋ก ๋ณต์ ํ์ฌ ์์ ํ๋ก์ธ์ค ์์ฑ
- ๋จ, PID๋ ์๋ก ๋ถ์ฌ๋จ โ ๋์ ๋ ๋ฆฝ์ ์ธ PCB๋ฅผ ๊ฐ์ง
- โ๏ธ ํ๊ธฐ: โ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ง๋ง PID ๋ค๋ฆ โ PCB ๋ฐ๋ก ์์โ
โถ exec()
- fork๋ก ์์ฑ๋ ์์ ํ๋ก์ธ์ค๊ฐ ๊ธฐ์กด ์ฝ๋ ๋ฎ์ด์ฐ๊ธฐ
- ์๋ก์ด ํ๋ก๊ทธ๋จ(bํ์ผ ๋ฑ)์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ณ ์คํ ์์
- fork + exec = ์๋ก์ด ํ๋ก๊ทธ๋จ ์คํ ๊ตฌ์กฐ
๊ทธ๋ฆผ ์ค๋ช (DRAM ์์์ ํ๋ก์ธ์ค ์์ฑ)
- ์ข์ธก A: ๋ถ๋ชจ ํ๋ก์ธ์ค (A.exe)
- ์ฐ์ธก B: ์์ ํ๋ก์ธ์ค (A2.exe)
- ๋ ํ๋ก์ธ์ค๋ ์๋ก ๋ค๋ฅธ PCB๋ฅผ ๊ฐ๊ณ ์์
- โ๏ธ ํ๊ธฐ:
- โPCB์ ์ฝ๋/๋ฐ์ดํฐ/์คํ๊น์ง ๋ณต์ฌ๋จโ
- โPID๋ ๋ค๋ฅด๊ณ L(process ID)๋ ์๋ก ๋ถ์ฌ๋จโ
- โ๋ ํ๋ก์ธ์ค๋ ์์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋จโ
โ ์๊ธฐ ํฌ์ธํธ
- fork()๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ ๋ค
- exec()๋ ์์ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์ ์ฌํด ์คํํ๋ค
- ๋ถ๋ชจ์ ์์์ ๊ฐ๊ฐ์ PCB๋ฅผ ๊ฐ์ง๋ฉฐ, PID๊ฐ ๋ค๋ฅด๋ค
- ๋ณต์ ๋ ์ฃผ์ ๊ณต๊ฐ์๋ code, data, stack ๋ชจ๋ ํฌํจ๋๋ค
- fork ํ exec ๊ตฌ์กฐ๋ UNIX ๊ธฐ๋ฐ ์์คํ ์์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ํ๋ก์ธ์ค ์์ฑ ๋ฐฉ์์ด๋ค
์ด ์ฌ๋ผ์ด๋๋ ์ถํ fork() ํธ์ถ ํ ๊ฐ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ์ฝ๋๋ถํฐ ์คํ๋๋๊ฐ, PID ๊ตฌ๋ถ, PCB ๊ตฌ์ฑ์์ ๋ฑ ๋ฌธ์ ๋ก ์ฐ๊ฒฐ๋๊ธฐ ์ฌ์ฐ๋ ์ด ์ํ๋ ๊ธฐ์ต ์ ํด๋ฌ์ผ ํด!
๐ fork() ์์คํ ์ฝ์ ์๋ ์๋ฆฌ

์ ์ฒด ์์ฝ
fork()๋ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ฉฐ, ๋ถ๋ชจ์ ์์์ ์ดํ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค.
์ฝ๋ ๊ตฌ์กฐ ์ค๋ช
int main() {
pid_t pid;
pid = fork();
if (pid == 0)
printf("Hello, I am child\n");
else
printf("Hello, I am parent\n");
}
์ฝ๋ ์คํ ๊ฒฐ๊ณผ ๋ถ์
- fork() ํธ์ถ ์ โ ํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํ์ฌ ์๋ก์ด ์์ ํ๋ก์ธ์ค ์์ฑ
- ์ด๋ ๋ฐํ๊ฐ pid์ ๋ฐ๋ผ ์คํ ํ๋ฆ์ด ๋ฌ๋ผ์ง:
0 | ์์ ํ๋ก์ธ์ค | ์์๋ง ์คํ๋จ |
์์ (PID) | ๋ถ๋ชจ ํ๋ก์ธ์ค | ์์์ PID ๋ฐํ |
์์ | ์คํจ | ์์ ์์ฑ ์คํจ (์ค์ ์ฝ๋์ ์์) |
- โ๏ธ ํ๊ธฐ: โpid == 0 โ ์์ ํ๋ก์ธ์คโ, โpid != 0 โ ๋ถ๋ชจ ํ๋ก์ธ์คโ
์ถ๋ ฅ ๊ฒฐ๊ณผ ์์
Hello, I am parent
Hello, I am child
- ์์๋ ๋ณด์ฅ๋์ง ์์ (์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง)
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋ฐ PCB
- fork() ์:
- PCB ์ ์ฒด๊ฐ ๋ณต์ฌ๋จ (PID๋ง ๋ค๋ฆ)
- ์ฝ๋, ๋ฐ์ดํฐ, ํ, ์คํ ๋ฑ ์ฃผ์ ๊ณต๊ฐ์ด ๋ชจ๋ ๋ณต์ ๋จ
- โ๏ธ ํ๊ธฐ:
- โA์ ๋ฉ๋ชจ๋ฆฌ ๊ทธ๋๋ก copy โ A1 (child)โ
- โPCB ํฌํจ, PID ๋ค๋ฆ!โ
โ ์๊ธฐ ํฌ์ธํธ
- fork()๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ ๋ค
- ์์ ํ๋ก์ธ์ค๋ fork()์์ 0์, ๋ถ๋ชจ๋ ์์์ PID๋ฅผ ๋ฐํ๋ฐ๋๋ค
- fork() ํ ๋ ํ๋ก์ธ์ค๋ ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค
- ์ฃผ์ ๊ณต๊ฐ(code, data, stack ๋ฑ)์ ๋ชจ๋ ๋ณต์ ๋๋ค
- ์คํ ์์๋ OS ์ค์ผ์ค๋ฌ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ, ํญ์ ๊ฐ์ ์ถ๋ ฅ ์์๊ฐ ์๋
โ๏ธ ์ถ๊ฐ ํ๊ธฐ ์์ฝ
- โfork() ๊ฒฐ๊ณผ A โ A1 ์์ฑ (๋ณต์ฌ๋ณธ)โ
- โpid๋ A=1110, A1=1111 (์์)โ
- โ์คํ ๊ฒฐ๊ณผ๋ ๋๋ค (A๊ฐ ๋จผ์ ์ผ ์๋, A1์ด ๋จผ์ ์ผ ์๋)โ
๐ wait() ์์คํ ์ฝ โ ๋ถ๋ชจ๊ฐ ์์ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ตฌ์กฐ

์ ์ฒด ์์ฝ
๋ถ๋ชจ ํ๋ก์ธ์ค๋ wait() ์์คํ ์ฝ์ ํตํด ์์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋๊น์ง blocked ์ํ๋ก ๋๊ธฐํ๊ณ , ์์์ด ์ข ๋ฃ๋๋ฉด ready ์ํ๋ก ๋ณต๊ทํ๋ค.
์คํ ํ๋ฆ ์์ฝ
โ fork() ํธ์ถ
- ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋จ
- ์์์ childPID = 0, ๋ถ๋ชจ๋ childPID = ์ค์ PID ๋ฐ์
โก ์์ ํ๋ก์ธ์ค ์คํ
- ์กฐ๊ฑด๋ฌธ์์ childPID == 0์ด๋ฏ๋ก ์์์ exec() ํธ์ถ
- ์๋ก์ด ํ๋ก๊ทธ๋จ (์: ls) ์คํ๋จ
โข ๋ถ๋ชจ ํ๋ก์ธ์ค๋ wait() ํธ์ถ
- ์์์ด ์ข ๋ฃ๋ ๋๊น์ง sleep(blocked) ์ํ๋ก ์ ํ๋จ
- ์์ ์ข ๋ฃ ์ โ ๋ถ๋ชจ๊ฐ ready ์ํ๋ก ๋ณต๊ท
๊ทธ๋ฆผ ์ค๋ช
- ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ: ๋ถ๋ชจ์ ์์์ fork๋ก ๋ณต์ ๋๋ฉฐ, ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ๊ณผ stack/data/code๋ฅผ ๊ฐ์ง
- fork ์์ โ ๋ถ๋ชจ๋ wait ํธ์ถ ํ sleep ์ํ
- exec ํธ์ถ โ ์์ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ ๋ด์ฉ์ด ๊ต์ฒด๋จ
โ ์๊ธฐ ํฌ์ธํธ
- wait()๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค์ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์์คํ ์ฝ์ด๋ค
- ๋ถ๋ชจ๋ wait ํธ์ถ ์ดํ blocked ์ํ๊ฐ ๋๋ฉฐ, ์์์ด ์ข ๋ฃ๋๋ฉด ready ์ํ๋ก ๋ณต๊ทํ๋ค
- ์์์ exec()์ ํธ์ถํ์ฌ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ค (fork๋ก ๋ณต์ฌ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฎ์ด์ด๋ค)
- exec ์ดํ ์์ ํ๋ก์ธ์ค๋ ์๋ ์ฝ๋๊ฐ ์๋ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ค
โ๏ธ ํ๊ธฐ ์์ฝ ํฌํจ
- "parent = bash shell, child = ๋ช ๋ น ์คํ"
- "wait()์ด ์์ผ๋ฉด parent๊ฐ ๋จผ์ ์ข ๋ฃ๋์ด ์์์ด ๊ณ ์ ํ๋ก์ธ์ค๊ฐ ๋ ์ ์์"
- "fork โ exec โ wait ํ๋ฆ ์ดํด ์ค์!"
- "fork ์ code/data/stack ๋ชจ๋ ๋ณต์ฌ, exec ์ ์์ ์ฝ๋ ๊ต์ฒด"
์ด ๊ตฌ์กฐ๋ shell์์ ๋ช
๋ น์ด ์
๋ ฅ โ ์์ ํ๋ก์ธ์ค๋ก ์คํ โ ๊ฒฐ๊ณผ ๊ธฐ๋ค๋ฆผ ๊ตฌ์กฐ๋ 1:1๋ก ๋์๋๊ธฐ ๋๋ฌธ์
UNIX ํ๊ฒฝ์์ ์์ฃผ ์์ฃผ ๋ฑ์ฅํ๋ ๊ธฐ์ด ๊ตฌ์กฐ์ผ!
๐ exec() ์์คํ ์ฝ

์ ์ฒด ์์ฝ
exec()๋ ํ์ฌ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ์ ์์ ํ ์ง์ฐ๊ณ , ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๊ต์ฒดํ์ฌ ์คํ์ ์์ํ๋ค.
์ฝ๋ ์์ ๋ถ์
int main() {
pid_t pid;
pid = fork();
if (pid == 0) {
printf("Hello, I am child. Now I run date\n");
execlp("date", "date", NULL);
} else {
printf("Hello, I am parent\n");
}
}
ํ๋ฆ ์ ๋ฆฌ
- fork(): ๋ถ๋ชจ๊ฐ ์์์ ๋ณต์ฌํด์ ์์ฑ
- pid == 0: ์์ ํ๋ก์ธ์ค ๋ธ๋ก ์ง์
- printf() ์คํ
- execlp() ํธ์ถ โ ํ์ฌ ์์ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ถ ์ง์ฐ๊ณ date ํ๋ก๊ทธ๋จ์ผ๋ก ๊ต์ฒด๋จ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๋ else ๋ธ๋ก์์ ์ถ๋ ฅํ๊ณ ์ข ๋ฃ
exec ์ดํ์ ๋ณํ
- ์์ ํ๋ก์ธ์ค๋ ์๊ธฐ ์ฝ๋(=main ํจ์ ๋ฑ)๋ฅผ ์๊ณ ์์ ํ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ(date)์ผ๋ก ๋ฐ๋
- printf("Hello, I am child...")๋ exec ์ ์ ์คํ๋จ
- exec ์ดํ ๋ค์ main()์ด๋ fork()๋ก ๋์๊ฐ์ง ์์
โ ์๊ธฐ ํฌ์ธํธ
- exec()๋ ํ์ฌ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ์์ ํ ๋ฎ์ด์ด๋ค
- exec()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค๋ ๊ธฐ์กด ์ฝ๋๋ก ์ ๋ ๋์๊ฐ์ง ์๋๋ค
- exec()๋ fork() ์ดํ ์์ ํ๋ก์ธ์ค๊ฐ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ํ ๋ ์ฌ์ฉ๋๋ค
- exec ์คํ ์ ์ถ๋ ฅ์ ๊ฐ๋ฅํ์ง๋ง, exec ์ดํ์๋ ์๋ก์ด ํ๋ก๊ทธ๋จ๋ง ๋์ํ๋ค
- ๋ถ๋ชจ๋ ์ํฅ์ ๋ฐ์ง ์๊ณ , ์์๋ง ๋ฐ๋๋ค
โ๏ธ ํ๊ธฐ ์์ฝ
- "fork โ ์์ โ exec ํธ์ถ โ ๋ถ๋ชจ์ ์์ ํ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ์คํ"
- "exec ์ดํ ์์์ ๊ธฐ์กด A ํ๋ก๊ทธ๋จ ์ฝ๋ ์ฌ๋ผ์ง"
- "date ๋ช ๋ น์ด ์คํ๋๋ฉฐ, ์์ ํ๋ก์ธ์ค์ PID๋ ์ ์ง๋จ"
- "fork ์ดํ ํ๋ฆ 2-1-3-1 (๋ถ๋ชจโ์์โexecโ๋ถ๋ชจ)"
์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ ์ค๋ช
- DRAM ๋ด์์ A ์ฝ๋๊ฐ ์คํ๋๋ค๊ฐ exec ํ,
โ A ์ฝ๋ ์ง์์ง๊ณ ์๋ก์ด ํ๋ก๊ทธ๋จ(B ๋ฑ)์ด ๋ก๋ฉ๋จ
์ด ์ฌ๋ผ์ด๋๋ fork-exec ๊ตฌ์กฐ๋ฅผ ์์ ํ ์ดํดํ๊ธฐ ์ํ ํต์ฌ ์ฌ๋ผ์ด๋์ผ.
์ถ๋ ฅ ํ๋ฆ ๋ฌธ์ , PID ๊ตฌ๋ถ ๋ฌธ์ , exec ์ดํ ๋์ ๋ฌธ์ ๋ฑ ์ค์ ๋ฌธ์ ์ ์ง๊ฒฐ๋๋๊น ํ์คํ ์๊ธฐํ๊ณ ๊ฐ์!
๐ Interprocess Communication (IPC)

์ ์ฒด ์์ฝ
**IPC(ํ๋ก์ธ์ค ๊ฐ ํต์ )**์ ๋ ๋ฆฝ๋ ํ๋ก์ธ์ค๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ, ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋๋๋ค:
Message Passing ๋ฐฉ์๊ณผ Shared Memory ๋ฐฉ์
๋ฐฉ์ 1. Message Passing (๋ฉ์์ง ์ ๋ฌ ๋ฐฉ์)
๊ตฌ์กฐ
- ๊ฐ ํ๋ก์ธ์ค๊ฐ ์ด์์ฒด์ ๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์
- A โ ์ปค๋(M) โ B (๋ฐ๋๋ก๋ ๊ฐ๋ฅ)
- ์ปค๋์ด ์ค์ฌ์ ์ญํ
ํน์ง
- OS๋ฅผ ํตํด ํต์ ํ๋ฏ๋ก ๋น๊ต์ ์์
- ๋ฐ์ดํฐ ์ ์ก์ด ์ง๊ด์
- โ๏ธ ํ๊ธฐ:
- โMSG Q ๋ฐฉ์โ
- โsync๋ ์ข์ง๋ง, ์ค๋ฒํค๋ ํผโ
- โ๋ณต์ฌ, ์ปค๋ ๊ฒฝ์ = ์ฑ๋ฅ ์ ํโ
โ ์๊ธฐ ํฌ์ธํธ
- ์ด์์ฒด์ ๋ฅผ ๊ฒฝ์ ํด์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค
- ์์ ํ๊ณ ๋๊ธฐํ๊ฐ ์ฝ์ง๋ง, ์ค๋ฒํค๋๊ฐ ํฌ๊ณ ๋๋ฆด ์ ์๋ค
๋ฐฉ์ 2. Shared Memory (๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์)
๊ตฌ์กฐ
- ๋ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ(Shared Memory) ์ ์ ๊ทผ
- A์ B๊ฐ ์ง์ read/write ๊ฐ๋ฅ
- ์ปค๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ง ํ๊ณ ์ง์ ๊ฐ์ ํ์ง ์์
ํน์ง
- ๋น ๋ฅด๊ณ ํจ์จ์ (๋ณต์ฌ X)
- ๋๊ธฐํ ๋ฌธ์ ์์ (์๋ก ๋ฎ์ด์ฐ๊ธฐ ๊ฐ๋ฅ)
- โ๏ธ ํ๊ธฐ:
- โ์๋ ๋น ๋ฆโ
- โsync ์ ๋๋ฉด ๋ฐ์ดํฐ ๊ผฌ์ผ ์ ์์โ
- โ์ปค๋์ memory ์ ๊ณต๋ง ํจโ
โ ์๊ธฐ ํฌ์ธํธ
- ๊ณตํต ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณต์ ํด ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค
- ์๋๊ฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด์ง๋ง, ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
- ์ปค๋ ๊ฐ์ ์ด ์ ์ด ํจ์จ์ ์ข์ง๋ง ์ํ์ฑ ์์
์ ์ฒด ๋น๊ต ์์ฝ
์๋ | ๋๋ฆผ (์ปค๋ ๊ฒฝ์ ) | ๋น ๋ฆ |
์์ ์ฑ | ๋์ | ๋ฎ์ (๋๊ธฐํ ํ์) |
OS ๊ฐ์ | ํผ | ์์ |
๋ณต์ก์ฑ | ๋ฎ์ | ๋๊ธฐํ ์ค๊ณ ํ์ |
์ฑ๋ฅ | ์ค๋ฒํค๋ ์์ | ์ฑ๋ฅ ์ข์ |
โ๏ธ ํ๊ธฐ ํฌ์ธํธ ์ ๋ฆฌ
- โ(1) MSG Q: sync ์ข๊ณ , ์ค๋ฒํค๋ Badโ
- โ(2) SHM: copy ์๊ณ fast, but sync Badโ
- โ์ปค๋์ shared memory๋ง ํ ๋นํ๊ณ ์ง์ ๋ฐ์ดํฐ๋ ์ ๋ค๋ฃธโ
๐ Message Passing: Direct vs Indirect Communication

์ ์ฒด ์์ฝ
Message Passing ๋ฐฉ์์ ํ๋ก์ธ์ค๊ฐ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋, ์ง์ ์ด๋ฆ์ ์ง์ ํ๊ฑฐ๋ ๋ฉ์ผ๋ฐ์ค/ํฌํธ๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
(1) Direct Communication (์ง์ ํต์ )
๊ตฌ์กฐ
- **๋ณด๋ด๋ ํ๋ก์ธ์ค(P)**๊ฐ ๋ฐ๋ ํ๋ก์ธ์ค(Q)์ ์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ์ง์
- send(Q, message) / receive(P, message)
- OS๊ฐ ๋ ์ฌ์ด ํต์ ์ ์ค์ฌํ์ง๋ง, ๊ตฌ์กฐ์ ์ง์ ์ฐ๊ฒฐ
ํน์ง
- ๋จ์ํจ
- ์ก์ ์์ ์์ ์ ์๋ฐฉ ์ด๋ฆ์ ๋ฐ๋์ ์์์ผ ํจ
- โ๏ธ ํ๊ธฐ: "msg ๋ฐฉ์, ๋จ์ํ์ง๋ง ์ ์ฐ์ฑ ๋ฎ์"
โ ์๊ธฐ ํฌ์ธํธ
- Direct ๋ฐฉ์์ ํต์ ์๋์ ์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ์์์ผ ํ๋ค
- ๋ฉ์์ง๋ ์ง์ ์๋์๊ฒ ์ ๋ฌ๋๋ฉฐ, ํฌํธ ๊ฐ์ ์ค๊ฐ์ ์์
- ๊ตฌ์กฐ๋ ๋จ์ํ์ง๋ง ์ ์ฐ์ฑ์ ๋ฎ์
(2) Indirect Communication (๊ฐ์ ํต์ )
๊ตฌ์กฐ
- **๋ฉ์ผ๋ฐ์ค(Mailbox) ๋๋ ํฌํธ(Port)**๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์
- ์ก์ ์/์์ ์๋ ํฌํธ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ๋ฐ์
- send(M, message) / receive(M, message)
ํน์ง
- ์ก์์ ์๋ ์๋ก๋ฅผ ๋ชฐ๋ผ๋ ํฌํธ๋ง ๊ณต์ ํ๋ฉด ํต์ ๊ฐ๋ฅ
- N:1, 1:N ํต์ ๊ตฌ์กฐ ๊ฐ๋ฅ
- โ๏ธ ํ๊ธฐ:
- "syscall ํตํด mailbox ์ ๊ทผ"
- "port ID ๊ธฐ์ค์ผ๋ก ๋ฉ์์ง ํ ์์ฑ๋จ"
- โport์ message stack์ฒ๋ผ ์์โ
โ ์๊ธฐ ํฌ์ธํธ
- Indirect ๋ฐฉ์์ mailbox/port๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ํต์ ํ๋ค
- ์๋๋ฐฉ ์ด๋ฆ์ ๋ชฐ๋ผ๋ ๋ฉ์์ง ์ก์์ ๊ฐ๋ฅ
- ๋์ ์ฐ๊ฒฐ ๋ฐ ์ ์ฐ์ฑ ๋์
- port๋ ๋ฉ์์ง๋ฅผ ํ(๋ฒํผ)์ฒ๋ผ ๊ด๋ฆฌ
์ ์ฒด ๋น๊ต ์์ฝ
์๋ ์ง์ | ๋ช ์์ (์๋ ์ด๋ฆ ์ง์ ์ง์ ) | ๊ฐ์ ์ (ํฌํธ ์ด๋ฆ ์ง์ ) |
์ ์ฐ์ฑ | ๋ฎ์ | ๋์ |
๊ตฌ์กฐ | ๋จ์ | ์ ์ฐ (port ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ) |
ํ์ฉ | ๊ณ ์ ๋ ์๋ฐฉ ํต์ ์ ์ ํฉ | ๋์ ๊ตฌ์ฑ ๊ฐ๋ฅ, ์ค์ฉ์ |
โ๏ธ ํ๊ธฐ ์์ฝ
- "Direct ๋ฐฉ์์ ๋จ์ํ์ง๋ง ํฌํธ ๊ณต์ ๋ถ๊ฐ"
- "Indirect๋ ํฌํธ ID ๊ธฐ์ค, ๋ฉ์์ง queue์ฒ๋ผ ์ฌ์ฉ"
- "syscall ํตํด ํฌํธ์ ๋ฉ์์ง ์ ๋ฌ / ์์ "
- "process M๊ณผ port M ๊ตฌ๋ถ ์ํ ๊ฒ"
'CS > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด์์ฒด์ ] ch06. Process Synchronization (0) | 2025.04.21 |
---|---|
[์ด์์ฒด์ ] ch05. CPU Scheduling (0) | 2025.04.21 |
[์ด์์ฒด์ ] ch03. Process (0) | 2025.04.21 |
[์ด์์ฒด์ ] ch02. System structure & program excution (0) | 2025.04.21 |
[์ด์์ฒด์ ] ch01. Introduction to Operating Systems (0) | 2025.04.21 |