PID 및 증분 방법

PID 및 증분 방법

예를 들어, 10개의 프로세스가 있다고 가정해 보겠습니다.

process p0 with PID 1.
process p1 with PID 2.
process p2 with PID 3.
process p3 with PID 4.
process p4 with PID 5.
process p5 with PID 6.
process p6 with PID 7.
process p7 with PID 8.
process p8 with PID 9.
process p9 with PID 10.

다음과 같은 프로세스를 종료할 때:

kill 7

그리고 프로세스 p6이 성공적으로 종료되고 프로세스 p5와 p7 사이에 빈 공간이 있습니다. p10을 프로세스로 실행하면 커널이 PID 11을 p10에 할당합니다.

문제는 커널(linux 및 freebsd)이 p11 프로세스에 PID 7을 할당하는 대신 증분 PID를 할당하는 이유입니다.

답변1

PID는 일단 해제되면 재사용되지 않습니다. 그렇게 하면 경합이 발생하고 결국 보안 제한을 회피하는 데 사용될 수 있는 버그가 발생할 수 있습니다(참조:PID 레이스로 인한 Android 보안 버그의 예).

PID가 재사용되면 어떤 이유로든 PID를 보유하는 프로세스(예를 들어, 다른 프로세스에 신호 보내기) 통신하려는 프로세스가 종료되었음을 즉시 인식하지 못할 수도 있습니다. PID가 재활용되면 이를 사용하는 프로세스가 변경되었는지 여부를 안정적으로 감지하기가 어렵습니다. 이 재사용을 지연하면 경합 가능성이 낮아집니다(불가능하지는 않지만). 다른 방법으로는 최대 PID를 높이는 것(완료됨)이 있습니다.예를 들어Fedora에서는 /proc/sys/kernel/pid_max)를 참조하세요. 그러나 이는 가능성을 감소시킬 뿐입니다.

Linux 커널은 최근에 pidfds를 추가했습니다.프로세스와 해당 PID를 추론하는 안정적인 방법을 제공합니다.

관련 정보