11.10.2006

Computer Hangs After 49.7 Days

這大概是很古老的問題,但是為發生也蠻有趣的,在 MS的 knowedge base
有人的pc持續工作49天後,就停止工作了(當機,沒反應)。

回答:

這是Vtdapi.vxd 造成的,換掉這個VXD就可以了。

真有趣,為甚麼是49天呢?

因為Windows有一個system api :
DWORD GetTickCount(void)
會傳回從開機開始,每1 ms +1的 tick count, DWORD 的最大值是..

4,294,967.296 s = 71582.78827 min = 1193.046471 hr = 49.7103 days

所以....過了49天後,這個值就歸0了... 這就是當機的原因 @_@

這個題目在2004年好像很熱門,google一下就可以知道,有些甚至牽拖到LA機場管制49天當機的事件上。(據說當時機器是使用Windows)。

GetTickCount( ) 是一個popular 的function (?),尤其是在embedded system上,目前在CE上還是有這個function 可以用,也有同樣的問題: 49 天overflow。

所以CE blog有特別說出這個function 的使用方法: 用來計算差值,不要拿絕對值來使用。
也就是說,像以下這樣,用vu:
DWORD starttime = GetTickCount();
.....
.....
if( GetTickCount( ) - starttime >100)
dosomething...
就不會有roll over問題,
因為 unsigned :
0 - 0xFFFFFFFF = 1
所以,只要不要超過49x2天(約),計算上就不會有問題。

CE 系統為了讓"粗心"的programmer 及早發現這個問題,
將GetTickCount( )的初始值設在2 min 後overflow。
所以 如果你的機器 發生 "謎樣的2 min 死亡" 事件,就該查察 是否有哪裡 用了 GetTickCount( )這個function 了。

但是... 10 sec 當機的原因是什麼?

沒有留言: