Unix は、時間を 1 年 1970 月 2038 日からの秒数として保存します。これは、Linux も同様であることを意味します。 この一見奇妙なシステムと、なぜ審判の日が XNUMX 年に設定されているのかについて説明します。

第一次 Unix 時代
ゲーテ (1749-1832) は「一秒一秒に無限の価値がある」と宣言しました。 そうです、私たちは地球上であまりにも多くの秒数を持っているので、最後の秒がいつになるかわかりません。 しかし、私たちは自分の誕生日と、死のカウントダウンがいつ始まるかを知っています。
Unix には、イギリス女王と同じように、誕生日が 1971 つあります。 あるいは、より正確には、彼女が存在する秒数を数え始めた機会が XNUMX 回ありました。 Unix が初めてカウントを開始したのは、XNUMX 年 XNUMX 月 XNUMX 日の真夜中からでした。
これは、3 年 1971 月 13 日付けの Unix プログラマーズ ハンドブックの初版のセクションを検討するとはっきりとわかります。このセクションの 00 ページまでスクロールすると、(現在は廃止されている) time コマンドの説明が表示されます。 「時間は 00 年 00 月 1 日 1971:XNUMX:XNUMX からの時間を XNUMX 分の XNUMX 秒単位で返す」と言われています。
カレンダーと時間システムは、宇宙的な出来事、帝国の創設、革命の成功など、過去の重要な時点から始まる時間を計測します。 オペレーティング システムでは、カウントの開始点として任意の日付と時刻が選択されます。 今はこのオペレーティングシステムの時代です。
Unix は、その時代以来、32 ミリ秒を保持するために 60 ビットの符号なし整数を使用していました。 これは、0 ~ 4 (294-967) の範囲の値を保持できる数値変数です。 これはたくさんあるようです。 しかし、カウンタは 295 秒あたり 232 回の速度で増加しており、プログラマーズ ガイドに記載されているように、「時間に敏感なユーザーは、1 秒の 60 分の 2** 32 がわずか約 2.5 年であることに気づくでしょう」。
消費率が 60 秒あたり 8 桁の場合、カウンタは 1973 日弱後の 829 年 XNUMX 月 XNUMX 日に最大値に達することになります。
第二次Unix時代
言うまでもなく、この措置は迅速に講じられました。 符号付き整数は符号なし 32 ビット整数に置き換えられました。 符号なし整数は、符号なし整数よりも少数の正の値 (2 (147)) を保持できるため、これは意外な選択のように思えるかもしれません。 ただし、消費速度も 483 ミリ秒からフル秒に短縮されました。
0 から 2 までを数えるには、147 から 483 まで 647 秒あたり 0 回の速度で数えるよりも時間がかかります。 しかも大差で。 新しい制度が最高値に達するまでの期間は4年強だ。 あまりにも遠い未来のことのように思えたので、時代は以前の時点に戻されました。 ニューエイジは、UTC 294 年 967 月 295 日の真夜中に設定されます。
68年後のその時点は現在、驚くほど近づいています。 正確には、03 年 14 月 07 日の 19:2038:XNUMX UTC に到着します。
シンプルだが効果的なスキーム
単一の整数を使用して、特定の時点からのタイム ステップ数をカウントすることは、時間を保存する効率的な方法です。 複雑な構造を何年も、何か月も、何日も、何回も保存する必要はありません。 国、ロケール、タイムゾーンには依存しません。
この数値に整数とタイム ステップ サイズ (この場合は XNUMX 秒) を乗算すると、エポックからの時間が得られ、タイムゾーンを調整してそれからロケール固有の形式に変換するのは比較的簡単です。
ただし、上限が組み込まれています。 遅かれ早かれ、選択した変数タイプで保持できる最大値に達します。 この記事の執筆時点では、2038 年まであとわずか 17 年です。
これは、年を格納するために 2000 桁を使用する前世紀の初期のコンピューター システムの問題と似ていますが、少し異なります。 カレンダーが新年と新世紀の 00 年に切り替わったとき、「2000」として保存された年の値は 1900 年または XNUMX 年として解釈されますか?
いわゆる「ミレニアムの誤り」を正すには、米国だけで 100 億ドル以上の費用がかかったと推定されており、世界中でこの誤りに対処するには数千年を要しました。 2000 年 XNUMX 月の最初の数日間にはいくつかの問題がありましたが、バグを無視していたら起こるであろう大惨事ほどのものはありませんでした。
Linux とすべての Unix 系オペレーティング システムは同じ問題を共有しているため、2038 問題はしばらくの間非常に真剣に受け止められており、2014 年からカーネルに修正が追加されています。これは引き続き、2020 ビット整数の問題に対処するために、最近では 32 年 XNUMX 月にカーネルに修正が追加されました。
もちろん、動作する Linux コンピューターにはカーネルだけではありません。 さまざまな API やインターフェイスを通じてシステム時間を利用するすべてのランチャーとユーザーランド アプリケーションは、64 ビット値を想定するように変更する必要があります。 ファイルとディレクトリの 64 ビット タイムスタンプを受け入れるようにファイル システムも更新する必要があります。
Linux はどこにでもあります。 Linux の壊滅的な障害は、あらゆる種類のコンピューターベースのシステムの障害を意味する可能性があります。 Linux は、Web の大部分、パブリック クラウド、さらには宇宙船のほとんどを実行します。 スマートホームや自動運転車を走らせている。 スマートフォンの中核には Unix 由来のカーネルが組み込まれています。 ネットワーク ファイアウォール、ルーター、ブロードバンド モデムなど、オペレーティング システムが組み込まれているほとんどすべてのものは Linux 上で動作します。
Linux が回復傾向にあるのは素晴らしいことです。 アップグレードをインストールしますので、インストールしてください。 しかし、これらすべてのデバイスにパッチが適用され、更新される可能性はどのくらいでしょうか? それまでに就航する予定の航空会社はそれほど多くないため、議論の余地はあるが、一部の航空会社はまだ就航が遠いだろう。 おそらく、サーバー ルームやラック キャビネットの暗く埃っぽい奥に隠れているかもしれませんが、19 年 2038 月 XNUMX 日の朝、秒が XNUMX 分の XNUMX を経過するまで、そこにいて静かに稼働していることでしょう。
しかし、そのようなデバイスはごく少数のはずです。 大多数のシステムでは、危機の時代が何事もなくやって来ては去っていくでしょう。 またまた、リラックスできるようになります。 少なくとも、2486 年が近づくまでは、64 ビット ベースの整数を使用してエポック以降の時間を計算するシステムにまったく同じ問題が生じていました。
履歴コマンド
date コマンドを使用すると、Linux およびその他の Unix 派生製品が元の単純なスキーマを引き続き使用して、時間値をエポックからの秒数として保存しているかどうかを確認できます。
パラメータを指定せずに date コマンドを使用すると、現在の日付と時刻がターミナル ウィンドウに表示されます。 時刻が設定されているタイムゾーンも表示されます。 EDT は東部夏時間です。これは、テスト コンピューターが東部時間帯にあり、夏時間が有効であることを意味します。 夏時間が実施されていない場合、東部時間帯には東部標準時が使用されます。
基本整数の値を調べるには、表示形式文字列を使用できます。 フォーマット文字列には、最初の文字としてプラス記号「+」が含まれます。 フォーマットトークン「%s」は「エポックからの秒数を表示」を意味します。
date によって返された秒の値を取得し、-d オプション (文字列で表示される時刻) を使用して date コマンドに入力し直すと、通常の datetime に変換されます。
date
日付 + %s
日付 -d @1633183955

秒数を表示し、10 秒間スリープし、新しい秒数を表示することで、整数値が実際に時間を表していることを示すことができます。 10 つの整数値はちょうど XNUMX だけ異なります。
日付 +%s && 睡眠 10 && 日付 +%s

date コマンドに秒数を渡すと、それが時刻と日付に変わることがわかりました。 値入力として XNUMX 秒を使用してこれを実行すると、date は Unix エポックの日付と時刻を出力するはずです。
TZ='UTC' 日付 -d @0 +'%x %R'

コマンドは次のように分解されます。
- TZ = “UTC”: 元号は UTC を使用して設定されているため、日付に UTC を使用するように指示する必要があります。「TZ =」設定は、現在のコマンドの有効なタイムゾーンのみを指定します。
- 日付: 日付コマンド。
- -d @ 0: 「現在」の時刻ではなく、文字列を入力として使用して日付を伝えます。 渡す文字列には秒が含まれません。
- + '%x%R': 出力形式文字列。 形式トークン「%x」は、年、月、日を表示する日付を指示します。 形式トークン「%R」は、日付の時間と分に 24 時間形式を使用するように指示します。 フォーマット文字列にはスペースが含まれるため、文字列全体を一重引用符「」で囲み、文字列が単一の要素として扱われるようにします。
予想通り、本番は1年1970月XNUMX日深夜。
次回まで
多くの場合、シンプルがベストです。 固定データから秒を数えるのは、時間の経過を特徴づける最も簡単な方法です。 しかし、時間の経過により新たな課題が生じます。 修正が加えられているため、2486 年までは明らかだと思われます。
すぐにそれについて心配することになると言っても過言ではないと思います。






