자식 프로세스를 생성하고자 할 때 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

BELATED ARTICLES

more