.png)
내가 이해하는 바에 따르면 프로세스 설명자는 이중 연결 목록 데이터 구조에 저장됩니다. 그러나 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;
는 "구성" 이중 연결 목록이지만 틀릴 수도 있습니다.