Por que os valores do PID não são contínuos?


14

Se digitarmos ps -ef, obteremos uma lista de processos. Por que os números PID não são contínuos?

Respostas:


16

No Ubuntu, eles são contínuos. Em outros sistemas operacionais, pode ser diferente.

O kernel aloca PIDs no intervalo de (RESERVED_PIDS, PID_MAX_DEFAULT). Isso é feito sequencialmente em cada espaço para nome (tarefas em diferentes espaços para nome podem ter os mesmos IDs). No caso de o alcance se esgotar, a atribuição de pid será concluída.

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

Mente embora ...

  • O agendamento do kernel pode bifurcar um processo para que ele pareça ignorar números.
  • Um PID desaparecerá quando essa tarefa terminar.
  • Os PIDs não são reutilizados até que PID_MAX_DEFAULT seja atingido.
  • Um PID reserverd é ignorado.

Alguns tópicos sobre stackoverflow:

Nos comentários, há um comando para testar a atribuição de PIDs:

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

"O agendamento do kernel pode bifurcar um processo, por isso pode parecer pular números." - o kernel pode criar um processo enquanto determina qual processo executar? Isso parece estranho.
user253751

É bastante comum que o planejador bifurque um processo. Provavelmente este bit: lxr.free-electrons.com/source/kernel/pid.c#L125 que é determing it :)
Rinzwind

8

Os IDs de processo ausentes no meio já estão inoperantes e seus PIDs serão reutilizados pelo kernel nos processos posteriores.

Os processos mortos não serão mostrados na tabela de processos (exceto zumbis), portanto ps -ef, não os mostrarão.


3

Normalmente, o PID é contínuo, mas algum processo estará morto no momento em que você executar o comando ps -ef.

Além disso, alguns processos podem ser apenas um subprocesso de outro processo que não é mostrado no ps -efcomando. Para ver algum resultado expandido e você pode verificar o PID contínuo, use opstree

pstree -p

Saída de amostra:

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

enquanto que, se você executar, ps -efverá o processo pai.

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

2

Eles são contínuos. O PID é atribuído em ordem sequencial até que o limite máximo seja atingido. Após esse limite, ele começará novamente do zero.

Portanto, os PIDs ausentes ps -efsão de processos mortos. Observe que ps -eflista apenas os processos em execução.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.