맨위로가기

자식 프로세스

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자식 프로세스는 다른 프로세스(부모 프로세스)에 의해 생성된 프로세스를 의미한다. 유닉스 계열 운영체제에서는 `fork()` 시스템 콜을 사용하여 부모 프로세스의 복사본으로 생성되며, 파일 디스크립터 등 많은 속성을 상속받는다. MS-DOS에서는 부모 프로세스가 메모리에 존재하지만 실행이 정지된 상태에서 다른 응용 프로그램을 실행하는 방식으로 자식 프로세스를 생성하기도 한다. 자식 프로세스가 종료되면 SIGCHLD 신호가 부모 프로세스로 전송되며, 부모 프로세스가 먼저 종료된 자식 프로세스는 고아 프로세스가 되어 `init` 프로세스에 의해 입양된다. 자식 프로세스가 종료될 때 일부 정보가 부모 프로세스로 반환되며, 부모가 `wait`를 호출하기 전에 자식 프로세스가 종료되면 좀비 프로세스가 발생할 수 있다.

더 읽어볼만한 페이지

  • 프로세스 - 문맥 교환
    문맥 교환은 운영 체제에서 CPU가 여러 프로세스나 스레드를 번갈아 실행하기 위해 현재 작업 상태를 저장하고 다른 작업 상태를 복원하는 과정으로, 멀티태스킹 환경에서 필수적인 기술이며 프로세스 제어 블록을 통해 관리된다.
  • 프로세스 - 데몬 (컴퓨팅)
    데몬은 운영 체제에서 사용자와 상호 작용 없이 백그라운드에서 실행되며 시스템의 다양한 작업을 처리하는 프로세스이다.
자식 프로세스

2. 역사

하위 프로세스의 개념은 1960년대 후반으로 거슬러 올라가며, 초기 형태는 IBM OS/360 운영 체제의 고정 작업 수 멀티프로그래밍(MFT-II)에서 '서브 태스크'를 도입하면서 시작되었다. (태스크 참조)[1] 현재의 유닉스 형태는 멀틱스(1969)에서 비롯되었고, 윈도우 NT 형태는 OpenVMS(1978), RSX-11(1972)에서 비롯되었다.[1]

3. 생성 방식

운영체제에 따라 하위 프로세스를 생성하는 방식은 다양하다.

유닉스 계열 운영체제에서는 `fork()` 시스템 호출을 사용하여 상위 프로세스의 복사본을 생성하고, 필요에 따라 `exec`를 사용하여 다른 프로그램으로 덮어쓰는 방식을 사용한다.[14]

일부 운영 체제에서는 `spawn()` 함수를 사용하여 하위 프로세스를 생성하는 스폰(Spawn) 방식을 사용한다.[1]

MS-DOS에서는 부모 프로세스가 메모리에 상주한 채로 자식 프로세스를 실행하고, `EXIT` 명령어로 부모 프로세스에 복귀하는 방식을 사용했다. 이는 주로 워드 프로세서, 표 계산 소프트웨어, 텍스트 편집기 등에서 어셈블러나 컴파일러 등을 실행하기 위해 사용되었다.

3. 1. 포크(Fork) 방식

유닉스 계열 운영체제에서 하위 프로세스는 파일 디스크립터와 같은 대부분의 속성을 상위 프로세스로부터 상속받는다. 일반적으로 `fork()` 시스템 호출을 사용하여 상위 프로세스의 복사본을 생성한다.[14] 그런 다음 하위 프로세스는 필요에 따라 `exec`를 사용하여 다른 프로그램과 오버레이될 수 있다.

자식 프로세스는 속성의 대부분(예: 파일 디스크립터)을 부모 프로세스로부터 상속받는다. 유닉스에서 자식 프로세스는 일반적으로 fork 시스템 콜을 사용하여 부모 프로세스의 복사본으로 생성된다. 자식 프로세스는 필요에 따라 다른 프로그램으로 자체를 덮어쓸 수 있다.[1]

3. 2. 스폰(Spawn) 방식

스폰(Spawn) 방식은 일부 운영 체제에서 `spawn()` 함수를 사용하여 하위 프로세스를 생성하는 방식이다.[1]

3. 3. MS-DOS 방식

MS-DOS의 응용 소프트웨어 중에는 자신을 메모리에 유지한 채로 다른 응용 프로그램을 실행하는 기능을 가진 것이 있었다. (주로 MS-DOS의 COMMAND.COM)

이 경우, 부모 프로세스가 되는 호출원 응용 프로그램은 메모리상에 존재하지만 실행은 완전히 정지한다. 자식 프로세스로 기동한 COMMAND.COM은 MS-DOS영어 기동 시 읽어들인 셸로서의 COMMAND.COM과는 다른 메모리 공간에 존재하며, 부모 프로세스에 `EXIT` 명령어로 복귀할 수 있었다. 주요 용도로는 워드 프로세서나 표 계산 소프트웨어 등에서 플로피 디스크의 포맷을 실행하기 위해, 또는 텍스트 편집기 등에서 디스크 포맷 외에도 어셈블러나 컴파일러 등을 기동하기 위해 사용되었다.

MS-DOS영어의 응용 프로그램이나 외부 명령도 셸로서의 COMMAND.COM의 자식 프로세스로 간주할 수 있다.

4. 프로세스 관계

자식 프로세스는 파일 디스크립터와 같은 대부분의 속성을 부모 프로세스로부터 상속받는다. 유닉스에서 자식 프로세스는 보통 fork 시스템 콜을 사용하여 부모 프로세스의 복사본으로 생성된다. 그런 다음 자식 프로세스는 필요에 따라 다른 프로그램으로 자신을 덮어쓸 수 있다.[1]

각 프로세스는 여러 자식 프로세스를 생성할 수 있지만, 부모 프로세스는 최대 하나만 가질 수 있다. 부모가 없는 프로세스는 대개 커널에 의해 직접 생성되었음을 의미한다. 리눅스 기반 시스템을 포함한 일부 시스템에서 최초의 프로세스(init)는 부팅 시 커널에 의해 시작되어 종료되지 않는다(리눅스 시작 프로세스 참조). 부모가 없는 다른 프로세스는 사용자 공간에서 다양한 데몬 작업을 수행하기 위해 시작될 수 있다. 부모 프로세스가 종료되어 자식 프로세스가 고아 프로세스가 되는 경우, 이 프로세스는 곧 ''init''에 의해 입양된다.

SIGCHLD 신호는 자식 프로세스가 종료, 중단되거나, 중단 후 재개될 때 부모에게 전송된다. 기본적으로 이 신호는 무시된다.[2]

4. 1. 부모 프로세스와 자식 프로세스

각 프로세스는 여러 개의 하위 프로세스를 생성할 수 있지만, 부모 프로세스는 최대 하나만 가질 수 있다. 커널은 프로세스 식별자(PID)를 사용하여 프로세스를 식별한다.

유닉스에서는, 0번 프로세스(스와퍼)를 제외하면 다른 프로세스가 `fork` 시스템 콜로 생성한 것이다. `fork`를 호출한 프로세스가, 그것에 의해 생성된 프로세스로부터 본 부모 프로세스이다. 프로세스는 하나의 부모 프로세스를 가지지만, 자식 프로세스는 다수 존재할 수도 있다.

커널은 프로세스를 PID로 식별한다. 0번 프로세스는 시스템 부팅 시에 생성되는 특별한 프로세스로, 자식 프로세스(1번 프로세스)를 생성한 후에는 스와퍼 프로세스가 된다(Solaris영어나 UNIX System V|SVR4.2MP영어에서는 멀티 스레드화되어 커널 내의 각종 정기 처리를 수행한다). 1번 프로세스는 `init`이며, 시스템 내 다른 프로세스의 조상이 된다.

4. 2. 고아 프로세스

부모 프로세스가 먼저 종료된 프로세스를 고아 프로세스라고 한다.[9]

유닉스 계열 운영체제에서는 고아 프로세스는 즉시 `init` 프로세스를 양부모로 갖게 된다. 이 조작을 리페어렌팅(reparenting, 재양육)[10]이라고 부르며, 자동으로 수행된다. 기술적으로 `init` 프로세스가 부모가 되어도, 원래 부모 프로세스가 이미 종료되었기 때문에 "고아 프로세스"라고 계속 불린다.

원격 프로시저 호출(RPC)에서 클라이언트가 요청을 서버에 보낸 후 크래시가 발생했을 때, 서버 측에 남겨진 프로세스를 고아 프로세스라고 부른다. 이 고아 프로세스는 서버의 자원을 낭비하고, 경우에 따라 서버 전체의 불통의 원인이 된다. 이에 대한 대처 방법은 다음과 같다.

# 근절[11]이 가장 일반적인 방법이다. 이 경우 고아 프로세스는 강제 종료된다.

# 재생[12]은 클라이언트가 재부팅될 때 타임스탬프를 서버에 전송하고, 이를 받아 고아 프로세스를 종료한다.

# 기한 만료[13]는 타이머를 설정하여 그 사이에 처리가 완료되지 않으면 고아 프로세스를 종료한다. 클라이언트가 응답하지 않는 것 외의 원인으로 처리가 완료되지 않을 때는 타이머를 연장한다.

5. 수명 종료

하위 프로세스가 종료되면 일부 정보가 상위 프로세스로 반환된다.

부모 프로세스가 `wait`를 호출하기 전에 하위 프로세스가 종료되면, 커널은 종료 상태와 같은 프로세스에 대한 일부 정보를 유지하여 부모 프로세스가 나중에 `wait`를 호출할 수 있도록 한다.[15] 이러한 하위 프로세스는 시스템 자원을 계속 소비하지만 실행되지는 않기 때문에 좀비 프로세스라고 불린다.[15] `wait` 시스템 호출은 일반적으로 SIGCHLD 핸들러에서 호출된다.

POSIX.1-2001에서는 상위 프로세스가 SIGCHLD의 처리를 SIG_IGN으로 명시적으로 설정하거나,[16] SIGCHLD 신호에 SA_NOCLDWAIT 플래그를 설정하여 종료되는 하위 프로세스를 커널이 자동으로 회수하도록 할 수 있다. 리눅스 커널 2.6 버전은 이 동작을 준수하며, FreeBSD는 5.0 버전부터 이 두 가지 방법을 모두 지원한다.[17] 그러나 SIGCHLD 무시와 관련하여 System V와 BSD 동작 간의 역사적 차이로 인해, `wait` 호출은 분기된 하위 프로세스 정리(clean-up)를 위한 가장 이식성 있는 방법으로 남아 있다.[18]

SIGCHLD 시그널은 하위 프로세스가 종료되거나, 중단되거나, 중단된 후 재개될 때 하위 프로세스의 부모 프로세스에게 전송된다. 기본적으로 이 시그널은 무시된다.[2]

참조

[1] FOLDOC Child+process
[2] Man signal.h bd
[3] Man wait for process to change state wait
[4] 웹사이트 The Linux kernel: Signals http://www.win.tue.n[...] Win.tue.nl 2014-04-30
[5] 웹사이트 http://fuse4bsd.creo[...]
[6] Man examine and change a signal action sigaction
[7] Lang child process
[8] Lang parent process
[9] Lang orphan process
[10] Lang re-parenting
[11] Lang extermination
[12] Lang reincarnation
[13] Lang expiration
[14] Man signal.h bd
[15] Man wait for process to change state wait
[16] 웹인용 The Linux kernel: Signals http://www.win.tue.n[...] Win.tue.nl 2014-04-30
[17] 웹사이트 http://fuse4bsd.creo[...]
[18] Man examine and change a signal action sigaction



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com