Organização interna (no que diz respeito a relações familiares) de processos no Linux

6

Pelo que entendi, os descritores de processo são armazenados em uma estrutura de dados de lista duplamente vinculada. Mas fork pode ser usado para criar vários filhos para o mesmo processo, então isso me faz pensar que existe uma estrutura em árvore, porque vários processos apontarão para um processo pai. Qual é correto? Os descritores de processo são diferentes dos processos?

    
por CODError 14.10.2013 / 22:25

2 respostas

5

Sua confusão decorre da mistura de duas coisas: (1) manter os descritores de processo organizados e (2) o relacionamento pai / filho.

Você não precisa do relacionamento pai / filho para decidir qual processo será executado em seguida ou (em geral) para qual processo entregar um sinal. Então, o Linux task_struct (que eu encontrei em linux/sched.h para a fonte do kernel 3.11.5) tem:

struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
/*
 * children/sibling forms the list of my natural children
 */

struct list_head children;  /* list of my children */
struct list_head sibling;   /* linkage in my parent's children list */

Você está correto, existe uma estrutura de árvore para o relacionamento filho / pai, mas ela parece estar oculta em outra lista e um ponteiro para o pai.

A famosa lista duplamente vinculada não é óbvia na definição da estruturastruct task_struct de 3.11.5%. Se eu ler o código corretamente, o elemento de estrutura não comentado struct list_head tasks; é a lista duplamente vinculada de "organização", mas posso estar errado.

    
por 15.10.2013 / 16:37
6

fork() cria um novo processo copiando o descritor de processo. Portanto, os dois processos compartilham (pelo menos inicialmente) alguns dados, mas assim que um processo começa a alterar , o mecanismo de cópia na gravação garante que a alteração seja localizada apenas no processo que realmente foi feito. isto. É o mecanismo padrão para a geração de processos no UNIX.

Isso, é claro, cria uma relação pais-filhos bastante natural entre processos, mas isso é independente da representação interna no kernel. Os descritores de processo podem ser implementados como uma lista vinculada, árvore, tabela de hash ou qualquer outra estrutura (mais ou menos) adequada. Tudo o que realmente precisa é colocar no descritor de processo do kernel que aponta para o processo pai (e possivelmente os processos filhos também). Se é ou não usado como uma parte fundamental da estrutura é uma decisão de design. Uma das muitas coisas que entram em jogo ao decidir tal coisa é, por exemplo, o que acontece quando o processo pai sai - no UNIX, o processo init adota processos órfãos (com todos os seus processos filhos).

    
por 14.10.2013 / 22:59