处理器如何从用户模式切换到内核模式?

时间:2014-03-23 17:44:56

标签: operating-system kernel scheduling

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

我将仅讨论英特尔架构(amd也使用此拱门)))。 首先,没有安排流程。线程是调度的基本单位。在现代操作系统(如windows,mac或linux)中,每个线程,即将运行的内容,都有一个标准的时间量。在这段时间内,线程也可以等待某些东西(IO,同步原语),这也导致在这个CPU上调度另一个线程。此外,如果时间量程结束,则调度程序开始执行另一个线程。调度程序使用定时器中断来执行此操作,分辨率大约为几ms。

  

我已经读过系统调用(例如:访问文件系统的请求)导致CPU返回内核模式。但是,让我们说有这个代码

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

  

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

正如我之前所说,通常这是计时器中断。基本上即使在时间定量线程可以多次切换beetwen用户和内核模式,硬件中断,软件和硬件异常和服务调用。

答案 1 :(得分:0)

让我们分析一下你的问题。

问答1.操作系统在内核模式下运行并安排执行流程。然后我们进入用户模式,执行我们的进程代码。然后我们回到内核模式,下一个进程被安排执行。

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

问题2:我已经读过系统调用(例如:访问文件系统的请求)导致CPU返回内核模式。但是,假设有这样的代码: for(int i = 0; i> -1; ++ i); 这将需要很长时间,看起来这里不会进行任何系统调用。 导致该处理器从用户模式切换回内核模式的原因是什么?一些超时?

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

我希望我在某种程度上回答了你的问题。

答案 2 :(得分:0)

在我看来,你问的是你的代码(在一个进程中)是否正在运行一个无限循环,如你的例子所示,操作系统如何切换到另一个进程?答案是cpu被一个定时器中断,让操作系统完成调度程序。此时,OS调度程序可以决定在当前运行的进程(在您的示例中具有for循环)和另一个准备运行的进程(比如在同一台计算机上运行的编辑器)之间进行上下文切换。实际上,定时器中断处理程序会中断for循环的执行(在您的示例中)并控制内核调度程序过程。这是对发生的事情的简要描述,实际的实现更加详细。