Onde está o PCB no Linux

10

Um PCB ou bloco de controle de processo é definido como este na Wikipedia

O Process Control Block (PCB, também chamado Task Control Control Block, [1] Task Struct ou Switchframe) é uma estrutura de dados no kernel do sistema operacional que contém as informações necessárias para gerenciar um processo específico. O PCB é "a manifestação de um processo em um sistema operacional

e seu dever é:

Process identification data
Processor state data
Process control data

Então, onde o PCB de um processo pode ser encontrado?

Mohammad Reza Rezwani
fonte
Consulte também Bloco de controle de processo no Linux no Stack Overflow.

Respostas:

15

No kernel do Linux, cada processo é representado por uma task_structem uma lista duplamente vinculada, cujo cabeçalho é init_task(pid 0, não pid 1). Isso é conhecido como tabela de processo .

No modo de usuário, a tabela de processos é visível para usuários normais em /proc. Tomando os títulos da sua pergunta:

  • Os dados de identificação do processo são o ID do processo (que está no caminho /proc/<process-id>/...), a linha de comando ( cmd) e possivelmente outros atributos, dependendo da sua definição de 'identificação'.

  • Os dados do estado do processo incluem dados de agendamento ( sched, state schedstat), o que o processo está aguardando no momento ( wchan), seu ambiente ( environ) etc.

  • Pode-se dizer que os dados de controle de processo são suas credenciais ( uid_map) e limites de recursos ( limits).

Portanto, tudo depende de como você define seus termos ... mas, em geral, todos os dados sobre um processo podem ser encontrados /proc.

Flup
fonte
"cuja cabeça é init_task(pid 0, não pid 1)" Não existe tal coisa como init_task. É init, e seu pid é 1, não 0 (confirmado via pidof init).
AleksandrH
1
@AleksandrH init_task é uma estrutura do kernel e não um processo. Aponta para a tarefa ociosa que é representada internamente pelo pid 0. init_task e init são coisas completamente diferentes.
Flup
E ainda assim pidé apenas para processos ...
AleksandrH
1
@AleksandrH Leia init / init_task.c na árvore de fontes do kernel ( github.com/torvalds/linux/blob/master/init/init_task.c ).
Flup 15/09/18