๐ ํ๋ก์ธ์ค ์์ฑ (Process Creation)
- ๋ถ๋ชจ ํ๋ก์ธ์ค(Parent process)๊ฐ ์์ ํ๋ก์ธ์ค(Child process) ์์ฑ. ๋ณต์ ์์ฑ ํ๋ ๊ฒ์ผ๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ฌธ๋งฅ(์ฝ๋, ๋ฐ์ดํฐ, ์คํ ๋ฑ)์ ๋ชจ๋ ๋ณต์ฌํ๋ค.
- ๋ณต์ ๋ ์์ ํ๋ก์ธ์ค๊ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ์ ๋
ธ๋๋ก ์์นํ๊ณ ๊ทธ ์์์ด ๋ ์์์ ๋ณต์ ํ๋ฉด ๋ ํ์ ๋
ธ๋๋ก ์์นํ๊ณ โฆ ๋ฅผ ๋ฐ๋ณตํ๋ฉด์ ํ๋ก์ธ์ค์ ํธ๋ฆฌ(๊ณ์ธต ๊ตฌ์กฐ)๋ฅผ ํ์ฑํ๋ค.
- ํ๋ก์ธ์ค ํผ์์ ์์์ ์์ฑํ ์๋ ์๊ณ ์์คํ
์ฝ์ ํตํด ์ด์์ฒด์ ์ ์๋น์ค๋ฅผ ๋ฐ์์ผ๋ง ์์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ํ๋ก์ธ์ค๋ ์์์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ์ด์์ฒด์ ๋ก๋ถํฐ ๋ฐ๊ฑฐ๋ ๋ถ๋ชจ์ ๊ณต์ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์์์ด ๋ณต์ ๋๋ ์๊ฐ ๋ณ๋์ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์๊ฐ๋ถํฐ ๋ถ๋ชจ์ ์์์ ์ป๊ธฐ ์ํด ๊ฒฝ์ํ๋ ๊ด๊ณ๊ฐ ๋๋ค.
์์์ ๊ณต์
- ๋ถ๋ชจ์ ์์์ด ๋ชจ๋ ์์์ ๊ณต์ ํ๋ ๋ชจ๋ธ
- ์ผ๋ถ๋ฅผ ๊ณต์ ํ๋ ๋ชจ๋ธ
- ์ ํ ๊ณต์ ํ์ง ์๋ ๋ชจ๋ธ (์ผ๋ฐ์ )
์ํ (Execution)
- ๋ถ๋ชจ์ ์์์ ๊ณต์กดํ๋ฉฐ ์ํ๋๋ ๋ชจ๋ธ
- ์์์ด ์ข
๋ฃ(terminate)๋ ๋๊น์ง ๋ถ๋ชจ๊ฐ ๊ธฐ๋ค๋ฆฌ๋(wait) ๋ชจ๋ธ
์ฃผ์ ๊ณต๊ฐ (Address space)
- ์์์ ๋ถ๋ชจ์ ๊ณต๊ฐ์ ๋ณต์ฌํจ (binary and OS data)
- ์์์ ๊ทธ ๊ณต๊ฐ์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์ฌ๋ฆฐ๋ค.(๋ฎ์ด์์)
์ ๋์ค์ ์
fork()
์์คํ
์ฝ์ด ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑ
- ๋ถ๋ชจ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌ ํ ์ฃผ์ ๊ณต๊ฐ ํ ๋น
fork
๋ค์์ ์ด์ด์ง๋ exec()
์์คํ
์ฝ์ ํตํด ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆผ (๋ฎ์ด์์ฐ๋ ๋จ๊ณ)
fork
์ exec
์ ๋
๋ฆฝ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ ์ค ํ๋๋ง ์คํ๋ ์ ์๋ค.
ํ๋ก์ธ์ค ์ข
๋ฃ (Process Termination)
- ์ด์์ฒด์ ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃํ๋ ๊ฒฝ์ฐ ์์์ด ๋ ์ด์ ์ํ๋๋๋ก ๋์ง ์๋๋ค.
- ๊ทธ๋์ ๋จ๊ณ์ ์ธ ์ข
๋ฃ๋ฅผ ํตํด ๋ชจ๋ ์์ ํ๋ก์ธ์ค๊ฐ ๋จผ์ ์ข
๋ฃ๋ ํ ๋ถ๋ชจ๊ฐ ์ข
๋ฃ๋์ด์ผ ํ๋ค.
System call์ ํตํด ์๋ฐ์ ์ผ๋ก ์ข
๋ฃ๋๋ ๊ฒฝ์ฐ
- ํ๋ก์ธ์ค๊ฐ ๋ง์ง๋ง ๋ช
๋ น์ ์ํํ ํ ์ด๋ฅผ ์ด์์ฒด์ ์๊ฒ ์๋ ค์ค๋ค.(
exit
)
- ์์์ด ๋ถ๋ชจ์๊ฒ output data๋ฅผ ๋ณด๋ (via
wait
)
- ํ๋ก์ธ์ค์ ๊ฐ์ข
์์๋ค์ด ์ด์์ฒด์ ์๊ฒ ๋ฐ๋ฉ๋จ
๋น์๋ฐ์ ์ผ๋ก ์ข
๋ฃ๋๋ ๊ฒฝ์ฐ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค์ ์ํ์ ๊ฐ์ ๋ก ์ข
๋ฃ์ํจ๋ค.(
abort
)
- ์์์ด ํ ๋น ์์์ ํ๊ณ์น๋ฅผ ๋์ด์ ๊ฒฝ์ฐ
- ์์์๊ฒ ํ ๋น๋ ํ์คํฌ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒฝ์ฐ
- ๋ถ๋ชจ๊ฐ ์ข
๋ฃ(exit)ํ๋ ๊ฒฝ์ฐ
fork() ์์คํ
์ฝ
int main()
{
int pid; // ๋ถ๋ชจ์ ์์์ ๊ตฌ๋ถํ๊ธฐ ์ํ ๊ฐ
pid = fork(); // ์๋ก์ด ์์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๋ฉด ์ฌ๊ธฐ ๋ค์ ์ค๋ถํฐ ์คํํ๋ค.(๋ถ๋ชจ์ ๋ฌธ๋งฅ์ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ)
if (0 == pid) // this is a child
printf("\n Hello, I am a child!\n");
else if (0 < pid) // this is a parent
printf("\n Hello, I am a parent!\n");
}
- ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ธฐ ์ํ ์์คํ
์ฝ๋ก ๋ถ๋ชจ์ ์์์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ถ๋ชจ์
pid
๋ 0๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง๊ณ ์์์ pid
๋ 0์ ๊ฐ์ง๋ค.
exec() ์์คํ
์ฝ
int main()
{
int pid;
pid = fork();
if (0 == pid) // this is a child
{
printf("\n Hello, I am a child! Now I'll run date \n");
execlp("/bin/date", "/bin/date", (char *)0);
}
else if (0 < pid) // this is a parent
printf("\n Hello, I am a parent!\n");
}
- ์ด๋ค ํ๋ก๊ทธ๋จ์ ์๋ก์ด ํ๋ก์ธ์ค๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ ๋๋ฌธ์
execlp()
๊ฐ ํธ์ถ๋๋ ์๊ฐ ์ดํ์ ์ฝ๋๋ค์ ์คํ๋์ง ์๋๋ค.
wait() ์์คํ
์ฝ
int main()
{
int childPID;
S1;
childPID = fork();
if (0 == childPID)
// child ํ๋ก์ธ์ค ์ฝ๋ ์คํ
else
wait();
S2;
}
- ํ๋ก์ธ์ค A๊ฐ
wait()
์์คํ
์ฝ์ ํธ์ถํ๋ฉด ์ปค๋์ child
๊ฐ ์ข
๋ฃ๋ ๋๊น์ง ํ๋ก์ธ์ค A๋ฅผ sleep
์ํจ๋ค.(block ์ํ)
- ์์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๋ฉด ์ปค๋์ ํ๋ก์ธ์ค A๋ฅผ ๊นจ์ด๋ค.(ready ์ํ)
exit() ์์คํ
์ฝ
ํ๋ก์ธ์ค์ ์๋ฐ์ ์ข
๋ฃ
- ๋ง์ง๋ง statement ์ํ ํ
exit()
์์คํ
์ฝ์ ํตํด ์ข
๋ฃ
- ํ๋ก๊ทธ๋จ์ ๋ช
์์ ์ผ๋ก ์ ์ด์ฃผ์ง ์์๋ main ํจ์๊ฐ ๋ฆฌํด๋๋ ์์น์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฃ์ด์ค
ํ๋ก์ธ์ค์ ๋น์๋ฐ์ ์ข
๋ฃ
- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข
๋ฃ์ํด
- ์์ ํ๋ก์ธ์ค๊ฐ ํ๊ณ์น๋ฅผ ๋์ด์๋ ์์ ์์ฒญ์
- ์์์๊ฒ ํ ๋น๋ ํ์คํฌ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋
- ํค๋ณด๋๋ก
kill
, break
๋ฑ์ ์น ๊ฒฝ์ฐ
- ๋ถ๋ชจ๊ฐ ์ข
๋ฃํ๋ ๊ฒฝ์ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๊ธฐ ์ ์์ ํ๋ก์ธ์ค๋ค์ด ๋จผ์ ์ข
๋ฃ๋๋ค.
ํ๋ก์ธ์ค ๊ฐ ํ๋ ฅ
๋
๋ฆฝ์ ํ๋ก์ธ์ค (Independent process)
- ํ๋ก์ธ์ค๋ ๊ฐ์์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์ํ๋๋ฏ๋ก ์์น์ ์ผ๋ก ํ๋์ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํ์ ์ํฅ์ ๋ฏธ์น์ง ๋ชปํ๋ค.
ํ๋ ฅ ํ๋ก์ธ์ค (Cooperating process)
- ํ๋ก์ธ์ค ํ๋ ฅ ๋ฉ์ปค๋์ฆ์ ํตํด ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
ํ๋ก์ธ์ค ๊ฐ ํ๋ ฅ ๋ฉ์ปค๋์ฆ (IPC
: Interprocess Communication)
๐ธ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
message passing
: ์ปค๋์ ํตํด ๋ฉ์์ง ์ ๋ฌ
๐ธ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ
shared memory
: ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ์๋ ์ผ๋ถ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๊ฒ ํ๋ shared memory ๋ฉ์ปค๋์ฆ์ด ์์
- ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํํ ๋ ์ผ๋ถ ์ฃผ์๊ณต๊ฐ์ ๊ณต์ ํ๋๋ก ๋งคํํ๋ค.(์ฌ์ ์ ์์คํ
์ฝ์ ํตํด ์ด์์ฒด์ ์๊ฒ ๋ณด๊ณ ๋์ด์ผ ํ๋ค)
๐ธ thread
thread
๋ ์ฌ์ค์ ํ๋์ ํ๋ก์ธ์ค์ด๋ฏ๋ก ํ๋ก์ธ์ค ๊ฐ ํ๋ ฅ์ผ๋ก ๋ณด๊ธฐ๋ ์ด๋ ต์ง๋ง ๋์ผํ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ค๋ ๋๋ค ๊ฐ์๋ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ํ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.
Message Passing
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ๋ผ๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด์์ฒด์ ์ปค๋์ ํตํด์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
Message system
- ํ๋ก์ธ์ค ์ฌ์ด์ ๊ณต์ ๋ณ์(shared variable)๋ฅผ ์ผ์ฒด ์ฌ์ฉํ์ง ์๊ณ ํต์ ํ๋ ์์คํ
Direct Communication
- ํต์ ํ๋ ค๋ ํ๋ก์ธ์ค์ ์ด๋ฆ์ ๋ช
์์ ์ผ๋ก ํ์ํด์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ
Indirect Communication
- mailbox(๋๋ port)๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๊ฐ์ ์ ๋ฌํ๋ ๋ฐฉ์
์ถ์ฒ