Linux 프로세스의 내부 조직(가족 관계 관련)

Linux 프로세스의 내부 조직(가족 관계 관련)

내가 이해하는 바에 따르면 프로세스 설명자는 이중 연결 목록 데이터 구조에 저장됩니다. 그러나 fork동일한 프로세스에 대해 여러 하위 프로세스를 만드는 데 사용할 수 있으므로 여러 프로세스가 하나의 상위 프로세스를 가리키므로 트리 구조가 있다고 생각하게 됩니다. 어느 것이 맞나요? 프로세스 설명자는 프로세스와 다릅니까?

답변1

fork()프로세스 설명자를 복사하여 새 프로세스를 만듭니다. 따라서 두 프로세스는 (적어도 처음에는) 일부 데이터를 공유하지만 하나의 프로세스가 시작되자마자바꾸다쓰기 중 복사 메커니즘을 사용하면 변경 사항이 실제로 변경된 프로세스에만 국한됩니다. 이는 UNIX에서 프로세스 생성을 위한 표준 메커니즘입니다.

물론 이는 프로세스 간에 다소 자연스러운 부모-자식 관계를 생성하지만 이는 커널의 내부 표현과 무관합니다. 프로세스 설명자는 연결된 목록, 트리, 해시 테이블 또는 기타 (다소) 적합한 구조로 구현될 수 있습니다. 실제로 필요한 것은 상위 프로세스(및 하위 프로세스도 가능)를 가리키는 커널 프로세스 설명자에 있는 것입니다. 그것이 구조의 핵심 부분으로 사용되는지 여부는 설계 결정입니다. 그러한 결정을 내릴 때 영향을 미치는 많은 것 중 하나는 예를 들어 상위 프로세스가 종료되면 발생하는 일입니다. UNIX에서 프로세스는 init고아 프로세스(모든 하위 프로세스 포함)를 채택합니다.

답변2

혼란은 (1) 프로세스 설명자를 체계적으로 유지하는 것과 (2) 상위/하위 관계라는 두 가지를 혼합하는 데서 비롯됩니다.

다음에 실행할 프로세스 또는 (일반적으로) 신호를 전달할 프로세스를 결정하기 위해 상위/하위 관계가 필요하지 않습니다. 따라서 Linux ( 3.11.5 커널 소스에서 task_struct찾은 )에는 다음이 있습니다.linux/sched.h

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

맞습니다. 자식/부모 관계에 대한 트리 구조가 존재하지만 다른 목록과 부모에 대한 포인터에 숨겨져 있는 것 같습니다.

유명한 이중 연결 목록은 3.11.5 struct task_struct구조 정의에서 명확하지 않습니다. 코드를 올바르게 읽었다면 주석 처리되지 않은 구조체 요소 struct list_head tasks;는 "구성" 이중 연결 목록이지만 틀릴 수도 있습니다.

관련 정보