프로세스 테이블()에서 PID 번호를 보면 ps -a
PID가 연속된 번호가 아니고 때로는 번호 사이에 큰 "간격"이 있기 때문에 어떤 패턴도 찾을 수 없습니다. 짧은 시간 동안 실행되고 일부 PID를 유지하는 일부 프로세스가 있을 수 있기 때문입니까? 프로세스 번호가 재설정되는 특정 범위가 있습니까?
저는 Mac OS X를 사용하고 있지만 대답은 일반적으로 UNIX에 적용되어야 할 것 같습니다.
답변1
둘 다입니다.
많은 프로세스의 수명이 짧습니다. PID를 얻고, 실행하고, 완료하면 PID가 프로세스 테이블에서 사라집니다.
프로세스는 때때로 몇 분의 1초 동안만 존재합니다!
일반적으로 프로그램이 시작되면 시스템 확인 및 환경 초기화의 일부로 여러 명령을 실행합니다.
최대 PID 번호는 시스템에 따라 다르며 때로는 구성 가능합니다. 기본적으로 프로세스 수가 많을 경우 프로세스 수를 늘리고 싶을 수도 있지만 새 운영 체제에서는 일반적으로 대부분의 작업 부하에 최대 수로도 충분하다고 생각합니다.
PID는 프로세스 테이블의 항목으로, 프로세스 테이블이 많을수록 더 많은 메모리를 차지합니다.
이 관련 질문을 확인하십시오.https://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris
또한 이와 관련된 '사용자당 최대 프로세스 수'는 악의적인 사용자가 의도적으로 많은 프로세스를 생성하여 전체 프로세스 테이블을 점유하는 것을 방지하기 위한 조치라는 점에 유의하세요.
답변2
일부 최신 커널은 보안 강화를 위해 새로운 프로세스에 임의의 PID를 할당하도록 구성할 수도 있습니다. 최소한 Linux와 FreeBSD는 sysctl 설정을 통해 이를 수행할 수 있지만 OpenBSD는 항상 그렇게 합니다. 이러한 경우 번호 매기기 패턴에 대해 덜 말할 수 있습니다.
답변3
UNIX의 프로세스는 매우 가볍고 저렴하며 다음과 같은 방식으로 탄생했습니다.포크(!).
이것분기이러한 측면은 종종 사용자, 시스템 관리자 및 프로그래머, 특히 Windows와 같은 소위 "생성" 지향 시스템의 사용자를 혼란스럽게 합니다.
Windows는 포크할 수 없습니다.스레드만 분기할 수 있습니다.(기술적으로 포크될 수 있지만 이 API는 WINAPI 프로그램에서 액세스할 수 없습니다.)
즉, UNIX에서 포크는 Windows 프로세스 생성보다 스레드 생성과 더 유사합니다. 초기 프로세스를 자체적으로 분할하고 하위 프로세스는 상위 프로세스의 복사본을 실행하며 둘 다 분기 지점까지 동일한 데이터와 기록을 공유합니다(그러면 각각의 기록이 느리지만 꾸준히 분기되기 시작합니다).
다른 답변에서 이미 말했듯이 이 모든 것(저렴하고 빠르며 가벼움)은 PID가 매우 빠르게 나타나고 사라질 수 있음을 의미합니다.
인터넷 서버를 작성하는 전통적인 UNIX 방식은 연결별 모델을 사용하는 것임을 이해하십시오. 이는 기본적으로 각 연결에 대해 새 PID를 생성하는 것을 의미합니다.
http 서버를 제공하는 매우 바쁜 이미지의 컨텍스트를 고려하십시오. 이미지가 원격 클라이언트에 표시될 때마다 이는 새로운 PID가 분기되고, 이미지 데이터가 읽히고 전송된 다음, 모든 부분 동안 PID가 소비됨을 의미합니다. 1초 동안 매우 빠르고 지속적으로 발생합니다. 오늘날까지 전통적인 FTP와 많은 경량 http 서버는 여전히 이런 방식으로 작성됩니다.
더 이상 존재하지 않는 UNIX의 또 다른 초기 이상한 측면입니다. 죽은 프로세스PID를 공개하지 마세요!특정 PID 프로세스가 종료되면 어떤 식으로든 나머지 PID에 영향을 미칠 수 없습니다. 그러나 이 PID는 여전히 할당되어 시스템 프로세스 테이블을 점유/점유합니다.
왜 그런 겁니까? 프로그램 종료 코드 값과 프로세스의 다양한 계정 카운터가 프로세스 테이블 PID 아래에 저장되기 때문입니다!
이를 통해 CPU 및 메모리 통계 프로그램은 종료된 후에도 하위 프로세스에 대한 정보를 읽을 수 있습니다.
우리는 유효하지 않은 회계 기록을 다음과 같이 지칭합니다.좀비.
이는 특정 좀비 프로세스가 처리될 때까지 해당 PID를 새로운 분기 프로세스에서 재사용할 수 없음을 의미합니다(즉, 매우 간단한 선형 PID 할당 방식을 사용하는 UNIX 시스템에서는 처리를 기다리는 여러 좀비 프로세스로 인해 "버그"가 발생할 수 있습니다. ).
프로세스의 상위 프로세스는 다음을 담당합니다."수확" 좀비즉, 계정 정보를 소비하여 좀비의 PID를 "무료 PID" 풀로 반환하여 다른 포크된 프로세스에서 재사용할 수 있도록 하는 것입니다.
이러한 모든 사실을 고려하면, PID 생성이 첫 번째 "비워진" PID를 재사용하는 경향이 있는 간단한 선형 알고리즘이라 할지라도 다양한 시스템 작업(예: 부모 좀비 수확)으로 인해 PID가 절대 엄격한 선형 성장을 하지 않는다는 것을 알 수 있습니다.
모든 최신 시스템에서는 완전히 무작위인 PID 할당 알고리즘을 활성화할 수 있지만 OpenBSD는 기본적으로 이를 시행하는 유일한 알고리즘입니다.
그러므로 우리는 항상 PID를 완전히 불투명한 식별자로 취급해야 합니다.