[문과 코린이의 IT 기록장] 운영체제(OS) - Process Management (프로세스 생성 (Process Creation), 프로세스 종료 (Process Termination), fork() 시스템 콜, exec() 시스템 콜, wait() 시스템 콜, exit() 시스템 콜, 프로세스 간 협력)
1. 프로세스 생성 (Process Creation)
- 프로세스의 생성 방법 : 복제생성
: 부모 프로세스(Parent porcess)가 자식 프로세스(Children process)를 생성함.
* 프로세스의 트리(계층 구조) 형성
: 즉, 부모 프로세스의 문맥(주소공간[Code,Data,Stack], CPU 문맥[PC register] ...)을 모두 자식프로세스는 복사함.
: 부모 프로세스가 자식 프로세스를 복제 생성할 때, 직접 생성하지는 않으며, OS에게 fork() 시스템 콜을 통해 자식 프로세스를 만들어달라고 요청한다.
- 프로세스는 자원을 운영체제로부터 받으며, 부모와 공유하기도 공유하지 않기도 한다.
* 원칙적으로는 공유하지 않는다. 자식 프로세스가 부모 프로세스의 값을 복사하지만, 다른 값으로 변경되게 되면서 독립적인 프로세스가 되기 때문
* 자식 프로세스가 부모 프로세스를 그대로 카피하게 되면 메모리에 같은 두개의 값이 올라가서 메모리 낭비가 됨. 따라서 값이 변경되게 될 경우에, 그제야 부모의 공유하던 일부를 카피해서 자식 프로세스를 생성하는 것을 일반적인 기법으로 사용하는데, 이를 Copy-On-Write 기법이라고 함.
- 프로세스의 수행(Excution)과 관련해서는, 부모와 자식이 공존하며 수행되는 모델과, 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델이 있다.
cf ) 프로세스 생성 과정
- fork() 시스템 콜이 새로운 프로세스를 생성 : 부모를 그대로 복사 (OS data except PID + binary), 주소 공간 할당
- fork() 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림.
2. 프로세스 종료 (Process Termination)
- exit() 시스템 콜 [ 자발적 프로세스 종료 ]
: 이 시스템 콜을 하면, 프로세스가 종료된다.
: 또한 이 시스템 콜을 명시적으로 쓰지 않더라도 프로세스가 마지막 명령을 수행한 후, 운영체제에게 이를 알려준다.
* 자식 프로세스가 부모 프로세스에게 output data를 보낸 후(via wait system call), 프로세스의 각종 자원들이 운영체제에게 반납됨.
- abort() 시스템 콜 [ 비자발적 프로세스 종료 ]
: 자식 프로세스가 할당 자원의 한계치를 넘어선 요청을 하는 경우, 부모가 강제로 자식 프로세스를 종료시키는 경우 발생된다.
: 자식 프로세스에게 할당된 테스크가 더 이상 없는 경우 발생된다.
: 부모 프로세스가 먼저 종료(exit)되는 경우 발생한다.
* 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되지 않도록, 아래부터 단계적으로 종료시킨다.
3. fork() 시스템 콜
- 사용자 프로그램이 자식 프로세스를 만드는 코드이다.
int main(){
int pid;
pid = fork()
// 부모 프로세스 : Pid > 0
// 자식 프로세스 : Pid = 0
// 자식 프로세스는 새로 똑같은 문맥이 복사되지만, main부터 실행되는 것이 아닌 이 부분부터 실행됨
// 그 이유는 PC register 또한 복사하기 때문에, 실행한 다음 코드부터 시작해야 한다는 것을 인식하기 때문
if(pid == 0) // 자식 프로세스
cout<< Hello I'm child;
else if(pid > 0)
cout<< Hello I'm Parent;
}
- 부모 프로세스와 자식 프로세스의, pid(프로세스의 주민등록번호와 같은 것) 차이
* 부모 프로세스 : Pid > 0
* 자식 프로세스 : Pid = 0
- 이는 아래의 문제들을 해결하기 위해 설정된 것임
a. 복제된 자식 프로세스가 자신이 복제본이 아닌 원본이라고 주장하는 것을 막기 위해
b. 부모와 똑같은 프로그램이 복사되어, 똑같은 제어 흐름을 따라가야 할 것 같은 문제
4. exec() 시스템 콜
- 복제된 자식 프로세스를 완전히 새로운 프로세스로 태어나게 하는 역할을 하는 것.
int main(){
int pid;
pid = fork();
if(pid==0)
cout<< "Hello I'm Child";
// 새로운 프로세스로 만들어짐
execlp("/bin/date", "/bin/date", (char*)0);
else if(pid>0)
cout<< "Hello, I'm parent";
}
* exec를 하면, 다시 이전으로 돌아갈 수 없음.
int main(){
cout<<"Hello I'm child";
// fork()를 하지 않고, exee()만 사용해서 프로그래밍을 할 수 있음.
execlp("/bin/date", "/bin/date", (char*)0);
// 아래의 코드는 출력될 수 없음
cout<< "Hello I'm parent";
}
5. wait() 시스템 콜
- 프로세스 A가 wait() 시스템 콜을 호출하면
: 커널은 A의 자식 프로세스들이 모두 종료될 때까지, 프로세스 A를 sleep시킨다. (block 상태)
* 즉 CPU 실행 불가능한 상태로 만듦
: 자식 프로세스가 종료되면, 커널은 프로세스 A를 깨운다. (ready 상태)
* 즉 CPU 실행 가능한 상태로 만듦
** 이는 자식 프로세스가 종료(terminate)될 때까지, 부모가 기다리는(wait) 모델임
6. exit() 시스템 콜
- 프로세스를 종료시킬 때 호출하는 시스템 콜.
* 명시적으로 적지 않더라도, 자발적으로 종료될 때 사용됨
- 프로세스의 종료
1) 자발적 종료
- 마지막 명령 수행 후, exit() 시스템 콜 발생
- 프로그램에 명시적으로 적어주지 않아도, main함수가 리턴되는 위치에 컴파일러가 넣어줌으로써 발생
2) 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킬 때 발생
* 자식 프로세스가 한계치를 넘는 자원을 요청하거나, 자식에게 할당된 테스크가 더이상 필요하지 않은 경우
- 키보드로 kill, break 등을 치는 경우 발생 (사람이 의도적으로 발생시키는 것)
- 부모 프로세스가 종료하는 경우, 자식들이 먼저 종료되어야 할 때 발생
7. 프로세스 간 협력
1) 독립적 프로세스 (independent process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.
2) 협력 프로세스 (Cooperating process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.
[ 프로세스 간 협력 메커니즘 (IPC : Interprocess Communication) ]
(1) 메시지를 전달하는 방법
- message passing : 커널을 통해 메시지 전달
- 프로세스는 원래 독립적이며, 자신의 메모리 주소 공간만 볼 수 있으므로, 원칙적으로 서로 직접적인 메세지 전달은 불가능함. 따라서 커널을 통해 메세지를 전달함.
* message system : 프로세스 사이에 공유변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
a. Direct Communitcation
: 통신하려는 프로세스의 이름을 명시적으로 표시함. 즉, 전달받을 프로세스를 직접 명시함.
b. Indirect Communication
: mailbox(또는 port)를 통해 메시지를 간접 전달. (우체통처럼)
* 직접적으로 명시하지 않았기 때문에, 그 요청을 수행하는 적절한 프로세스가 아무거나 실행된다.
(2) 주소 공간을 공유하는 방법
- shard memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 매커니즘
* 이를 활용하려면 두 프로세스는 상당히 신뢰할 수 있는 관계여야 함
cf) Thread : thread는 사실상 하나의 프로세스이므로, 프로세스 간 협력으로 보기는 어렵지만, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능하다.
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |