프로세스 생성
100%

프로세스 · 레슨 4

프로세스 생성

fork, exec, PID, 부모 관계가 Linux 프로세스 생성에 참여하는 방식을 배웁니다.

Linux 프로세스는 부모-자식 관계를 형성합니다. 쉘은 일반적으로 자식 프로세스를 만들고 그 자식이 요청한 프로그램을 실행하도록 준비하여 외부 명령을 시작합니다. 전통적인 설명은 이 작업을 forkexec 작업으로 나눕니다.

fork로 자식 만들기

fork() 시스템 호출은 호출 프로세스를 기반으로 자식 프로세스를 만듭니다. 부모와 자식은 fork의 반환 지점부터 계속하지만 서로 다른 반환 값을 받고 서로 다른 PID를 갖습니다.

자식은 논리적으로 분리된 프로세스 상태를 받습니다. Linux는 처음에 copy-on-write로 물리 메모리 페이지를 공유하고 한 프로세스가 페이지를 수정할 때만 복사할 수 있습니다. 열린 파일 디스크립터는 상속되고 같은 기반 열린 파일 설명을 가리키므로 파일 오프셋 같은 세부 사항이 공유될 수 있습니다.

성공한 fork()는 무엇을 만드나요?

execve로 프로그램 교체하기

execve() 호출은 호출 프로세스에 새 프로그램을 불러옵니다. 성공하면 프로세스 이미지를 교체하고 이전 프로그램으로 돌아오지 않습니다. execve()는 새 프로세스를 만들지 않으므로 PID는 그대로입니다.

따라서 많은 쉘 명령은 fork-exec 패턴을 따릅니다.

  1. 쉘이 자식을 만듭니다.
  2. 자식이 리디렉션과 다른 실행 상태를 준비합니다.
  3. 자식이 요청한 프로그램을 실행합니다.
  4. 포그라운드 또는 백그라운드 실행에 따라 쉘이 기다리거나 계속합니다.

라이브러리와 애플리케이션은 posix_spawn() 같은 상위 수준 인터페이스를 제공할 수 있고 Linux에는 clone() 같은 추가 기본 요소도 있습니다. 익숙한 fork-exec 모델은 유일한 인터페이스는 아니지만 여전히 유용합니다.

execve()가 성공하면 프로세스 PID에는 어떤 일이 생기나요?

부모와 자식 ID 확인하기

PID는 프로세스를 식별하고 PPID는 부모를 식별합니다. 해당 필드를 명시적으로 요청합니다.

$ ps -o pid,ppid,stat,cmd

쉘이 ps를 시작하면 일반적으로 쉘의 PID가 해당 ps 프로세스의 PPID로 나타납니다. 시점이 중요합니다. 수명이 짧은 프로세스는 별도 관찰에서 잡기 전에 종료될 수 있습니다.

프로세스 목록에서 PPID는 무엇을 나타내나요?

PID 1과 부모 재지정

커널은 첫 번째 사용자 공간 프로세스를 PID 1로 시작합니다. 시스템에 따라 systemd, 다른 init 구현 또는 컨테이너나 PID 네임스페이스 안의 작은 init일 수 있습니다. PID 1은 사용자 공간 환경의 일부를 시작하고 감독하며 특별한 시그널 및 고아 프로세스 수거 책임을 갖습니다.

부모가 자식보다 먼저 종료되면 자식은 적절한 subreaper 또는 해당 PID 네임스페이스의 init 프로세스로 부모가 재지정됩니다. 원래 부모가 끝났다는 이유만으로 종료될 필요는 없습니다.

PID 1에 대한 정확한 설명은 무엇인가요?

레슨 완료

프로세스 생성 완료

이제 전통적인 Linux 프로세스 생성 순서를 추적할 수 있습니다.

  • fork()로 고유한 PID를 가진 자식을 만들 수 있습니다.

  • execve()로 PID를 바꾸지 않고 프로세스 이미지를 교체할 수 있습니다.

  • PID와 PPID를 읽어 부모-자식 관계를 식별할 수 있습니다.

  • PID 1과 subreaper를 부모가 재지정된 자식의 대상으로 이해할 수 있습니다.

학습 진행 상황 저장

무료 계정을 만들어 이 레슨을 저장하고 어떤 기기에서든 계속 학습하세요.

무료 계정 만들기
다음 수업
프로세스(으)로 돌아가기