【问题标题】:How processor is switched from user mode to kernel mode?处理器如何从用户模式切换到内核模式?
【发布时间】:2014-04-30 22:26:52
【问题描述】:

如果我理解正确,操作系统在内核模式下运行并安排进程执行。然后我们进入用户模式并执行我们的进程代码。然后不知何故我们回到内核模式并安排下一个进程执行。

我了解到系统调用(例如:访问文件系统的请求)会导致 CPU 回到内核模式。但是,假设有这样的代码:

for(int i = 0; i > -1; ++i);

这将花费很多时间,而且看起来这里不会进行任何系统调用。

是什么导致处理器从用户模式切换回内核模式?一些超时?

【问题讨论】:

    标签: operating-system kernel scheduling


    【解决方案1】:

    我将只讨论英特尔架构(我也使用这个架构)))。 首先,进程没有被调度。线程是调度的基本单位。在现代操作系统(如 windows、macos 或 linux)中,每个线程(将要运行的内容)都有一个标准的时间量。在这个时间间隔内,线程也可以等待一些东西(IO,同步原语),这也导致在这个 CPU 上调度另一个线程。此外,如果时间量化结束,调度程序开始执行另一个线程。调度程序与定时器中断一起工作,以大约几毫秒的分辨率完成此任务。

    我了解到系统调用(例如:访问文件系统的请求)会导致 CPU 回到内核模式。但是假设有这个代码

    不仅系统调用会导致当前 CPU 上的当前特权级别提高。中断和异常也会导致这种情况。此外,IA32 也有几个不常用的方法,比如调用门,但这在现代操作系统中没有使用。

    是什么导致处理器从用户模式切换回内核模式?一些超时?

    正如我之前所说,一般来说这是定时器中断。基本上即使在他们的时间量化线程中,也可以多次切换用户和内核模式,包括硬件中断、软件和硬件异常以及服务调用。

    【讨论】:

      【解决方案2】:

      让我们分析您的问题。

      Q 1. 操作系统在内核模式下运行并安排进程执行。然后我们进入用户模式并执行我们的进程代码。然后不知何故我们回到内核模式并安排下一个进程执行。

      Ans: 有时不仅是内核调度器调度用户线程执行,它还涉及用户空间中的调度器。由于这种冲突,优先级倒置问题浮出水面,研究人员仍在努力寻找有效的解决方案。所以要安排你的线程,你的线程不需要进入内核模式。内核中的调度程序将处理它,因为它具有系统中运行的所有线程/进程的列表。仅当您的线程需要除调度之外的任何来自内核的服务时,您的线程才会进入内核模式。所以基本上,执行你的线程不需要去内核,模式切换从时间和空间的角度来看是非常昂贵的,因为内核应该将用户线程的堆栈帧存储在内核堆栈中。应尽可能避免在用户和内核之间切换。

      Q 2:我了解到系统调用(例如:访问文件系统的请求)会导致 CPU 回到内核模式。但是,假设有这段代码: for(int i = 0; i > -1; ++i); 这将花费很多时间,而且看起来这里不会进行任何系统调用。 是什么导致处理器从用户模式切换回内核模式?一些超时?

      Ans:每个用户和内核线程的某个时间量是根据内核设置的。如果该线程超过其执行时间,调度程序将抢占 CPU 中当前正在运行的线程,并从运行队列中调度另一个线程。由于有许多算法用于如何在 CPU 中调度线程,并且不同的系统遵循适合需求的不同方法。 由于您的代码花费的时间比分配的量子调度程序会抢占您的线程并调度其他线程。其他线程可能是用户级线程或内核线程。因此,您可以看到一个或多个内核线程在抢占您的线程后运行。没有必要切换到内核线程。这完全取决于优先级。

      我希望我在一定程度上回答了你的问题。

      【讨论】:

        【解决方案3】:

        在我看来,您要问的是您的代码(在一个进程中)是否正在运行一个无限循环,如您的示例所示,操作系统如何切换到另一个进程?答案是 CPU 被计时器打断,让操作系统执行其调度过程。此时,操作系统调度程序可能决定在当前运行的进程(在您的示例中具有 for 循环)和准备好运行的另一个进程(例如在同一台计算机上运行的编辑器)之间进行上下文切换。实际上,计时器中断处理程序中断了 for 循环的执行(在您的示例中)并将控制权交给了内核调度程序过程。这是对所发生情况的简要描述,实际实现要详细得多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-04
          • 2015-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-27
          • 2012-04-15
          • 2016-12-26
          相关资源
          最近更新 更多