초기화 프로세스 : 모든 프로세스의 조상?


26

나는 항상 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]

답변:


32

첫째,“조상”은“부모”와 같은 것이 아닙니다. 조상은 부모의 부모의 부모가 될 수 있으며 커널은 한 수준 만 추적합니다. 그러나 프로세스가 종료되면 해당 프로세스의 자식이 init에 의해 채택되므로 일반적인 시스템에서 부모가 1 인 많은 프로세스가 표시됩니다.

최신 Linux 시스템에는 커널 코드를 실행하는 몇 가지 프로세스가 있지만 예약과 관련하여 사용자 프로세스로 관리됩니다. (커널 코드를 실행하고 있기 때문에 일반적인 메모리 관리 규칙을 따르지 않습니다.)이 프로세스는 모두 kthreadd커널 스레드의 시작 부분에 의해 생성됩니다 . 부모 프로세스 ID (2) 또는 일반적으로 ps대괄호 사이에 이름 을 나열하거나 사실 /proc/2/exe(일반적으로 프로세스 실행 파일에 대한 심볼릭 링크)을 읽을 수 없다는 사실로 그것들을 인식 할 수 있습니다.

프로세스 1 ( init) 및 2 ( kthreadd)는 부팅시 커널에 의해 직접 만들어 지므로 부모가 없습니다. 값 0은 ppid 필드에서이를 나타 내기 위해 사용됩니다. 여기서 0은 "커널 자체"를 의미하는 것으로 생각하십시오.

리눅스는 또한 커널이 특정 상황에서 sysctl 매개 변수 를 통해 위치를 나타내는 사용자 프로세스를 시작할 수있는 기능을 가지고 있습니다. 예를 들어, 커널은 kernel.modprobesysctl 값으로 프로그램을 호출하여 모듈 로딩 이벤트를 트리거 할 수 있습니다 (예 : 새 하드웨어가 발견되거나 일부 네트워크 프로토콜이 처음 사용될 때) . 프로그램이 코어를 덤프하면 커널은 표시된 프로그램을 호출합니다 kernel.core_pattern.


1
그래서 init모두의 "조상"입니다 user threads동안, [kthreadd ]모두의 "부모가" kernel threads오른쪽? 고마워!
Nan Xiao

1
@NanXiao 주로 그렇습니다. 마지막 단락에서 언급했듯이 사용자 프로세스가 커널에 의해 시작되는 몇 가지 다른 방법이 있습니다 (예 : kernel.core_pattern프로그램이 코어를 덤프 할 때 나열된 프로그램). 일반적인 시스템에서는 프로세스가 빠르게 작업을 수행 한 다음 종료하는 경향이 있기 때문에이를 볼 수 없습니다.
Gilles 'SO- 악의를 멈추십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.