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

Can OS processes share a single CPU stack?

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

我目前正在考虑是和否。他们 "share" 堆栈,但它需要在使用它之前复制并保存已经存在的信息,并且 return 当第一个进程再次被 CPU 拾取时。但我可能会将其与一般的寄存器混淆。 有人可以帮我解释一下吗?

进程不共享 CPU 个堆栈。

虽然进程可以使用共享内存设施共享内存,但默认情况下进程不共享内存。操作系统会尽量减少进程之间的共享量,以确保安全。

在进程 A 和 B 之间共享 CPU 堆栈不利于安全性,因为进程 A 可以探查进程 B 留在堆栈上的 "junk",反之亦然。黑客设法利用规模小得多的间接共享来制造重大安全漏洞(您可以阅读有关 Meltdown and Spectre here 的更多信息)。共享 CPU 堆栈会产生更大的问题。

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

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

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

寄存器和栈的区别是后者可以在内存中的任何地方(它被适当的寄存器间接引用),而前者是固定的(只有一组架构可见的寄存器)。

堆栈是程序状态的一部分,就像将程序指令、数据和上下文混合在一起是没有意义的,将两个堆栈混合在一起也是没有意义的。
如果程序 A 压入 X,它期望弹出 X 而不是同时由程序 B 压入的最终值。

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

有些情况下需要交换:当共享位于固定位置时。
寄存器的某些退化形式就是这种情况,但其他结构可以有固定位置。
一个简单的例子是 page table entries, if a program A is used to generate two processes A1 and A2, most OSs will copy-on-write 他们。
在这种情况下,这两个进程最终会共享很多页面,甚至只有少数几个。因为 OS 可能更容易换入和换出几个不同的页面,而不是让页面 table(或其一部分)指向两个不同的位置。

一般来说,如果我们不能拥有一个资源的多个实例,我们需要分时使用它。
由于我们可以负担得起拥有多个堆栈实例,因此我们宁愿不共享它。