init 프로세스: 모든 프로세스의 조상?

init 프로세스: 모든 프로세스의 조상?

나는 항상 init 프로세스가 모든 프로세스의 조상이라는 것을 알고 있었습니다. 프로세스 2의 PPID가 0인 이유는 무엇입니까?

$ ps -ef | head -n 3
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May14 ?        00:00:01 /sbin/init
root         2     0  0 May14 ?        00:00:00 [kthreadd]

답변1

첫째, '조상'은 '부모'와 다르다. 조상은 부모의 부모... 부모의 부모가 될 수 있으며 커널은 한 수준만 추적합니다. 그러나 프로세스가 종료되면 그 자식은 init에 의해 채택되므로 일반적인 시스템에서는 부모가 1인 많은 프로세스를 볼 수 있습니다.

최신 Linux 시스템에는 커널 코드를 실행하는 추가 프로세스가 있지만 예약을 위해 사용자 프로세스로 관리됩니다. (커널 코드를 실행하기 때문에 일반적인 메모리 관리 규칙을 따르지 않습니다.) 이러한 프로세스는 kthreadd커널 스레드의 초기화에 의해 생성됩니다. /proc/2/exe읽을 수 없다는 사실(일반적으로 프로세스 실행 파일에 대한 심볼릭 링크)로 식별 할 수 있습니다 . 또는 ps대괄호 안에 이름을 넣어 나열합니다(일반 사용자 프로세스에서는 가능하지만 일반적이지 않음). 상위 프로세스 ID 2를 사용하는 대부분의 프로세스는 커널 프로세스이지만 PPID 2를 사용하는 일부 커널 도우미 프로세스도 있습니다(아래 참조).

프로세스 1( init)과 2( kthreadd)는 시작 시 커널에 의해 직접 생성되므로 상위 프로세스가 없습니다. 이를 나타내려면 ppid 필드에 0 값을 사용하십시오. 여기서 0은 "커널 자체"를 의미합니다.

Linux에는 커널이 위치가 결정되는 사용자 프로세스를 시작할 수 있는 도구도 있습니다.시스템 제어 매개변수일부 경우에. 예를 들어, 커널은 kernel.modprobesysctl 값에서 프로그램을 호출하여 모듈 로드 이벤트(예: 새 하드웨어가 발견되거나 특정 네트워크 프로토콜이 처음으로 사용되는 경우)를 트리거할 수 있습니다. 프로그램이 코어를 덤프하면 커널은kernel.core_pattern그렇다면. 이러한 프로세스는 사용자 프로세스이지만그들의 부모는 다음과 같이 등록되어 있습니다.kthreadd.

답변2

  1. 커널의 구조는 task_struct매크로 코드에 의해 정적으로 생성됩니다.
    struct task_struct init_task = INIT_TASK(init_task);
    EXPORT_SYMBOL(init_task);
    
    이것은 nr전역 PID 번호입니다. 0부터 시작됩니다.
    #define INIT_STRUCT_PID {                                \
        .numbers     = { {                                   \
            .nr      = 0,                                    \
            .ns      = &init_pid_ns,                         \
            .pid_chain   = { .next = NULL, .pprev = NULL },  \
        }, }                                                 \
    }
    
  2. 커널 시작 프로세스 중에 두 개의 스레드(init 및 kthreadd)가 생성됩니다.
    static noinline void __init_refok rest_init(void)
    {
         /* spawn init thread */
         kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
    
         /* spawn kthreadd thread */
         pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
    
         cpu_idle();
    }
    
    커널의 자연스러운 결과로 init processpid 1과 pid 2가 있습니다. kthreadd process따라서 ppid는 0입니다.

관련 정보