Fork function

난1렙이요·2024년 9월 27일

시스템 프로그래밍

목록 보기
6/22

Fork function

fork()는 현재 프로세스에 자식 프로세스를 생성하는 함수이다. 새로운 프로세스를 만드는 함수라고 봐도 무방하다. 부모의 정보를 그대로 카피한 복제본을 자식 프로세스로 생성한다.

  • 부른 프로세스 : 부모
  • 새로운 프로세스 : 자식

Return value

  • child에는 zero를 반환한다.
  • parent에는 자식의 process ID를 반환한다.
  • 자식은 부모의 정보를 그대로 카피했으므로, 처음부터 실행하면 무한 루프에 빠질 수 있다. 다행히 그런 일은 일어나지 않고, fork 함수가 실행된 아랫줄부터 실행한다.
  • 오류가 생기면 parent에 음수를 반환한다.
  • 결과적으로, fork를 실행하면
    • 부모 함수는 계속 실행한다.
    • 자식 함수는 부모 함수의 fork 이후 부분부터 실행한다.
    • 부모 함수의 fork 아랫부분은 2번 실행되는 것이다.

fork함수의 성질

  • 포크 함수는 부모의 코드나 여러가지 정보를 받아서 새로운 자식 프로세스를 만든다.
  • 자식은 부모 환경변수나 접근권한같은 속성을 그대로 상속받는다.
  • 자식은 부모의 자원(resource)들 중 일부분을 상속받는다.
  • 자식은 어떤 정보들은 그대로 상속받지 않는다.
    • process ID(PID)나 parent process ID(PPID)는 달라야 한다.
    • 모든 데이터는 복사한다.
    • 같은 코드를 사용한다.
    • 같은 지점부터 실행한다.(fork 이후 부분부터 실행한다는 뜻)
    • 위에서 말했듯이 서로 다른 return value를 가진다
      • 부모는 자식의 PID
      • 자식은 0

부모와 자식의 속성과 자원

앞에서 말했듯이, 모든 정보를 상속받지는 않는다

  • Process ID : 자식은 새로운 PID를 가져야 한다. 같으면 중복이므로 둘을 구별할 수 없어진다.
  • CPU usage : 자식이 CPU를 얼마나 사용했는지는 0으로 리셋된다. 물론 부모는 그대로 유지된다.
  • Locks : 모든 프로세스는 공유 리소스에 접근하기 전 OS에게 lock을 요청한다. OS는 제일 처음 lock을 요구한 프로세스에게 엑세스 권환을 준다. 자식은 부모와 다른 lock정보를 가진다. 만약 같으면 공유 리소스를 한번에 두 프로세스에서 접근하게 되는 문제가 생긴다.
  • Alarm : 위의 lock과 비슷한 이유이다. 프로세스는 alarm을 설정할 수 있다. 일정 시간 뒤에 alarm을 울리게 하도록 만든다. 자식은 부모와 다른 alarm정보를 가진다. 만약 같으면 alarm이 울렸을 때 부모만이 아닌 자식도 alarm이 울리므로 문제가 생긴다.
  • Pending signals : 모든 프로세스는 신호(signal)를 받을 수 있다. 프로세스는 임의의 순간에 신호를 받을 수 있는데, 이 때 신호를 받을지 말지를 signal mask를 통해 통제할 수 있다. 이렇게 막힌 신호들을 pending signal이라고 한다. 자식은 부모와 상관없이 pending signal을 따로 설정할 수 있어야 한다.

장단점

장점 : 자식은 부모의 모든 데이터를 상속받는다. 프로세스 간의 데이터를 주고받는 과정은 별도의 통신이 필요하지만, 데이터를 그냥 상속받기 때문에 별도의 통신이 상관없다.
단점 : 부모의 코드를 그대로 물려받으며 똑같은 코드를 실행하기 때문에 다른 코드를 실행하는 데 제한적인 부분이 있다.


Run Different Code

포크의 단점인 다른 코드 실행에 대한 제한을 해결하는 방법이 있다. 코드는 똑같지만 일부 다른 부분을 수행하게 할 수 있으며, 이는 fork함수의 return값으로 구현할 수 있다.
fork함수의 return값은 부모는 자식의 PID를 받으며 자식은 0을 받는다. 조건문을 써서 return값이 0보다 크면 부모 프로세스의 실행 / 0과 같으면 자식 프로세스의 실행을 하면 된다.

profile
다크 모드의 노예

0개의 댓글