OS进程可以共享一个CPU堆栈吗?

问题描述 投票:1回答:3

进程可以共享一个堆栈吗?

我现在正在考虑是和否。他们“共享”堆栈但是它需要在使用它之前复制并保存已经存在的信息,并在第一个进程再次被CPU拾取时返回它。但总的来说,我可能会对寄存器感到困惑。有人能帮我解释一下吗?

operating-system cpu cpu-architecture
3个回答
4
投票

进程不共享CPU堆栈。

虽然进程可以使用共享内存工具共享内存,但默认情况下进程不共享内存。操作系统尝试最小化进程之间的共享量,以确保安全性。

在进程A和B之间共享CPU堆栈会对安全性产生不利影响,因为进程A能够在进程B的堆栈中留下“垃圾”,反之亦然。黑客设法利用小规模的间接共享来创建一个主要的安全漏洞(你可以阅读更多有关Meltdown and Spectre here的内容)。共享CPU堆栈会产生更大的问题。

不言而喻,共享堆栈的尝试将需要一定程度的进程间同步,这将使整体性能受到限制。在CPU堆栈上进行独立操作的能力对于并发至关重要,即同一进程内的线程被分配单独的堆栈,即使它们已经共享分配给进程的所有内存,因此安全性不是问题。共享堆栈将有效地消除并发性,因为维护共享堆栈需要频繁的独占访问以及大量同步。


0
投票

某些系统使用所有进程共享的中断堆栈。通常,每个处理器有一个中断堆栈。

用户堆栈(系统使用的每种处理器模式通常都有一个)对每个进程(或线程)都是唯一的。


0
投票

寄存器和堆栈之间的区别在于后者可以在存储器中的任何位置(它由适当的寄存器间接引用),而前者是固定的(只有一组体系结构可见的寄存器)。

堆栈是程序状态的一部分,就像将程序指令,数据和上下文混合在一起毫无意义一样,混合两个堆栈毫无意义。 如果程序A推送X,则它期望弹出X而不是程序B同时推送的最终值。

可以使所有程序共享相同的堆栈存储区域,但这通常会适得其反。 正如您所正确指出的那样,堆栈必须在out中交换,因此,在两个程序A和B的情况下,需要两个额外的内存区域:一个用于保存A的堆栈,另一个用于B的堆栈。 最后,使用三个存储区而不是两个。

有些情况下需要交换:当共享位于固定位置时。 这是寄存器的一些简并形式的情况,但其他结构可以具有固定的位置。 一个简单的例子是page table条目,如果程序A用于生成两个进程A1和A2,大多数操作系统将copy-on-write它们。 在这种情况下,这两个过程最终会共享很多页面,甚至是少数几个页面。因为操作系统可能更容易交换进出几个不同的页面,而不是使页面表(或其中的一部分)指向两个不同的位置。

通常,如果我们无法承担多个资源实例,我们需要对其进行时间共享。 由于我们可以负担多个堆栈实例,因此我们不愿意共享它。

© www.soinside.com 2019 - 2024. All rights reserved.