为什么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()系统调用可被(子进程)用来将其整个上下文替换为某个新进程的上下文,从而导致来自父进程的所有“继承”被切断。

相关内容