Organización interna (respecto a las relaciones familiares) de procesos en Linux

Organización interna (respecto a las relaciones familiares) de procesos en Linux

Según tengo entendido, los descriptores de procesos se almacenan en una estructura de datos de lista doblemente enlazada. Pero forkse puede usar para crear múltiples hijos para el mismo proceso, lo que me hace pensar que hay una estructura de árbol, porque múltiples procesos apuntarán a un proceso padre. ¿Cual es correcta? ¿Los descriptores de procesos son diferentes de los procesos?

Respuesta1

fork()crea un nuevo proceso copiando el descriptor del proceso. Por lo tanto, los dos procesos comparten (al menos inicialmente) algunos datos, pero tan pronto como comienza un procesocambiandoEn él, el mecanismo de copia en escritura garantiza que el cambio se localice únicamente en el proceso que realmente lo realizó. Es el mecanismo estándar para la generación de procesos en UNIX.

Por supuesto, esto crea una relación padre-hijo bastante natural entre procesos, aunque esto es independiente de la representación interna en el núcleo. Los descriptores de procesos se pueden implementar como una lista enlazada, un árbol, una tabla hash o cualquier otra estructura (más o menos) adecuada. Todo lo que realmente se necesita es colocarlo en el descriptor del proceso del núcleo que apunte al proceso principal (y posiblemente también a los procesos secundarios). Si se utiliza o no como parte clave de la estructura es una decisión de diseño. Una de las muchas cosas que entran en juego al decidir tal cosa es, por ejemplo, lo que sucede una vez que el proceso principal sale: en UNIX el initproceso adopta procesos huérfanos (con todos sus procesos secundarios).

Respuesta2

Su confusión surge de mezclar dos cosas: (1) mantener organizados los descriptores del proceso y (2) la relación padre/hijo.

No necesita la relación padre/hijo para decidir qué proceso ejecutar a continuación o (en general) a qué proceso enviar una señal. Entonces, Linux task_struct(que encontré linux/sched.hpara la fuente del kernel 3.11.5) tiene:

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 */

Tienes razón, existe una estructura de árbol para la relación padre/hijo, pero parece estar oculta en otra lista y un puntero al padre.

La famosa lista doblemente enlazada no es obvia en la struct task_structdefinición de estructura 3.11.5. Si leo el código correctamente, el elemento de estructura no comentado struct list_head tasks;es la lista doblemente enlazada "organizadora", pero podría estar equivocado.

información relacionada