2013-08-19 19 views
0

對不起,我弱的英語,通過搶佔我的意思是強制上下文 (進程)開關應用到我的過程。強制搶佔窗口(發生或不在這裏)

我的問題是:

如果我編寫和運行自己的程序遊戲方式使得它20毫秒期間的工作,循環再用5毫秒的睡眠,然後在Windows泵(PEEK消息/分派消息)一次又一次 - 它是否曾經在Windows中被強制搶佔,否則這種搶先不會發生?

我想如果我不願意通過睡眠或偷看/派遣進入系統的時間較長的時間來自動控制系統,那麼會發生這種搶先。在這裏,它會不會發生?

+0

你活着並死於OS調度程序(這不是Windows專有的)。寫下你的程序,因爲它可以在任何時候被搶佔(因爲它可能會)。 – WhozCraig

回答

1

它可以隨時由司機打斷。驅動程序可能會發出另一個線程的信號,然後要求操作系統安排/調度。新準備好的線程可能會運行而不是你的。

與Windows一樣,這些桌面操作系統不提供任何實時保證 - 它們不是爲了提供它而設計的。

+0

好的,但它不僅是關於guerantees,那麼在運行時調查這件事情 - 我可以收集有關在運行時中搶先事件的一些信息 - 如果它們存在多長時間?我在每一幀的開始和結束時(這20微秒的循環週期)都使用了一些計時器問題,我從來沒有注意到任何選擇 - 這是我注意到他們,當我開始iTunes播放MP3音樂;但在這裏沒有保證,但它似乎可能是這樣的強迫/框架撕裂搶佔不會發生在現實中 - 有一些規則我不知道,搜索瞭解它們 –

+0

'強制搶佔'必須提供良好的I/O性能。這是造成先發制人的複雜任務併發症的主要原因。 –

1

簡短的回答是:可以,它會被搶佔。

不僅驅動程序事件(中斷)可以隨時搶佔您的線程,這種情況也可能由於臨時優先級提升而發生,例如,當一個線程被阻塞的可信對象被髮信號通知時,或者例如由於另一個窗口成爲最上面的窗口。或者,另一個流程可能會簡單地調整其優先級。

有沒有辦法(缺乏給予你的進程實時優先級,這是一個非常糟糕的主意 - 立即忘掉它),以保證沒有「正常」的線程會搶佔你,即使硬件中斷也會搶佔先機你和某些處理磁盤I/O和鼠標的線程將在一段時間內與你競爭。因此,即使您以實時優先級運行(這不是真正的「實時」),但您仍然無法保證,但是您嚴重干擾了重要的系統服務。

最重要的是,5毫秒的睡眠時間是,最好是不太可靠的,否則不可靠。

睡眠會使你的線程準備(準備不意味着「它將運行」,它僅僅意味着它可能運行 - 當且僅當一個時間片變爲可用,並且沒有其他就緒線程是第一在線)在下一個調度器打勾。這實際上意味着您睡眠的時間量取整爲系統計時器分辨率的粒度(請參閱timeBeginPeriod函數),再加上一些未知時間。
默認情況下,定時器分辨率爲15.6ms,因此您的5ms平均爲7.8秒(假設最佳,無爭議的情況),但可能還有更多。如果將系統定時器分辨率調整爲1ms(通常儘可能最低,儘管有些系統允許0.5ms),但它有點更好,但仍不夠精確或可靠。另外,使調度程序更頻繁地運行會導致中斷和電源的大量CPU週期。因此,這通常不是可取的。

爲了讓事情更糟糕,you cannot even rely on Sleep's rounding mode,因爲Windows 2000/XP與Windows Vista/7/8的區別不同。

+0

鼠標是否會搶佔我的計算框架,或者在睡眠或消息池時間段發生這種情況?做調度程序組織 - 這是主要信息Im搜索 –

+1

調度程序不能「組織」,因爲它無法控制何時發生外部事件(例如鼠標移動或網卡接收到某些事件),並且通常需要處理這些事件立即。授予基於「信用」的非搶佔量子將對整體響應性不利。 – Damon

+0

這是有道理的 - 但我們在這裏談論的硬件中斷可能不是開關切換..過程開關更重要的是將一個繁重的工作程序切換到另一個繁重的工作和調度程序會更聰明,如果在第一次睡覺時進行切換I想想 - 當第一個人睡覺時,工作計劃完全忽略了什麼時候工作,只是迫使一切? –