Linux의 내부 프로세스 구성(가족 관계 관련)

Linux의 내부 프로세스 구성(가족 관계 관련)

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

답변1

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

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

답변2

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

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

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

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

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

관련 정보