我了解到每个进程在内存中都有自己的区域/块,包括堆栈,堆,数据和文本(代码)(参见this)。
现在我正在阅读有关上下文切换的内容。我读到在上下文切换期间,CPU寄存器被压入堆栈,然后整个堆栈将被保存到过程控制块中。那基本上是这样的吗?
如果每个进程都拥有自己的堆栈,为什么我需要保存堆栈?
答案 0 :(得分:2)
完整堆栈未保存在上下文切换中。进程上下文块仅包含我所知道的每个系统上的寄存器值。
堆栈只是一块内存。没什么特别的。唯一使它成为堆栈的是堆栈指针寄存器引用它。一个进程可以有多个堆栈。实际上他们通常会这样做。进程通常具有每个处理器模式的堆栈。在多线程中,每个线程都有一个堆栈。
答案 1 :(得分:0)
当发生上下文切换时,内核会引入一个新进程并“启动”旧进程。但是当一个旧进程轮到占用CPU时,它的先前状态(它被“踢出”的状态)必须恢复,从它停止的位置开始执行。
所有架构都有有限数量的寄存器。寄存器也包含在要存储以进行驱逐的过程的状态中。将寄存器保存在堆栈上是为了提高效率,因此您只需要重新输入值。
此外,每个进程都有自己的进程控制块(PCB)来将这些值存储在上下文切换中,这样调度算法就不会受到阻碍,并且可以处理一些简单的进程ID。当进程获取CPU时,将附加使用该ID附加的PCB。
编辑 据我所知,x86中没有CPU堆栈。 CPU有堆栈指针指向堆栈的第一个元素。