치춘짱베리굿나이스

[Rank 3] Minishell - 부모자식 프로세스 본문

42/42s Cursus

[Rank 3] Minishell - 부모자식 프로세스

치춘 2022. 2. 3. 17:53

자식 프로세스의 생성

부모-자식 관계

모든 프로세스는 실행 도중 프로세스 실행 시스템 콜을 통해 새로운 프로세스들을 생성할 수 있다

  • 프로세스 실행 시스템 콜을 통해 다른 프로세스를 생성하는 프로세스가 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스가 자식 프로세스

프로세스의 부모-자식 관계는 트리와 같은 형태를 띈다

또한 각 프로세스를 구분하기 위해 PID (Process Identifier) 가 부여된다

자식 프로세스의 자원

자식 프로세스가 생성될 때, 부모 프로세스의 자원의 일부를 한정적으로 사용하거나, 운영체제로부터 직접 자원을 제공받아 사용한다

자식 프로세스의 실행 형태

  • 부모 프로세스와 자식 프로세스가 함께 실행되는 경우
  • 자식 프로세스가 모두 종료될 때까지 부모 프로세스가 대기하는 경우 (wait)

자식 프로세스의 주소 공간

  • 부모 프로세스와 자식 프로세스가 완전히 같은 복사본이 되는 경우 (fork)
  • 부모 프로세스와 완전히 다른 새 프로그램이 탑재되는 경우 (exec)

주요 함수들

fork

현재 프로세스로부터 새로운 프로세스 (자식 프로세스) 를 하나 생성한다

  • 생성된 프로세스는 부모 프로세스와 동일한 주소공간을 가지며, 이는 부모-자식 간 수월한 통신을 돕는다
  • 부모-자식 프로세스 모두 fork() 이후에도 실행을 계속하지만, fork()의 반환값이 다르다
    • 부모 프로세스: 자식 프로세스의 PID를 받는다
    • 자식 프로세스: 0을 받는다
  • 자식 프로세스는 부모 프로세스의 fork() 이후 내용부터 실행된다

exec

주로 fork 이후에 호출되며, 프로세스의 메모리 공간을 새 프로그램으로 교체한다

  • 이를 통해 자식 프로세스와 부모 프로세스가 서로 다른 일을 할 수 있다
    • 예시: exec을 통해 자식 프로세스를 다른 프로그램으로 교체하는 등
  • exec() 시스템 콜을 포함한 기존의 프로그램을 지우고, 새 binary 파일을 메모리에 탑재한다
    • 따라서 exec() 계열 함수에서 리턴값을 받아올 수 없다

wait

자식 프로세스가 종료될 때까지 부모 프로세스를 대기시킨다


프로세스의 종료

프로세스의 종료

자신의 메모리 스택에 있는 마지막 구문을 실행 완료하면 exit() 시스템 콜을 통해 종료한다

자식 프로세스는 부모 프로세스에게 정수 형태의 Status Value (상태값) 을 반환하고, 모든 자원은 운영체제에 의해 할당 해제된다

부모 프로세스가 자식 프로세스의 실행을 종료하는 경우

  • 자식 프로세스가 자신에게 허용된 자원을 초과하여 사용하는 경우
    • 이를 위해 부모 프로세스가 자식 프로세스의 상태를 매번 모니터링 해야한다
  • 자식 프로세스에게 할당된 일이 더이상 필요하지 않은 경우
  • 운영체제에서 부모 프로세스가 종료되었을 때 자식 프로세스가 계속 실행되는 것을 허용하지 않을 경우
    • (Cascading Termination)

IPC (Interprocess Communication)

운영체제 내에서 동시에 실행되고 있는 프로세스들은 서로 독립적이거나, Cooperating 관계에 있다

어떤 프로세스가 다른 프로세스에 영향을 주지도, 받지도 않는 경우 두 프로세스는 Independent (독립적) 관계이며, 그 외의 경우는 Cooperating 관계이다

Cooperating 프로세스들은 IPC 매커니즘을 필요로 하며, 이는 프로세스간 데이터 교환이 가능케 해준다

  • 공유 메모리 사용
    • 운영체제에 의해 메모리의 특정 구간을 공유하게 된다
    • 프로세스들은 이 메모리를 단순히 읽고 쓰는 방식으로 소통한다
    • 공유 메모리에 대한 갱신은 다른 모든 프로세스들에게 즉시 보여진다
  • 메시지 패싱
    • 데이터는 메시지 형식으로 전달된다
    • 분산형 시스템에 더 적합하다

'42 > 42s Cursus' 카테고리의 다른 글

[Rank 3] Minishell - 쌍따옴표와 홑따옴표  (4) 2022.02.03
[Rank 3] Minishell - Fork, Pipe 함수 연습  (0) 2022.02.03
[Rank 3] Minishell  (0) 2022.02.03
[Rank 2] Minitalk 구현 (Bonus)  (4) 2021.09.25
[Rank 2] Minitalk 구현 (Mandatory)  (0) 2021.09.25
Comments