にせんさんじゅうはちねん‐もんだい〔ニセンサンジフハチネン‐〕【二〇三八年問題】
2038年問題
別名:西暦2038年問題,コンピュータの2038年問題,コンピュータの西暦2038年問題
【英】the year 2038 problem
2038年問題とは、UNIX環境で運用されているシステムにおいて、西暦2038年1月に時間計測の値がオーバーフローを起こして誤作動する可能性があるという問題のことである。
UNIXの環境は1970年1月1日0時0分0秒を時刻計算の起点としており、32ビットの符号付き整数で経過秒数を計測することによって時刻を計算している。こうした環境では累計で2の31乗秒、およそ21億秒を超えると、数値が正しく扱えなくなって誤作動を起こす可能性がある。1970年1月1日から累計21億秒後を迎えるのが、西暦2038年1月19日にであるとされている。
2004年に、KDDIが国内通話サービスにおいて通話料金が一部過剰に請求されていたことが判明したが、その原因は2038年問題によるものであると発表されている。問題が発生したシステムは0.5秒単位で時刻を計測するシステムで、2004年1月は1970年から2038年までの期間のちょうど半分にあたっていた。
2038年問題
2038年問題
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/13 01:55 UTC 版)
詳細は「2038年問題」を参照 Unixでは、システム時刻の値を1970年1月1日の午前0時0分0秒からの秒数で表しており、これをUNIX時間と呼ぶ。この値のデータ型は time_t で、歴史的に「符号つき long」と定義されている。32ビットのシステムでは、2038年1月19日にこの値が1個の0に31個の1が続く最大値 (0x7FFFFFFF) となり、1秒後には1個の1と31個の0が続く値 (0x80000000) となる。するとシステム時刻は、実装によって(符号ビットを無視するか否かによって)1901年または1970年にリセットされる。 1970年より前の時刻をUNIX時間で表すことは滅多にないため、time_t を符号なし32ビット整数と定義し直すという対策が考えられる。しかし、それでは単に問題を2106年2月7日に遅延させるだけであり、時刻の差を計算するソフトウェアでバグを生じる可能性がある。 この問題に対処しているバージョンもある。例えば、SolarisやLinuxの64ビット版では、time_t は64ビットとなっており、OS自身も64ビットのアプリケーション群も約2920億年間正しく動作する。64ビット版Solarisで既存の32ビットアプリケーションを動作させることもできるが、その場合は問題が残ったままである。一部ベンダーは標準の time_t はそのままにして、64ビットの代替データ型とそれを使用するAPIを別途用意している。NetBSDでは、次のメジャーバージョンである 6.x で32ビット版でも time_t を64ビットに拡張することを決定した。従来の32ビットの time_t を使用しているアプリケーションは、バイナリ互換性レイヤーを作って対応する。
※この「2038年問題」の解説は、「UNIX」の解説の一部です。
「2038年問題」を含む「UNIX」の記事については、「UNIX」の概要を参照ください。
固有名詞の分類
- 2038年問題のページへのリンク