技術ノート Linux Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

Unix は、時間を 1970 年 1 月 1 日からの秒数として保存します。つまり、Linux も同様です。この一見奇妙に見えるシステムと、なぜ終末が 2038 年に予定されていたのかについて説明します。

最初の Unix エポック

ゲーテ ( 1749-1832 ) は「一秒一秒が無限の価値がある」と宣言しました。それは本当です。地球上で私たちが生きられる時間はほんの数秒しかありません。そして、最後の秒がいつになるかはわかりません。しかし、私たちは自分の誕生日と、死のカウントダウンがいつ始まったかを知っています。

Unix に 英国女王 と同様に 2 つの誕生日があります。あるいは、より正確には、それが存在する秒数を数え始めた機会が 2 回ありました。 Unix が最初にカウントを開始したのは、1971 年 1 月 1 日の午前 0 時でした。

これは、1971 年 11 月 3 日付けの Unix Programmer’s Manual の初版のセクションを検討すると非常によくわかります。そのセクションの 13 ページまでスクロールすると、(現在は廃止されています) の説明が表示されます。

 time

指示。私たちはこう言われています。」

 time

1971 年 1 月 1 日 00:00:00 からの時間を 60 分の 1 秒単位で返します。」

カレンダーと時間システムは、宇宙論的な出来事、帝国の創設、革命の成功など、過去のある重要な時点から始まる時間を計測します。オペレーティング システムでは、カウントを開始する時点として任意の日時が選択されます。これはそのオペレーティング システムのエポックです。

Unix は、エポック以降の 60 分の 1 秒のカウントを保持するために 32 ビットの符号なし整数を使用しました。これは、0 ~ 4,294,967,295 (2 32 -1) の範囲の値を保持できる数値変数です。それはたくさんあるように思えます。しかし、カウンタは 1 秒あたり 60 回増加し、プログラマーズ マニュアルが指摘しているように、「時系列を重視するユーザーは、1 秒の 2**32 の 60 分の 2 がわずか約 2.5 年であることに気づくでしょう。」

1 秒あたり 60 個の数値を消費する速度であれば、カウンタは 829 日弱後の 1973 年 4 月 8 日に最大値に達することになります。

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

第 2 の Unix エポック

言うまでもなく、これには迅速に対応しました。符号なし整数は 32 ビット符号付き整数に置き換えられました。符号付き整数は、符号なし整数よりも少数の正の値 (2,147,483,647 (2 31 )) を保持できるため、これは意外な選択のように思えるかもしれません。ただし、消費速度も 60 分の 1 秒から整数秒に短縮されました。

1 秒あたり 1 つの数値を数えて 0 から 2,147,483,647 までカウントするほうが、1 秒あたり 60 カウントで 0 から 4,294,967,295 までカウントするよりも時間がかかります。しかもかなりの差で。新しい制度が最高値に達するまでの期間は68年強だ。これはかなり遠い未来のことのように思え、時代がさらに前の時点にリセットされることさえありました。新しいエポックは、UTC 1970 年 1 月 1 日の午前 0 時に設定されました。

68年後のその時点は、いまや不安なほど近づいている。正確に言うと、2038 年 1 月 19 日の 03:14:07 UTC に到着します。

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

シンプルだが効果的なスキーム

単一の整数を使用して、特定の時点からのタイム ステップ数をカウントすることは、時間を保存する効率的な方法です。年、月、日、時刻などの複雑な構造を保存する必要はありません。そして国、ロケール、タイムゾーンに依存しません。

整数の数値にタイム ステップのサイズ (この場合は 1 秒) を掛けると、エポックからの時間が得られ、それからタイムゾーンを調整してロケール固有の形式に変換するのは比較的簡単です。 。

ただし、上限が組み込まれています。遅かれ早かれ、選択した変数タイプで保持できる最大値に達することになります。この記事の執筆時点では、2038 年まであとわずか 17 年です。

これは、年を格納するために 2 桁を使用する前世紀の初期のコンピューター システムの問題と似ていますが、少し異なります。カレンダーが 2000 年の新年と新世紀に切り替わったとき、「00」として保存された年の値は 2000 年または 1900 年と解釈されるでしょうか?

いわゆる「 ミレニアムバグ 」の修正には、米国だけで 1,000 億ドル以上の費用がかかり、世界中で対処するには数千人年を要したと推定されています。 2000 年 1 月の最初の数日間にはいくつかの問題がありましたが、このバグが無視されていた場合に起こっていたであろう惨事のようなものはありませんでした。

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

終末の日は延期される

Linux とすべての Unix に類似したオペレーティング システムは同じ問題を共有しているため、2038 年問題はしばらくの間真剣に受け止められており、2014 年からカーネルに修正が追加されています。これは現在進行中であり、最近では 1 月に修正が カーネルに追加されています。 2020 では 32 ビット整数の問題に対処します。

もちろん、動作する Linux コンピューターにはカーネル以外にも多くのものが含まれています。さまざまな API やインターフェイスを通じてシステム時間を利用するすべてのオペレーティング ユーティリティとユーザーランド アプリケーションは、64 ビット値を想定するように変更する必要があります。ファイルとディレクトリの 64 ビット タイムスタンプを受け入れるには、ファイル システムも 更新する必要があります

Linux はどこにでもあります 。 Linux で壊滅的な障害が発生すると、あらゆる種類のコンピュータ ベースのシステムで障害が発生することになります。 Linux は、Web の大部分、パブリック クラウド、さらには宇宙船のほとんどを実行します。スマートホームや自動運転車を走らせている。スマートフォンの心臓部には Unix 由来のカーネルが組み込まれています。実際、ネットワーク ファイアウォール、ルーター、ブロードバンド モデムなど、内部にオペレーティング システムが組み込まれているものはすべて、Linux 上で動作します。

Linux が修正に向けて順調に進んでいることは素晴らしいことです。アップグレードをインストールします。それで終わりです。しかし、これらのデバイスすべてにパッチが適用され、更新される可能性はどのくらいでしょうか?それらの多くはその時までに稼働すらしていないため、議論の余地はあるだろうが、一部はまだ稼働しているだろう。おそらくサーバールームやラックキャビネットの暗くて埃っぽい奥まった場所にひっそりと佇んでいるだろうが、2038年1月19日の午前3時15分頃まで、秒針が刻々と過ぎていく間、彼らはそこにいて静かに働いているだろう。

しかし、そのようなデバイスはごく少数のはずです。ほとんどのシステムでは、危機的な状況が何事もなくやって来て、去っていきます。またまた、リラックスできるようになります。少なくとも、2486 年が近づくまでは、エポックからの時間をカウントするために 64 ビット ベースの整数を使用するシステムにとって、まったく同じ問題が発生します。

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

日付コマンド

date コマンドを使用する と、Linux やその他の Unix 派生製品が、時刻値をエポックからの秒数として保存する元の単純なスキームを依然として使用していることを確認できます。

パラメーターを指定せずに date コマンドを使用すると、現在の日付と時刻がターミナル ウィンドウに出力されます。時刻が調整されるタイムゾーンも表示されます。 EDT は東部夏時間です。これは、テスト コンピューターが東部タイム ゾーンにあり、 夏時間が 有効であることを意味します。夏時間が実施されていない場合、東部タイムゾーンでは東部標準時が使用されます。

基礎となる整数値を確認するには、表示形式文字列を使用できます。フォーマット文字列の最初の文字にはプラス記号「+」が含まれます。 「%s」形式トークンは、「エポックからの秒数を表示する」ことを意味します。

date によって返された秒の値を取得し、それを date コマンドにフィードバックすると、

 -d

(文字列で記述された表示時刻) オプションを使用すると、通常の日付と時刻に変換されます。

日付

日付 +%s

日付 -d @1633183955

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

日付 +%s && 睡眠 10 && 日付 +%s

date コマンドに秒数を渡すと、時刻と日付に変換されることがわかりました。入力値として 0 秒を使用してこれを実行すると、 date Unix エポックの日付と時刻を出力するはずです。

 TZ='UTC' 日付 -d @0 +'%x %R'

コマンドは次のように分解されます。

  • TZ=’UTC’ : エポックは協定世界時 (UTC) を使用して設定されているため、 date に UTC を使用するように指示する必要があります。「TZ=」構造は、現在のコマンドのみに有効なタイム ゾーンを設定します。
  • date : date コマンド。
  • -d @0 : date 、「現時点」の時刻ではなく、文字列を入力として使用するように指示します。渡す文字列は 0 秒を保持します。
  • +’%x %R’ : 出力フォーマット文字列。 「%x」形式トークンは、 date に年、月、日を表示するように指示します。 「%R」形式トークンは、時と分に 24 時間形式を使用するように date 指示します。フォーマット文字列にはスペースが含まれるため、文字列全体を一重引用符「 ' 」で囲み、文字列が単一の項目として扱われるようにします。

予想どおり、出力は 1970 年 1 月 1 日の午前 0 時です。

Unix エポックとは何ですか? Unix 時間はどのように機能しますか?

次回まで

多くの場合、シンプルがベストです。固定データから秒を数えるのは、時間の経過を示す最も簡単な方法です。しかし、時間の経過により新たな課題が生じます。修正が施されたことで、2486 年まではクリアできたようです。

その時期がもう少し近づいたら、それについて心配することになると言っても過言ではないと思います。

「 Unix エポックとは何ですか? Unix 時間はどのように機能しますか?」に関するベスト動画選定!

p244-246【3】エッジワースの箱図表(中小企業診断士2023年版速修テキスト)
0405_2022速修テキスト06_第1部第4章「システムの開発・運用・評価」Ⅰ-5_経営情報システム