单核系统如何处理抢占?

How preemption is handled in single core systems?

给定一个采用抢占式多任务处理的单核系统,OS 如何在系统上执行用户模式应用程序时执行线程中断?由于处理器正在处理用户代码,它什么时候有机会向线程调度程序请求上下文切换。它的处理方式与页面错误类似吗?如果是,它发生的频率是多少,是否会导致性能下降?

阅读硬件中断。

硬件定时器发出周期性中断。当一个发生时,CPU 切换到内核模式并执行一个例程,即中断处理程序。这就是上下文切换发生的地方。当 CPU 从内核模式返回到用户模式时,它 returns 控制与中断发生的线程不同的线程。被抢占线程的状态自然会被保存。

抢占立即发生,而不是在下一个时间片边界。如果不是由于中断,那么这是由于较低优先级的线程设置了某种类型的事件,而较高优先级的线程正在挂起(等待)。通常 OS API 从用户模式到内核模式的切换是通过 X86 sysenter 指令完成的。

时间分片用于在相同优先级的线程之间切换,不认为是抢占。

一对一:

Given a single core system that employs preemption for multitasking, how does the OS carry out thread interrupts when a user mode application is executing on the system?

两种方式。 1) 用户代码进行系统调用导致进入内核或硬件外围设备请求 'real' 处理器中断导致驱动程序进入 运行,并且该驱动程序进行适当的内核进入,例如.在中断时请求调度程序 运行-return 因为它已经准备好一个线程。

Since the processor is handling the user code when does it get a chance to ask the thread scheduler for context switch.

运行ning 用户代码可以进行可以随时更改线程状态的系统调用。最重要的是,内核可以在来自驱动程序的硬件中断时进入,例如。 KB、鼠标、磁盘、内存管理器、网络、计时器。

Is it handled similarly to page faults?

页面错误中断是来自外围设备的硬件中断:内存管理硬件。它需要加载适当的 page/s 并重新启动生成中断的失败指令。它是一组可能改变线程状态的硬件中断中的一个。 'Is it handled similarly to page faults?' 正在向后看问题。

And if it is, how often it happens

好吧,这取决于线程进行相关系统调用的频率以及它们请求不能立即可用的资源的频率,因此在资源可用之前不需要 CPU 执行。

and isn't it causing a performance

hit?

嗯,不 :) 抢占式多任务处理通常会带来很大的性能提升,因为它不会将执行资源应用到不需要它的线程,并且可以快速将执行应用到急需它的线程。如果没有抢占,系统将无法及时响应 IO 完成,IO 性能将非常糟糕。您可能会忘记 audio/video streaming/playback、高速网络下载等应用程序。系统性能太差,他们根本无法工作。这种性能提升是在大多数环境中广泛使用此类系统的首要原因。在某些示例中,先发制人 OS 可能会导致感知 and/or 实际性能 'hit',但您必须非常努力地在典型的台式机或服务器盒中找到一个。