왜 PID 값이 연속적이지 않습니까?


답변:


16

우분투에서 그들은 연속적입니다. 다른 운영 체제에서는 다를 수 있습니다.

커널은 (RESERVED_PIDS, PID_MAX_DEFAULT) 범위에서 PID를 할당합니다. 각 네임 스페이스에서 순차적으로 수행됩니다 (다른 네임 스페이스의 작업은 동일한 ID를 가질 수 있음). 범위가 소진되면 pid 할당이 줄 바꿈됩니다.

( /programming/3446727/how-does-linux-determine-the-next-pid )

그래도 마음은 ...

  • 커널 스케줄링은 프로세스를 분기하여 숫자를 건너 뛰는 것처럼 보일 수 있습니다.
  • 해당 작업이 끝나면 PID가 사라집니다.
  • PID_MAX_DEFAULT에 도달 할 때까지 PID를 재사용하지 않습니다.
  • reservedrd PID를 건너 뜁니다.

stackoverflow에 대한 몇 가지 주제 :

주석에는 PID의 가정을 테스트하는 명령이 있습니다.

for i in {1..20}; do sh -c 'echo $$'; done

"커널 스케줄링은 프로세스를 분기하여 숫자를 건너 뛰는 것처럼 보일 수 있습니다." 커널은 어떤 프로세스를 실행할지 결정하면서 프로세스를 만들 수 있습니까? 이상해 보인다.
user253751

스케줄러가 프로세스를 분기하는 것이 일반적입니다. 아마도이 비트 : lxr.free-electrons.com/source/kernel/pid.c#L125 :)
Rinzwind

8

그 사이에 누락 된 프로세스 ID는 이미 죽었으며 PID는 이후 프로세스에서 커널에 의해 재사용됩니다.

죽은 프로세스는 프로세스 테이블에 ps -ef표시되지 않으므로 (좀비 제외) 표시되지 않습니다.


3

일반적으로 PID는 연속적이지만 명령을 실행할 때만 일부 프로세스가 종료됩니다 ps -ef.

또한 일부 프로세스는 ps -ef명령에 표시되지 않은 다른 프로세스의 하위 프로세스 일 수 있습니다 . 확장 된 결과를보고 연속 PID를 확인하려면pstree

pstree -p

샘플 출력 :

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

실행 ps -ef하면 부모 프로세스 만 보입니다.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

그들은 연속적입니다. PID는 최대 한계에 도달 할 때까지 순차적으로 할당됩니다. 이 제한 후에는 0부터 다시 시작됩니다.

따라서 누락 된 PID ps -ef가 죽은 프로세스입니다. 참고 ps -ef목록은 실행중인 프로세스.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.