1

对不起,我的英语很弱,抢占我的意思是强制上下文(进程)切换应用于我的进程。

我的问题是:

如果我编写和运行我自己的程序游戏,它会在 20 毫秒的周期内工作,然后是 5 毫秒的睡眠,然后 Windows 泵(查看消息/调度消息)一次又一次地循环 - 它是否曾经在 Windows 中被强制抢占或者不,这种抢占不会发生?

我想如果我不自愿通过睡眠或窥视/调度更长时间将控制权交还给系统,就会发生这种抢占。在这里,它会发生还是不会发生?

4

2 回答 2

2

简短的回答是:是的,可以,而且会被抢占。

不仅驱动程序事件(中断)可以在任何时候抢占您的线程,这种情况也可能由于临时优先级提升而发生,例如当一个可等待对象发出信号而线程被阻塞时,或者例如由于另一个窗口成为最上面的窗口。或者,另一个进程可能会简单地调整其优先级。

没有办法(没有给您的进程实时优先级,这是一个非常糟糕的主意 - 立即忘记它)保证没有“正常”线程会抢占您,即使这样硬件中断也会抢占您,并且某些处理磁盘 I/O 和鼠标的线程会随着时间的推移与您竞争。所以,即使你以实时优先级(这不是真正的“实时”)运行,你仍然无法保证,但你严重干扰了重要的系统服务。

最重要的是,睡眠 5 毫秒充其量是不精确的,否则也不可靠

睡眠将使您的线程在下一个调度程序滴答声中准备好(准备好并不意味着“它将运行”,它仅意味着它可以运行——当且仅当时间片可用并且没有其他就绪线程首先排队时) . 这实际上意味着您睡眠的时间量被四舍五入到系统计时器分辨率的粒度(参见timeBeginPeriod函数),加上一些未知时间。
默认情况下,计时器分辨率为 15.6 毫秒,因此您的 5 毫秒平均为 7.8 秒(假设最好的、无竞争的情况),但可能更多。如果您将系统计时器分辨率调整为 1 毫秒(这通常是可能的最低值,尽管某些系统允许 0.5 毫秒),它会好一些,但仍然不精确或不可靠。另外,使调度程序更频繁地运行会在中断和电源中消耗大量 CPU 周期。因此,这不是一般可取的事情。

更糟糕的是,您甚至不能依赖Sleep的舍入模式,因为 Windows 2000/XP 的舍入方式与 Windows Vista/7/8 不同。

于 2013-08-19T20:00:01.933 回答
1

它可以随时被司机打断。驱动程序可能会向另一个线程发出信号,然后要求操作系统调度/调度。新准备的线程可能会代替您的线程运行。

这些桌面操作系统(如 Windows)不提供任何实时保证——它们并非旨在提供实时保证。

于 2013-08-19T17:22:34.630 回答