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のカウンターで生じた場合、次のような問題が顕著に見られる。

  • タイマーのメッセージやシグナル(WM_TIMER(Windows)、SIGALRM(UNIX))が正常に発行されなくなる
  • タイマーのメッセージやシグナルを受信して画面を更新する時計機能などは動作しなくなる
  • カーソルの点滅などがなくなる
  • TIME-WAIT状態にある全てのTCP/IPポートが閉じられなくなり、TCPポートが枯渇する

これ以外にも、uptimeを使っているものは全て、目に見えない処理も含めて誤動作する。

再現環境

主な再現環境

オペレーティングシステムとして発生するもの。

なお、サーバー用OSであるFreeBSDは、長期間の運用の実績があり、この問題が無いことが既に分かっている。

実装として発生するもの。

  • SNMP (MIBのsysUpTime(OID 1.3.6.1.2.1.1.3)の上限で、仕様上の制約)

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日問題は解決を見たのである。

用語の所属
オーバーフロー
関連する用語
36時間
49.7日
248日

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club