497日
読み:よんひゃくきゅうじゅうななにち
外語:497days

 起動直後から経過時間を計測しているタイマーがオーバーフローする日数の一つ。
目次

概要
 unsignedで32ビットの場合、最大で0xffffffff(10進数で4294967295)までの数値を扱うことができる。
 これを10ミリ秒単位でカウントアップすると、42949672950ミリ秒、つまり497日2時間27分52秒950ミリ秒までしか数えることができない。
 従って、この問題のあるシステムでは、497日を超えた連続稼動が出来ない。

特徴

現象
 起動後に0からカウントを始めたとすると、起動から497日2時間27分52秒950ミリ秒で0xffffffffに達し、さらに次は0に戻ってしまう(オーバーフロー)。
 「このカウンターの現在値からx増えたときに動作する」という処理で、一般に定期的な動作が実現されているが、その期待する先が0xffffffffより上であったなら、その「時」が来ることは永遠にない。
 システムを問わず、様々な環境で、このカウンターを「uptime」と称して利用しており、そのサイズは32ビットであることが多い。497日しか連続稼動できないというのは、計算すれば誰でもわかるので、これはバグというよりは最初から分かっている機能的な制約であるとも言える。

想定される問題
 OSのカウンターで生じた場合、次のような問題が顕著に見られる。
 これ以外にも、uptimeを使っているものは全て、目に見えない処理も含めて誤動作する。

再現環境

主な再現環境
 オペレーティングシステムとして発生するもの。
 なお、サーバー用OSであるFreeBSDは、長期間の運用の実績があり、この問題が無いことが既に分かっている。
 実装として発生するもの。
 sysUpTimeが10ミリ秒単位でカウントアップする実装の場合に発生する。1ミリ秒単位の場合は、49.7日で再現することになる。

Windows
 NTカーネルを採用したWindowsで発生する。
 次のWindowsに、この問題があることが知られている。NT 3.xも再現すると思われるが、Microsoftがサポートとして情報を提供しないため不明である。
 なお、Windows 95/98などの元16ビットのWindowsは、49.7日という、10倍速で同様の問題が生じる。

Linux
 Linuxの場合、jiffiesが32ビットであることに問題があったので、現在では64ビット化された。
 もって、変数を伸ばすという技術革新の恩恵により、497日問題は解決を見たのである。

再検索