내가 이해한 바로는 프로세스 설명자는 이중 연결 목록 데이터 구조에 저장됩니다. 그러나 fork
동일한 프로세스에 대해 여러 하위 프로세스를 만드는 데 사용할 수 있습니다. 여러 프로세스가 상위 프로세스를 가리키기 때문에 트리 구조가 있다고 생각하게 됩니다. 어느 것이 맞나요? 프로세스 설명자는 프로세스와 다릅니까?
답변1
fork()
프로세스 설명자를 복사하여 새 프로세스를 만듭니다. 따라서 두 프로세스는 (적어도 초기에는) 일부 데이터를 공유하지만 일단 하나의 프로세스가 시작되면변화기록 중 복사 메커니즘을 통해 변경 사항이 실제로 변경한 프로세스에만 국한됩니다. 이는 UNIX에서 프로세스 생성을 위한 표준 메커니즘입니다.
물론 이는 프로세스 간에 상당히 자연스러운 부모-자식 관계를 생성하지만 커널의 내부 표현과는 아무런 관련이 없습니다. 프로세스 설명자는 연결된 목록, 트리, 해시 테이블 또는 기타 (다소) 적합한 구조로 구현될 수 있습니다. 실제로 필요한 것은 상위 프로세스(및 하위 프로세스도 가능)를 가리키는 커널 프로세스 설명자에 배치하는 것입니다. 이를 구조물로 사용할지 여부의 핵심 부분은 설계 결정입니다. 그러한 결정을 내릴 때 고려해야 할 많은 사항 중 하나는 예를 들어 상위 프로세스가 종료되면 어떤 일이 발생하는지입니다. UNIX에서는 프로세스가 init
고아(및 모든 하위 프로세스)가 됩니다.
답변2
혼란은 (1) 프로세스 설명자를 체계적으로 유지하는 것과 (2) 상위/하위 관계라는 두 가지를 혼합하는 데서 비롯됩니다.
다음에 실행할 프로세스 또는 (일반적으로) 신호를 전달할 프로세스를 결정하기 위해 상위/하위 관계가 필요하지 않습니다. 따라서 Linux task_struct
( linux/sched.h
3.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_struct
3.11.5 구조 정의에서 명확하지 않습니다. 코드를 올바르게 읽고 있다면 주석 처리되지 않은 구조체 요소 struct list_head tasks;
는 "구성" 이중 연결 목록이지만 틀릴 수도 있습니다.