PID가 고갈되면 어떻게 되나요?

PID가 고갈되면 어떻게 되나요?

이것은 결코 일어나지 않을 것이기 때문에 순전히 학문적인 질문입니다.

PID가 임의의 정밀도 유형이 아닌 pid_t 유형으로 저장되면 한 번에 존재할 수 있는 PID 수에 제한이 있습니다. PID 오버플로에 대해 정의된 동작이 있습니까?

65536번째 프로세스가 /sbin/init를 종료하고 커널 패닉을 유발합니까? 아니면 안전조치가 있나요?

답변1

POSIX는 이전 PID를 증가시켜 각각의 새로운 프로세스의 PID를 얻을 것을 요구하지 않습니다. 단지 고유해야 합니다.

각 PID가 증가하는 시스템에서 특정 상한( fork()내 경험상 약 2 15 )에 도달한 후 값이 바뀌는 것을 관찰했습니다. 래핑 후에는 일부 PID 값이 여전히 이전 주기의 값을 사용하기 때문에 새 PID가 엄격하게 증가하지 않습니다.

2N이 될 때까지는 문제가 되지 않습니다. 동시에 실행프로세스. 나는 이 일이 발생하기 오래 전에 시스템에 약간의 용량 제약이 있었던 것 같습니다. 이 경우 fork()시스템 호출은 실패하며 또는 errno로 설정될 수 있습니다 ( 자세히 알아보기).EAGAINENOMEMman fork

구현된 코드는 forkPID가 사용 가능한지 여부를 확인할 수도 있고 확인하지 않을 수도 있습니다. 해당 지점에 도달하기 전에 시스템 리소스가 고갈되었다고 가정하기 때문에 신경 쓰지 않을 수도 있고, 완전성을 명시적으로 확인하고 향후 가능성을 처리할 수도 있습니다. 아직 확인해 보지도 않았고, 만약 그렇다면 제가 본 커널만 해결할 수 있을 것입니다.

업데이트: 현재 시스템(Ubuntu 20.04)에서 최대 PID는 아래와 같이 2 22 입니다.

$ cat /proc/sys/kernel/pid_max
4194304

에서 man proc:

/proc/sys/kernel/pid_max (Linux 2.5.34부터)

이 파일은 PID 래핑 값을 지정합니다(즉, 이 파일의 값은 최대 PID보다 1 더 큽니다). 이 값보다 큰 PID는 할당되지 않으므로 이 파일의 값은 전체 프로세스 및 스레드 수에 대한 시스템 전체 제한 역할도 합니다. 이 파일의 기본값인 32768은 이전 커널과 동일한 PID 범위를 생성합니다. 32비트 플랫폼에서는 32768이 pid_max의 최대값입니다. 64비트 시스템에서 pid_max는 최대 2^22(PID_MAX_LIMIT, 약 400만)의 값으로 설정할 수 있습니다.

그러나 특정 최대값은 32767개 이상의 프로세스보다 4+00000개의 프로세스를 가질 가능성이 낮지 않는 한 문제와 관련성이 낮을 수 있습니다.

답변2

시스템 fork호출은 -1을 반환하고 errno다음으로 설정되어야 합니다.이가온. 그 후에 일어나는 일은 호출 프로세스에 따라 달라집니다 fork.

~에서십자가:

다음과 같은 경우에는 fork() 함수가 실패합니다.

[다시]

시스템에 다른 프로세스를 만드는 데 필요한 리소스가 부족하거나 시스템 전체 또는 단일 사용자가 실행하는 총 프로세스 수에 대해 시스템에서 부과한 제한인 {CHILD_MAX}개를 초과합니다.

답변3

최대 PID 제한은 2^((sizeof(int)*CHAR_BIT). 바라보다프로세스 ID의 최대값은 얼마입니까?. 즉, PID는 결코 40억에 가까워지지 않습니다.

모든 pid 슬롯이 채워지면 fork호출이 실패하기 시작합니다 errno==EAGAIN(참조:포크(2)). 모든 슬롯을 채우지 않고 단순히 맨 위로 이동하면 다음 PID는 1 다음의 빈 슬롯이 됩니다(1은 초기화됨).

관련 정보