2010-08-10 4 views
34

리눅스는 프로세스에 사용할 다음 PID를 어떻게 결정합니까? 이 질문의 목적은 Linux 커널을 더 잘 이해하는 것입니다. 커널 소스 코드를 게시하는 것을 두려워하지 마십시오. PID가 순차적으로 할당된다면 어떻게 리눅스가 갭을 채울 것인가? 끝까지 안타까워하면 어떻게됩니까?리눅스는 어떻게 다음 PID를 결정합니까?

예를 들어 <?php print(getmypid());?>을 수행하는 Apache에서 PHP 스크립트를 실행하면 새로 고침을 실행하는 동안 동일한 PID가 몇 분 동안 출력됩니다. 이 기간은 아파치가받는 요청의 수에 따라 달라집니다. 하나의 클라이언트 만있는 경우에도 PID가 결국 변경됩니다.

PID가 변경되면 가까운 숫자가되지만 얼마나 가깝습니까? 이 번호는 완전히 순차적 인 것으로 보이지 않습니다.

enter image description here

어떻게 리눅스는이 다음 번호를 선택 않습니다 나는 ps aux | grep apache을 할 경우 내가 프로세스의 공정한 번호를? 앞의 몇몇 PID는 여전히 실행 중이며 가장 최근에 인쇄 된 PID도 실행 중입니다. 아파치는 어떻게 이러한 PID를 재사용 할 것인가?

답변

48

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

일부 관련 코드 :

내부 alloc_pid (...)

for (i = ns->level; i >= 0; i--) { 
    nr = alloc_pidmap(tmp); 
    if (nr < 0) 
     goto out_free; 
    pid->numbers[i].nr = nr; 
    pid->numbers[i].ns = tmp; 
    tmp = tmp->parent; 
} 

alloc_pidmap()

static int alloc_pidmap(struct pid_namespace *pid_ns) 
{ 
     int i, offset, max_scan, pid, last = pid_ns->last_pid; 
     struct pidmap *map; 

     pid = last + 1; 
     if (pid >= pid_max) 
       pid = RESERVED_PIDS; 
     /* and later on... */ 
     pid_ns->last_pid = pid; 
     return pid; 
} 

커널의 맥락에서 PID를 그냥 int 식별자보다 더 참고 마십시오 관련 구조는 /include/linux/pid.h에서 찾을 수 있습니다. ID 외에도 ID와 작업 목록, 참조 카운터 및 빠른 액세스를위한 해시 목록 노드가 있습니다.

PID가 사용자 공간에서 순차적으로 나타나지 않는 이유는 커널 스케줄링이 프로세스 'fork() 호출 사이에 프로세스를 포크 할 수 있기 때문입니다. 사실 아주 일반적입니다.

+0

+1 너는 엉덩이가 나쁘다. 그래서 나는 너에게 뭔가를 주었다 ... – rook

+0

전역과 네임 스페이스 PID를 매핑 할 수있는 방법이 있습니까? –

11

차라리 당신이 을보고 동작을 가정 할 다른 소스에서 유래 :

좋은 웹 서버는 일반적으로 요청의 부하를 분산하기 위해 여러 프로세스 인스턴스가 있습니다. 이러한 프로세스는 풀에서 관리되며 요청이 들어올 때마다 특정 요청에 할당됩니다. 성능을 최적화하기 위해 Apache는 동일한 클라이언트의 여러 순차 요청에 동일한 프로세스를 할당합니다. 일정량의 요청이 처리 된 후 새 요청이 만들어집니다.

나는 순차적으로 하나 이상의 프로세스에 리눅스가 동일한 PID를 할당했다고 생각하지 않는다.

새로운 PID가 마지막 PID에 가까워지면 리눅스는 각 프로세스에 마지막 PID + 1을 간단히 할당한다고 생각합니다. 그러나 프로세스가 백그라운드에서 응용 프로그램과 따라서 여러분은 다음에 시작되는 아파치 프로세스의 정확한 숫자를 예측할 수 없다.

이외에도 이 아닌은 구현 한 것에 대한 기반으로 PID 할당에 대한 가정을 사용해야합니다. (sanmai의 의견도 참조하십시오.)

+0

나는 이것이 부분적으로 정확하다고 생각합니다. 불행히도이 답변을 뒷받침 할 증거가 없습니다. – rook

+0

이제 다른 답변을 참조하십시오. :-) – chiccodoro

+0

btw 저는 (+1) – rook

9

PID are sequential 대부분의 시스템. 유휴 상태의 컴퓨터에서 여러 프로세스를 직접 시작하여 볼 수 있습니다.

위쪽 화살표 역사 리콜 반복적으로 자신의 PID를 출력하는 명령을 실행하는 데 사용 :

$ ls -l /proc/self 
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21491 
$ ls -l /proc/self 
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21492 
$ ls -l /proc/self 
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21493 
$ ls -l /proc/self 
lrwxrwxrwx 1 root root 0 Mar 15 19:32 /proc/self -> 21494 

이에 의존하지 마십시오 : 보안상의 이유로, 어떤 사람들은 무작위로 새로운 PID를 선택하기 위해 여분의 CPU 시간을 보낼 커널을 실행합니다.

+0

이것은 사실으로 보이지 않습니다. – rook

+0

@ The Rock : 왜? – chiccodoro

+0

@chiccodoro 스크린 샷이 게시되었습니다. – rook

3

PID를 임의로 할당 할 수 있습니다. 이를 달성하기 위해 a number of ways이 있습니다.

+0

내가 아는 한, PID 무작위 화는 모호함을 통한 보안 때문에 리눅스 커널 개발팀에 의해 거부되었다. – Akshay

관련 문제