답변:
첫째,“조상”은“부모”와 같은 것이 아닙니다. 조상은 부모의 부모의 부모가 될 수 있으며 커널은 한 수준 만 추적합니다. 그러나 프로세스가 종료되면 해당 프로세스의 자식이 init에 의해 채택되므로 일반적인 시스템에서 부모가 1 인 많은 프로세스가 표시됩니다.
최신 Linux 시스템에는 커널 코드를 실행하는 몇 가지 프로세스가 있지만 예약과 관련하여 사용자 프로세스로 관리됩니다. (커널 코드를 실행하고 있기 때문에 일반적인 메모리 관리 규칙을 따르지 않습니다.)이 프로세스는 모두 kthreadd
커널 스레드의 시작 부분에 의해 생성됩니다 . 부모 프로세스 ID (2) 또는 일반적으로 ps
대괄호 사이에 이름 을 나열하거나 사실 /proc/2/exe
(일반적으로 프로세스 실행 파일에 대한 심볼릭 링크)을 읽을 수 없다는 사실로 그것들을 인식 할 수 있습니다.
프로세스 1 ( init
) 및 2 ( kthreadd
)는 부팅시 커널에 의해 직접 만들어 지므로 부모가 없습니다. 값 0은 ppid 필드에서이를 나타 내기 위해 사용됩니다. 여기서 0은 "커널 자체"를 의미하는 것으로 생각하십시오.
리눅스는 또한 커널이 특정 상황에서 sysctl 매개 변수 를 통해 위치를 나타내는 사용자 프로세스를 시작할 수있는 기능을 가지고 있습니다. 예를 들어, 커널은 kernel.modprobe
sysctl 값으로 프로그램을 호출하여 모듈 로딩 이벤트를 트리거 할 수 있습니다 (예 : 새 하드웨어가 발견되거나 일부 네트워크 프로토콜이 처음 사용될 때) . 프로그램이 코어를 덤프하면 커널은 표시된 프로그램을 호출합니다 kernel.core_pattern
.
kernel.core_pattern
프로그램이 코어를 덤프 할 때 나열된 프로그램). 일반적인 시스템에서는 프로세스가 빠르게 작업을 수행 한 다음 종료하는 경향이 있기 때문에이를 볼 수 없습니다.
init
모두의 "조상"입니다user threads
동안,[kthreadd ]
모두의 "부모가"kernel threads
오른쪽? 고마워!