【问题标题】:forced preemption on windows (occurs or not here)Windows 上的强制抢占(此处发生或不发生)
【发布时间】:2013-08-21 13:11:31
【问题描述】:

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

我的问题是:

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

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

【问题讨论】:

  • 您的生死取决于操作系统调度程序(这不是 Windows 独有的)。编写您的程序,就像它可以随时被抢占一样(因为它可能会被抢占)。

标签: windows multithreading winapi operating-system preemption


【解决方案1】:

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

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

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

除此之外,休眠 5 毫秒充其量是不精确的,否则不可靠

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

更糟的是,you cannot even rely on Sleep's rounding mode,因为 Windows 2000/XP 与 Windows Vista/7/8 不同。

【讨论】:

  • 鼠标是否会抢占(撕裂)我的计算框架,或者这确实发生在睡眠或消息泵时间段中?调度程序会组织它 - 这是我正在搜索的主要信息
  • 调度程序无法“组织”它,因为它无法控制何时发生外部事件(例如鼠标移动或网卡接收到某些东西),并且这些通常需要立即处理。基于“信用”授予非抢占量子将不利于整体响应能力。
  • 这是有道理的——但我们在这里谈论的是硬件中断可能不会进行切换。进程切换与将一个繁重的工作程序切换到另一个繁重的工作更相关,如果 make 调度程序会做得更明智我认为在第一个睡觉时切换 - 当第一个在睡觉时工作时,schedulet 会完全忽略,而只是强制一切?
  • 如上所述,您的线程不会因睡眠而获得“奖励积分”。操作系统调度程序根据优先级提供可用的时间片。特别是 Windows 调度程序首先服务于所有较高优先级的任务,如有必要,中断较低的优先级任务。优先级是进一步动态的(参见“提升”)。所以是的,这也发生在没有 haedware 中断的情况下。
【解决方案2】:

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

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

【讨论】:

  • 好的,但这不仅仅是关于担保人,在​​运行时调查这个怎么样 - 我可以在运行时收集一些关于这个抢占事件的信息 - 如果它们存在,它们需要多长时间?我在每一帧的开始和结束时(这个 20 毫秒的循环周期)使用了一些计时器询问,我从来没有注意到任何选择 - 当我开始使用 iTunes 播放 mp3 音乐时,我注意到它们;但是这里没有保证,但似乎这种强制/帧撕裂抢占在现实中不会发生 - 有些规则我不知道,正在寻找了解它们
  • “强制抢占”必须发生以提供良好的 I/O 性能。这首先是导致先发制人多任务处理复杂化的主要原因。
猜你喜欢
  • 2012-01-17
  • 1970-01-01
  • 2010-12-19
  • 2015-12-30
  • 1970-01-01
  • 2018-05-05
  • 2021-09-18
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多