http://www.kocw.net/home/m/search/kemView.do?kemId=1046323
운영체제 강의를 듣고 정리한 내용입니다
프로세스의 생성(Process Management)
부모 프로세스가 자식 프로세스를 생성한다
-> 프로세스의 문맥을 복제 생성
프로세스의 트리(계층 구조) 형성
Copy-on-write(COW)
운영체제 메모리관리 파일 시스템에 자주 쓰이는 용어로
write가 발생했을 때 복사를 한다는 의미이다
그 이전까지는 부모의 문맥을 공유한다
-> 효율적인 운영체제에서는 주소 공간만을 공유하여 사용한다
프로세스는 자원을 필요로 한다
자원을 받는 방식
- 운영체제로부터 받는다
- 부모와 공유한다
자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델 //일반적인 모델
-> 공유를 할 수 있으면 하는 것이 효율적이지만, 원칙적으로는 별개의 프로세스이기 때문에
독립적으로 가지고 있어야 한다
수행(Execution)
부모와 자식은 공존하며 수행되는 모델이다
자식이 종료 될 때까지 부모가 기다리는(wait) 모델
Process Creation
주소공간(Address space)
자식은 부모의 공간을 복사한다
복사한 공간에 새로운 프로그램을 올린다
-> copy & paste
유닉스의 예
fork() 시스템 콜이 새로운 프로세스를 생성
부모를 그래도 복사
주소 공간 할당
fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올린다
-> 새로운 프로그램으로 바뀌는 경우도 있다
**프로세스는 운영체제를 통해서만 생성이 가능하다
fork() 시스템 콜
코드
int main() {
int pid;
pid = fork();
if(pid == 0) //자식
printf(“\n Hello, I am child!\n”);
else if(pid > 0) //부모
printf(“\n Hello, I am parent!\n”);
}
-> fork()를 통해 자식과 부모 프로세스를 구분할 수 있다
부모의 fork() 프로세스의 리턴 값은 양수이고, 자손은 0이다
exec() 시스템 콜
한 프로그램을 새로운 프로세스로 태어나게 하는 역할을 한다
int main() {
int pid;
pid = fork();
if(pid == 0) { //자식
printf(“\n Hello, I am child! Now I’ll run date\n”);
execlp(“/bin/date”, “/bin/date”, (char*) 0); //새로운 프로그램을 덮어쓴다
}
else if(pid > 0) //부모
printf(“\n Hello, I am parent!\n”);
}
-> 자식에게 완전히 새로운 프로그램을 덮어씌우기 위해 exec을 한다
한 번 exec하면 되돌릴 수 없다
fork()를 생략하고 프로그래밍 하는 경우
int main() {
printf(“\n Hello, I am child! Now I’ll run date\n”);
execlp(“/bin/date”, “/bin/date”, (char*) 0);
printf(“\n Hello, I am parent!\n”);
}
-> exec 이후의 코드는 실행이 불가능하다 //새로운 프로그램으로 덮어씌워졌기 때문
프로세스 종료(Process Termination)
자발적으로 종료되는 경우
프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려준다(exit)
자식이 부모에게 output data를 보낸다(via wait)
프로세스의 각종 자원들이 운영체제에게 반납된다
비자발적으로 종료되는 경우(강제)
부모 프로레스가 자식의 수행을 종료시킨다(abort)
자식이 할당 자원의 한계치를 넘어선 경우
자식에게 할당된 task가 더 이상 필요하지 않게 된 경우
부모가 종료(exit)하는 경우
-운영체제는 부모 프로세스가 종료하는 경우 자식이 수행되지 못하게 한다
-단계적인 종료
wait() 시스템 콜
프로세스 A가 wait() 시스템 콜을 호출하면
커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다 //block 상태
Child process가 종료되면 커널은 프로세스 A를 깨운다 //ready 상태
exit() 시스템 콜
자발적 종료
마지막 statement 수행 후 exit() 시스템 콜을 통해 프로그램에 적어주지 않아도
main 함수가 리턴되는 위치에 컴파일러가 자동으로 추가해준다.
비 자발적 종료
부모 프로세스가 자식 프로세스를 강제 종료시킨다
키보드로 kill, break 등을 친 경우
부모가 종료하는 경우
-> 부모 프로세스가 종료하기 전에 자식들이 먼저 종료된다
시스템 콜 정리
- fork() : 프로세스를 복제&생성
- exec() : 새로운 프로세스로 덮어씌움
- wait() : 자식이 종료될 때까지 sleep 상태
- exit() : 프로세스를 종료시키는 모든 자원을 반납 후 부모 프로세스에게 알린다