為什麼 Unix 子程序繼承[大多數]父進程屬性

為什麼 Unix 子程序繼承[大多數]父進程屬性

了解 Unix 進程如何運作,並注意到子行程從父進程繼承大部分屬性(包括檔案描述符)。我也剛了解到執行以及它如何用全新的屬性(新的記憶體空間等)取代子進程屬性,但保留原始進程 ID。

然後我知道了Node.js 中的沙箱環境,其中它為您提供了一個基本上空的石板,並且您可以將變數和“功能”添加到子進程的上下文中。

我想知道的是,子進程接收的屬性有哪些不同類型的配置,以及為什麼 Unix 中的子進程「預設」繼承所有父屬性。想知道為什麼它不擁有自己的記憶體空間之類的。

也想知道這兩種情況是否有替代的「子進程屬性配置」(繼承所有父屬性,或不繼承)。也許它想要繼承一半的父地址空間,或者使用兄弟進程的一些地址空間,或者使用父進程的一些文件描述符以及它自己的一些文件描述符,等等。程序和其他不等。

我有興趣知道在 Unix 或任何其他作業系統上建立子進程時是否有一種方法可以傳遞此類「配置功能」。例如,「創建子進程,使用父地址空間的一半,兄弟2的地址空間的1/4,兄弟1的地址空間的1/8,剩餘的1/8使用我自己的本地地址空間。另外,提供存取權限a、b 和 c 裝置驅動程序,否則不允許網路存取。任意的東西,基本上就是將子程序的「功能集」配置為精細的細節。

想知道 Unix 或其他作業系統中是否會發生類似的情況,如果沒有,為什麼不呢。我不明白為什麼決定只採用這兩種許可/監管流程。

這似乎與保護環概念。您可以阻止使用者態進程(子進程)存取某些功能。想知道為什麼它沒有比這更高級的可配置性。

答案1

你在這裡混合蘋果、柳橙和葡萄柚。

  • 例如,「node.js」是 JavaScript高階語言,這與作業系統進程無關。 (所有 JavaScript 都在其主機提供的進程或執行緒中運行。)

  • “環”,或者更一般地說“CPU 特權等級”,是微處理器晶片的物理特性,用於確定程式允許發出哪些 CPU 指令以及可以存取哪些資源。

  • Unix/Linux軟體架構對於這些作業系統來說是非常特定的,與以下概念密切相關:“分叉”,看起來像這樣:

    if (pid = fork()) {
        ... you are the parent, and 'pid' is the child's process-id ...
    } else {
        ... 'pid' is zero, so you are the child ...
    }
    

為了讓這個巧妙的想法發揮作用,父級的大部分上下文必須複製到子級。

系統exec()呼叫可以(由子進程)用來將其整個上下文替換為某個新進程的上下文,從而導致父進程的所有「繼承」被切斷。

相關內容