PID는 어떻게 생성됩니까?


42

* nix에서 PID는 프로세스 실행을위한 고유 식별자입니다. PID는 어떻게 생성됩니까? 증가하는 정수입니까 아니면 목록과 같은 더 복잡한 구조입니까? 그들은 어떻게 재활용됩니까? 재활용이란 프로세스가 종료되면 다른 프로세스에서 PID를 재사용한다는 의미입니다.


답변:


39

위키 피 디아는 말한다

유닉스에서 프로세스 ID는 일반적으로 0부터 시작하여 시스템마다 다른 최대 값으로 올라 가면서 순차적으로 할당됩니다. 이 한계에 도달하면 할당이 0에서 다시 시작되고 다시 증가합니다. 그러나이 패스와 후속 패스의 경우 프로세스에 여전히 할당 된 PID는 건너 뜁니다.

"생성"에 대한 매우 간단한 정책입니다. 카운터를 늘리고 "재활용"하면 최대 값으로 숫자를 감싼 다음 완료된 프로세스에 할당 된 숫자를 찾을 때까지 계속 증가시킵니다. 프로세스 테이블에서 제거되었습니다.

AIX와 같은 일부 Unix 구현은 덜 간단한 정책을 사용합니다 (예 : 이 FAQ 참조) .


답변 해주셔서 감사합니다. 그런데이 AIX 정책은 "간단하지 않다"고 정확히 무엇입니까?

1
@Helltone, AIX가 사용하는 정책을 정확히 문서화하지 않는다고 생각하므로 (해당 릴리스에서 변경 될 수 있음) 적절한 범위에서 임의의 숫자 생성으로 생각할 수 있습니다 (PID가 생성 될 때까지 반복됩니다). 현재 사용 중이 아님).
Alex Martelli

이 알고리즘은 나에게 약간 문제가있는 것 같습니다. 교착 상태에 빠지지 않도록하려면 어떻게해야합니까? 성능 문제가 없습니까?

1
커널이 제어되고 있으며 아무것도 잠글 필요가 없으므로 어떻게 교착 상태가 될 수 있습니까? 예, 지불해야 할 성능 가격이 낮습니다 (포크 시간에 약간의 추가 오버 헤드-합동적인 PRNG 또는 / dev / urandom 읽기에 대한 수십 개의 기계 명령, 카운터 증가에 대한 수는 적음). 보안 향상을위한 조치의 경우 (예 : HTTPS 통신의 CPU 오버 헤드와 일반 HTTP 비교) ;-).
Alex Martelli

나는 livelock ( while(true);)을 의미했다 , 미안, 나는 빨리 대답하고 있었다 ;-)

11

그건 다양하다.

대부분의 시스템은 마지막으로 생성 된 마지막 PID의 수를 유지하고 하나를 추가 (65535와 같은 최대 수 또는 약간 작은 랩핑-종종 랩은 65000 또는 60000에서 발생)하고 현재 사용 중이 아닌지 확인합니다 ( PID가 여전히 사용 중이면 반복-커널 1 인 PID 1은 여전히 ​​존재하며 '재발급'되지 않습니다).

다른 보안 지향 시스템은 임의로 숫자를 생성하고 사용 중이 아닌지 확인합니다.

주어진 시간에 모든 PID 번호가 고유하다는 것이 보장됩니다.


9

문제의 재활용 부분과 관련하여 한 가지 명심해야 할 것은 pid가있는 프로세스가 종료되는 즉시 pid를 사용할 수 없다는 것입니다. 해당 프로세스의 부모가 wait () 시스템 호출 형식을 통해 자식의 종료 상태를 수집 할 때까지 pid를 사용할 수 없습니다. 종료되었지만 부모가 대기를 발행하지 않은 자녀를 좀비라고하며 일반적으로 ps에 기능 상실로 표시됩니다. 악의로 행동하는 부모는 자식을 시작하고 기다리지 않으면 pid 시스템을 굶주릴 수 있습니다.

프로세스의 부모가 자식의 상태를 수집하기 전에 죽으면 괜찮습니다. 자식은 wait ()가 발행되고 pid가 재활용되는지 확인하는 init에 의해 상속됩니다.


이것은 매우 중요한 세부 사항입니다. 그것 없이는 단순한 myprog &뒤에 wait $!UB 가 있을 것입니다.
Andreas

3

시스템이 충분히 오래 작동하면 시퀀스 번호이며 랩 특정 (OS 특정 값으로)입니다. 의 시점에서 무료가 아닌 한 숫자는 재사용되지 않습니다 fork().

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