프로세스의 생성, 자식 프로세서
1. 부모 프로세서의 자식 프로세서의 생성
- 프로세서는 자신의 자식 프로세서를 생성할 수 있다.
- 쓰레드가 하나의 프로세서에서 하나의 주소공간에서 자원을 공유한다. 자식 프로세서가 처음으로 생길 때는 부모 프로세스와 데이타를 공유한다. 하지만 값이 변경(Copy on Write)되면 프로세스가 완전히 분리된다. 기본적으로는 부모 프로세스와 자식 프로세스는 서로 다른 프로세서로서 작동하며 다른 주소 공간을 가진다.
- 자식 프로세서는 부모 프로세서의 생명주기에 종속 된다.
- 일정 부분의 메모리를 공유할 수 있다. 이를 통해 부모와 자식이 협력관계를 형성할 수 있다.
- 자식 프로세서는 부모 프로세서의 Program Counter 등 Context도 함께 복제한다. (자식 프로세스는 부모 프로세스가 자신을 호출(fork())직전 까지의 수행한 작업을 기억한다)
2. 자식 프로세서의 생명주기 (c언어의 시스템 콜)
1) fork() : 자식을 복사함.
- 리턴 값은 int를 받으며, 부모는 양수, 자식은 음수를 가짐. 해당 값을 통해 부모와 자식의 code를 구분할 수 있음.
- 부모의 문맥을 자식이 가지기 때문에, Program Counter가 작동한 fork() 이후부터 코드가 실행된다.
int pid = forK();
printf("\n hello world \n"); // fork()이후인 hello world 부터 자식이 작동
if(pid==0){ // 자식일 경우 작동
printf("\n child \n");
}
2) exec() : 자식이 새로운 값으로 덮어 씌워짐.
- exec()를 사용하면 자식 프로세서는 이전의 정보를 완전하게 지워버림.
- exec()의 작업이 끝나면, 이후에 어떤 코드가 있더라도 자식은 수명을 다함.
int pid = forK();
if(pid==0){
execlp("echo", "echo", "3", (char*)0);
printf("hello"); // 자식 프로세서는 앞서의 작업을 끝으로 종료. hello에 접근하지 못함.
}
3) wait() : 자식의 작업이 끝날 때 까지 부모가 정지(sleep)
- 자식 프로세스가 생성되고 종료될 때까지 부모 프로세서가 정지됨.
- 자식 프로세서가 종료되면 부모 프로세서가 ready 상태가 됨.
childPID = fork();
if(childPID==0){
..자식의 코드...
}else{
wait();
}
4) exit() : 자식 프로세서가 종료
5) abort() : 부모가 자식을 종료 시킴.
- 자식이 할당 자원의 한계치를 넘어설 때.
- 자식이 더는 필요가 없을 때.
- 부모가 종료(exit)되는 경우.
3. 프로세스 간 협력
3.1 독립적 프로세스
3.2 협력적 프로세스 Cooperating Process
- 프로세스 간 메모리의 공유는 원칙적으로 불가능하다. 그러므로 아래와 같은 방식으로 데이타를 공유한다.
1) message passing : 커널을 통해 메시지 전달. 커널을 통해 직접 전달할 수 있고, 커널에 mailbox(혹은 port) 공간으로 간접 전달.
2) shared memory : 프로세스가 다르더라도 커널의 허가 아래에 공유할 수 있는 메모리를 구성할 수 있음.
Author And Source
이 문제에 관하여(프로세스의 생성, 자식 프로세서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@infoqoch/프로세스의-생성-자식-프로세서저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)