调度 - 每个进程具有一个或多个内核堆栈的上下文切换

时间:2017-08-15 18:28:59

标签: linux linux-kernel kernel scheduled-tasks context-switch

考虑到Linux的情况,我们有每个用户堆栈的内核堆栈,据我所知,无论何时发生上下文切换,我们都会切换到当前进程的内核模式。

这里我们保存当前进程的当前状态,寄存器,程序数据等,然后调度程序(不确定它是否在此内核中运行)保存PCB并加载下一个要安排的进程的PCB。 / p>

现在第一个问题是,如果上面的解释似乎对你有意义,考虑一个上下文切换,其中每个进程也有一个“专用”内核堆栈。

我的问题的另一部分是,如果我们为所有进程都有一个内核堆栈,将如何进行上下文切换?

1 个答案:

答案 0 :(得分:0)

每个进程都有自己的内核堆栈。

我将使用最新的内核作为示例。

include/linux/sched.h中,有一个名为thread_union的联合,其定义如下:

union thread_union {
#ifndef CONFIG_THREAD_INFO_IN_TASK
    struct thread_info thread_info;
#endif
    unsigned long stack[THREAD_SIZE/sizeof(long)];
};

创建新流程后,内核会为其分配thread_union,每个流程都会有“专用”thread_union

  1. 第一个成员thread_info是一个结构,其中包含指向此过程的task_struct的指针。
  2. 第二个成员stack是此过程的内核堆栈。
  3. 这是一个联合,因此两个成员使用相同的内存空间。 thread_info不是很大,因此内核堆栈有足够的空间。
  4. 当进程调用系统调用时,它将使用自己的内核堆栈并保存指向内核堆栈中用户堆栈的%ESP

    每个进程都有自己的thread_union,因此它们有自己的“专用”内核堆栈。