2015-10-20 165 views
1

我已经了解到,每个进程都有自己的内存区域/块,由栈,堆,数据和文本(代码)组成(见this)。进程堆栈和CPU堆栈有什么区别?

现在我正在阅读关于上下文切换的内容。我读过在上下文切换过程中CPU寄存器被压入堆栈,然后整个堆栈将被保存到过程控制块中。这基本上是如何工作的?

为什么我需要保存堆栈如果每个进程都有自己的堆栈?

+0

添加体系结构。它是x86吗? – Downvoter

+0

每个CPL都有自己的堆栈。阅读关于TSS(任务状态段)的内容。 – Downvoter

+0

是x86,单核。也许你可以解释我的上下文切换。我清楚地看到的文件说:寄存器被压入堆栈 - >堆栈被保存在PCB中。我错过了什么? – Richard

回答

2

完整的堆栈未保存在上下文切换中。进程上下文块只包含我知道的每个系统上的寄存器值。

堆栈只是一块内存。没有什么特别的。唯一使它成为堆栈的是堆栈指针寄存器引用它。一个进程可以有多个堆栈。事实上他们通常会这样做。对于每种处理器模式,进程通常都有一个堆栈。在多线程中,每个线程都有一个堆栈。

0

当发生上下文切换时,内核引入一个新进程并“弹出”旧进程。但是当一个旧的进程轮到占用CPU时,它的前一个状态(当它被“踢出”时的状态)必须恢复到从其停止点开始执行。
所有体系结构都有有限的寄存器数量。寄存器也包含在要被驱逐存储的进程状态中。将堆栈中的寄存器保存在堆栈中是为了提高效率,因此您只需要将值弹回即可。
此外,每个进程都有其自己的进程控制块(PCB),以便在上下文切换中存储这些值,以便调度算法不受阻碍,并且可以处理一些简单的进程ID。当进程获取CPU时,附有该ID的PCB将被恢复。

编辑 据我所知,x86中没有CPU堆栈。 CPU有堆栈指针指向堆栈的第一个元素。