进程可以共享一个堆栈吗?
我目前正在考虑是和否。他们分享了#34;堆栈,但它需要在使用之前复制并保存已存在的信息,并在第一个进程再次被CPU取回时返回它。但总的来说,我可能会对寄存器感到困惑。 有人可以帮我解释一下吗?
答案 0 :(得分:4)
进程不共享CPU堆栈。
虽然进程可以使用共享内存工具共享内存,但默认情况下进程不共享内存。操作系统试图最小化进程之间的共享量,以确保安全性。
在进程A和进程B之间共享CPU堆栈会对安全性产生不利影响,因为进程A可以查看" junk"由进程B留在堆栈上,反之亦然。黑客设法利用小规模的间接共享来创建一个主要的安全漏洞(您可以阅读有关Meltdown and Spectre here的更多信息)。共享CPU堆栈会产生更大的问题。
不言而喻,共享堆栈的尝试需要一定程度的进程间同步,这将导致整体性能过高。在CPU堆栈上进行独立操作的能力对于并发至关重要,即同一进程内的线程被分配单独的堆栈,即使它们已经共享分配给进程的所有内存,因此安全性不是问题。共享堆栈将有效地消除并发性,因为维护共享堆栈需要频繁的独占访问以及大量同步。
答案 1 :(得分:0)
某些系统使用所有进程共享的中断堆栈。通常,每个处理器有一个中断堆栈。
用户堆栈(系统使用的每种处理器模式通常都有一个)对每个进程(或线程)都是唯一的。
答案 2 :(得分:0)
寄存器和堆栈之间的区别在于后者可以在内存中的任何位置(它由适当的寄存器间接引用),而前者是固定的(只有一组体系结构可见的寄存器)。
堆栈是程序状态的一部分,就像将程序指令,数据和上下文混合在一起一样没有意义,混合两个堆栈是没有意义的。
如果程序A推送X,则它期望弹出X而不是程序B同时推送的最终值。
可以使所有程序共享相同的堆栈内存区域,但这通常会适得其反。
正如您所正确指出的那样,堆栈必须交换出来,因此,在两个程序A和B的情况下,需要两个额外的存储区:一个用于保存A的堆栈,另一个用于B的堆栈。 />
最后,使用三个存储区而不是两个。
有些情况下需要进行交换:当共享位于固定位置时 寄存器就是这种退化形式的情况,但其他结构可以有固定的位置 一个简单的例子是page table条目,如果程序A用于生成两个进程A1和A2,大多数操作系统将copy-on-write它们。 在这种情况下,这两个过程最终会共享很多页面,甚至是少数几个页面。因为操作系统可能更容易交换进出几个不同的页面,而不是使页面表(或其中的一部分)指向两个不同的位置。
一般情况下,如果我们无法承担多个资源实例,我们需要对其进行分时 由于我们可以负担多个堆栈实例,因此我们不愿意共享它。