[OS] 멀티프로세스의 pork를 통한 자식 생성과 copy on write
2022. 1. 4. 14:53
자식 프로세스를 생성하고자 할 때 fork 함수를 사용하면 된다.
복사에 의한 생성
- 원본 프로세스(부모 프로세스)에서 fork()를 호출하면 복사본 프로세스(자식 프로세스)가 생긴다.
- fork함수에 의해 생성된 자식 프로세스는 부모 프로세스의 메모리를 그대로 복사해 가지게 된다.
- fork 함수 호출 이후 코드부터 각자의 메모리를 사용하여 실행된다.
- fork 함수가 실행 된 직후 자식 프로세스와 부모 프로세스와 동일한 주소 공간의 복사
- 부모 PID는 43889이고 자식 PID는 43895이다.
부모와 자식의 분리
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid;
int x;
x = 0;
pid = fork();
if(pid > 0) { // 부모 코드
x = 1;
printf("부모 PID : %ld, x : %d , pid : %d\\n",(long)getpid(), x, pid);
}
else if(pid == 0){ // 자식 코드
x = 2;
printf("자식 PID : %ld, x : %d\\n",(long)getpid(), x);
}
else { // fork 실패
printf("fork Fail! \\n");
return -1;
}
return 0;
}
- PID 값을 fork()의 return 값으로 받는다
- 부모 프로세스의 fork()리턴 값은 복사본 프로세스 ID
- 자식 프로세스의 fork()리턴 값은 0
- fork 함수 실행 직후에는 자식 프로세스와 부모 프로세스가 동일한 주소 공간의 복사본을 가진다.
- 이후 자식 프로세스를 변경할때 새로운 공간에 copy후 사용한다. = copy on write
- fork 함수 이후에는 pid값을 기준으로 값이 달라진다.
- pid가 0이면 자식프로세스
Copy on write
- 최적화 기법으로 쓰인다.
- 작성시 이전의 내용을 Copy한다.
- 컴퓨터상의 한정된 자원을 서로 다른 두개의 프로세서가 공유할 때 쓴다. = fork
- 두 개 이상의 프로세스가 같은 자원을 공유하고 있는 경우가 있다 이럴 때 하나의 프로세스가 이 자원에 대해 임의의 수정을 할 경우 자원을 함께 쓰는 프로세스에 영향을 줄 수 있다. 따라서 resource 수정 시 이전 resource의 복사본을 쓰게 한다.
이 상태에서 같은 자원인 pageC를 변경하고자 할 때
-
- page C를 복사해 새로운 메모리에 붙혀넣기 한다.
- copy된 page C를 프로세스1이 점유하고 이에 대한 포인터도 copyC를 가르키면 Copy On Write가 적용된 것이다. 프로세스2는 기존 PageC를 사용하기 때문에 문제가 발생하지 않는다.
'CS > OS' 카테고리의 다른 글
[OS] 프로세스와 쓰레드 (0) | 2022.01.04 |
---|