: 부모 프로세스가 자식 프로세스 생성 (fork)
트리(계층 구조) 형성
프로세스는 자원을 필요로 함: 운영체제로부터 받는다 / 부모와 공유한다
자원의 공유: 부모와 자식이 모든 자원 공유하는 모델 / 일부 공유 모델 / 전혀 공유하지 않는 모델(일반적)
수행(execution): 부모와 자식은 공존하며 수행되는 모델 / 자식이 종료될 때까지 부모(shell)가 기다리는(wait) 모델
ex) top 명령어
주소 공간(address space): 자신은 부모의 공간을 복사하고 그 공간에 새로운 프로그램을 올림
ex) UNIX
(1) fork()
system call이 새로운 process 생성
: PCB가 부모를 그대로 복사(OS data except PID + binary), 주소 공간 할당
(2) fork 다음에 이어지는 exec()
system call을 통해 새로운 프로그램을 메모리에 올림
: child에 새로운 code 들어가서 변경. 새로운 program 시행
: Process creation. 새로운 주소공간 생성 -> caller에게 복제. 문맥 그대로 복제(program counter). 같은 흐름을 가지는 프로세스만 생성 가능.
int main(){
int pid;
pid = fork(); // 여기서 자식프로세스 생성.
// 자식프로세스는 fork 이후인 여기부터 code 실행
if (pid == 0) // child
printf("\n Hello, I am child\n");
else if (pid > 0) // parent
printf("\n Hello, I am parent\n");
}
fork된 child process가 원본이라고 주장하는 경우를 방지하기 위해, 함수의 return값이 다름.
부모 process의 pid는 양수 / 자식 process의 pid는 0
: execute a different program. 어떤 프로그램을 완전히 새로운 프로세스로 만듦
int main(){
int pid;
pid = fork();
if (pid == 0) { // child
printf("\n Hello, I am child! Now I'll un date \n");
// 새로운 프로그램으로 덮어쓰기. 되돌아올 수 없음.
execlp("/bin/date", "/bin/date", (char *) 0);
}
else if (pid > 0) // parent
printf("\n Hello, I am parent\n");
}
: 일반적으로 자식 process 생성 후 호출하는 커널 함수
int main() {
int childPID;
S1;
childPID = fork();
if (childPID == 0)
<code for child process>
else {
wait();
}
S2;
}
: 프로세스의 종료
자발적 종료: 마지막 statement 수행 후 exit() system call을 통해. 프로그램에 명시적으로 적어주지 않아도 main 함수가 return되는 위치에 compiler가 넣어줌
비자발적 종료
- 부모 process가 자식 process를 강제 종료
- 사용자가 키보드로 kill, break (Ctrl+C)
- 부모가 종료하는 경우: 부모 process가 종료하기 전에 자식들이 먼저 종료됨.
thread: 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력 가능 => shared memory, message passing 안 써도 공유, 통신 가능
운영체제 - 반효경
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09