UNIX時間は、UNIXを実行しているコンピュータで測定されます。

UNIX時間は、UNIXを実行しているコンピュータで測定されます。

婦人声明:

私はこの記事をどこに投稿するかを見つけるために約20分間StackExchangeサイトのリストを検索してきました。あなたがより適切なサイトを知っているなら、この質問をそこに移してください。 Unixの時間が私を考えさせたので、ここにこれを投稿しています。


私たち全員が知っているように、Unixの時間とUTCがあります。 Unix時間は秒単位(毎秒1秒)単位で流れ続けていますが、UTCは私たちが使用する人が読める形式で地球自転車の段階と時間を一致させようとします。この目的のために、UTCは時々うるう秒を挿入します。

時間は、重力、他の種類の加速度、および時間を経験する物体が経験する相対速度に関連しているため、2つの問題が発生します。簡単な質問から始めましょう。 Unixの時間はどこで測定されますか?もしアリスとご飯が最初から現在時刻が1467932496.42732894722748であることに同意したら彼らはこの時同じ位置にいるのです。セシウム-133)原子レベルと0K)、アリスは海面に住み、米は山に住んでいるか、アリスは北極に住み、米は赤道に住んでいるので、彼らは双子のパラドックスに直面し、もはや同意しません。それでは、Unixの時間はどのように正確に定義されますか?

地球が軌道を完成する時点で誰もが同意するので、最初はUTCの問題を見ることができないかもしれません。 (もちろん、これは大陸版の動きを無視しますが、GPSを使用すると測定できるため、これはかなりうまく処理できると思います。大陸板の動きと一緒に動かないと仮定することができます。

しかし、2番目は9'192'631'770放射周期として定義されます。これは、残りの2つのエネルギーレベルと0Kの間のセシウム-133原子の遷移に対応し、セシウム-133原子は地球のエネルギーに興味がありません。軌道。したがって、うるう秒を挿入する場所はUTCによって決定されますが、地球の軌道位相と測定された時間との間には測定または予測されたオフセットが必要です。どこかに原子時計を通して。それはどこですか?

答え1

タイトルの質問に対する実際の答えはありません。 Unix時間は実際の時間尺度ではなく、どこでも「測定」されません。 UTCには表現できない特定の瞬間があるため、たとえ悪い表現ですがUTCを表現したのです。 Unix時間は1日に86,400秒を要しますが、UTCはうるう秒のためにこれを超えています。

より広範な質問に関しては、集中すべき4つの重要な期間があります。

  1. UT1(世界時)は、星を基準とした地球の自転を測定する世界観測所で計算されます。これらの観察といくつかの数学によって、我々はグリニッジ王立天文台の太陽の正午に基づいて古いグリニッジ標準時のより現代的なバージョンに達しました。世界時(Universal Time)は、世界時(Universal Time)と呼ばれる組織によって計算されます。IERS(国際地区回転および参照システムサービス、以前は国際地区回転サービス)。

  2. 泰安(国際原始市)は、世界中の何百もの原子時計によって保管され、国家標準機関およびその他の機関によって管理されています。 TAIの使用に貢献する時計アーカイブ時間移動時計を互いに向かうように導き、個々の時計の小さな誤差を取り除き、時間全体を生成する技術です。 SI単位系の管理者である国際度量型局(BIPM)が発行したTAIです。時間膨張に関する質問に答えるために、TAIは原子時間として定義されます。海面で(実際には同じアイデアの高度なバージョンであるジオイドでは)各時計は独自の高度の影響を修正します。

  3. UTC(協定世界時)は、1972年1月1日にTAIより10秒遅く設定されており、その日からうるう秒を加減したりしない限り、TAIと全く同じ速度で前進します。 IERSは、差を0.9秒以内に保つためにうるう秒を宣言することにしました(実際には約0.6秒以内。うるう秒を追加すると、差は-0.6から+0.4に変わります)。理論的には、うるう秒は正の場合も負の場合もありますが、SIとTAIが定める基準と比較して地球の回転が遅いため、負のうるう秒は不要であり、将来もありません。

  4. Unix Time、これはUTCを単一の数値として表現することに最善を尽くします。 86,400の倍数である各Unix時間はUTC真夜中に対応します。すべての UTC 日付の長さは 86,400 秒ではありませんが、「Unix 日付」はすべて長さなので、何とかパッチする必要がある両立できない違いがあります。追加されたうるう秒に対応するUnix時間はありません。実際には、システムは以前の秒が2回発生したかのように動作するか(Unixタイムスタンプが1秒後に戻ってから前に戻る)、同様の手法を適用します。ジャンプスミアこれにより、うるう秒の両側で時間が長くなります。どちらの場合もわずかな不正確さがありますが、少なくとも2番目のケースは単調です。どちらの場合も、互いに離れている2つのUnixタイムスタンプ間の経過時間です。そして第二等しくない第二-;同等第二- しかもミドルユンチョ

UT1、TAI、UTC、IERSはすべてグローバル規模の多国籍努力であるため、単一の「場所」はありません。ただし、IERS Bulletinはパリ天文台で発行され、BIPMもパリに基づいていますが、これが一つの答えです。正確で追跡可能な時間を必要とする組織は、時間ベースを「UTC(USNO)」のように宣言できます。これは、タイムスタンプがUTCであり、米国海軍観測所からの時間から派生したことを意味しますが、次の質問を検討してください。 Unixの時間について言及しました。既定では、このレベルの精度と互換性はありません。本当に正確な時間を扱う人は誰でもUnixの時間の選択肢を持つでしょう。

答え2

UNIX時間は、UNIXを実行しているコンピュータで測定されます。

この回答では、UTC(協定世界時)、TAI(国際原子時)、およびSI秒が何であるかを知ってほしい。それらの説明ははるかに越えてUnixとLinuxのスタック交換の範囲。 これはない物理学または天文学スタック交換。

ハードウェア

コンピュータには、時計とタイマーを駆動するさまざまな発振器が含まれています。詳細は、アーキテクチャによってコンピュータによって異なります。しかし、一般的に一般的な用語で言うと、次のようになります。

  • 一つあるプログラム可能なインターバルタイマー(PIT)どこかに特定の振動数を計算し、中央処理装置への割り込みをトリガするようにプログラムできます。
  • 一つあるサイクルカウンターCPUでは、実行される各命令サイクルが1と計算されます。

広い意味の動作理論

オペレーティングシステムカーネルはPITを使用して生成されます。ダニ。 PITをフリーランに設定し、100分の1秒間隔で正確な振動数を計算し、割り込みを生成し、自動的にカウントをリセットして再実行します。これにはいくつかのバリエーションがありますが、本質的にこれは次の結果をもたらします。ダニ一定の頻度で割り込みを発生させます。

ソフトウェアでは、カーネルはクロックサイクルごとにカウンタをインクリメントします。 PITを最初にプログラムしたので、ティックの頻度を知っています。これにより、1秒間に何本のチックがあるかがわかります。これを使用して、秒を計算するカウンタを増やすタイミングを知ることができます。後者は「UNIX Time」というカーネルのアイデアです。実際には、自分のデバイスに残しておくと、SIごとに1秒あたり1の割合で計算されます。

この問題を複雑にする4つのことがあります。これを非常に一般的な用語として扱います。

ハードウェアは完璧ではありません。 PITのデータシートによると、発振器の周波数は次のとおりです。窒素ヘルツ単位の周波数は次のとおりです。窒素.00002Hz、結果は明らかです。

この方式は、CPUが毎秒数百回目を覚まし、変数の数を増やす以外にはほとんど実行しないため、電源管理との相互運用性が非常に低いです。したがって、一部のオペレーティングシステムには、いわゆる「チックレス」デザインがあります。 PITがすべてのクロックサイクルに対して割り込みを送信するのではなく、カーネルはスレッドクォンタムの枯渇なしでどのくらいのクロックサイクルが経過するか(低レベルスケジューラで)計算し、そのクロックサイクルを将来まで計算するようにPITをプログラムします。ティック割り込み。次のようにログインする必要があることを知っています。窒素1ティックではなく、次のティックブレーキにティックを付けます。

アプリケーションソフトウェアはカーネルの現在時刻を変更することができます。それはできるステップ価値があるかもしれません大虐殺値。ロールオーバーには、秒カウンターを増やすために必要なティック数を調整する操作が含まれます。したがって、秒カウンタは必ずしもSI秒あたり1の割合で計算されるわけではありません。それでも、完全な発振器を仮定しても。ステップは単に秒カウンターに新しい数字を書き込むだけです。

最新のカーネルは秒だけを計算するのではなく、ナノ秒も計算します。しかし、ナノ秒ごとにチックで止めることはとんでもなく、しばしば完全に実行できません。ここが似ています。サイクルカウンター参加する。カーネルは毎秒(またはすべてのクロックサイクル)周期カウンタ値を記憶し、次のことができます。現在の時間をナノ秒単位で知りたいときにカウンタ値、最後の秒(またはティック)から経過しなければならないナノ秒数。ただし、コマンドサイクルの頻度が異なる可能性があり、コアが高精度イベントタイマー(HPET)などの追加のハードウェアに依存する可能性があるため、電力と熱管理が再び大きな問題を引き起こします。

C言語とPOSIX

C言語の標準ライブラリは、不透明な型、さまざまな指定されたフィールドを持つ構造time_t型、およびtmさまざまなライブラリ関数(たとえば、time()および)を使用してmktime()時間を記述しますlocaltime()

一言で言えば、C言語それ自体これはtime_t利用可能なものの1つであることが保証されます。数字データ型であり、視差を計算する唯一の信頼できる方法は関数ですdifftime()。 POSIX規格は、より厳格な保証を提供し、これはtime_t実際には次のいずれかです。整数タイプと数エポック以降。これはtimespec構造タイプを指定するためのPOSIX標準でもあります。

このtime()関数は時々システムコールとして記述されます。実際、これは長い間、多くのシステムでは低レベルのシステムコールではありませんでした。たとえば、FreeBSDでは、基本的なシステムコールには、clock_gettime()さまざまな方法で秒または秒+ナノ秒単位で測定できるさまざまな「時計」が含まれます。アプリケーションソフトウェアがカーネルからUNIX時間を読み取ることは、このシステムコールを介して行われます。 (一致するclock_settime()システムコールを使用すると手順を実行でき、adjtime()システムコールを使用すると終了できます。)

多くの人がPOSIX標準を使用しており、それが指定する内容について非常に明確で正確な説明をしています。これらの人々はしばしば実際にそうではありません。読むPOSIX標準。その理論的根拠に記載されているように、「エポック以降の秒」(標準で使用されるフレーズ)を計算するという考えは、意図的にgmtime()POSIX秒がSI秒と同じ長さであるか、結果が「発生にもかかわらずUTCでなければならない」という仕様はありません。 POSIX規格は意図的にうるう秒調整が発生してから1週間後に時計をリセットし、管理者がUNIXシステムでうるう秒調整を手動で変更できるように十分に軽減されました。実際、理論的根拠は、システムのクロッキングに対応できるほど意図的に緩いということです。意図的に誤って設定現在の UTC 時間ではない時間です。

UTCとTAI

カーネルから取得したUNIX時間の解釈は、アプリケーションで実行されるライブラリルーチンによって異なります。 POSIXはカーネル時間とstruct tm。 2100年以降の計算が間違っています。従うよりも壊すのがより尊敬されるという言葉が簡単に思い浮かぶ。

もちろん。今日では、悪名高い「Olson Time Zone Database」を参照するArthur David Olsonによって書かれたライブラリルーチンに基づいて、この解釈に基づいて複数のシステムがあり、通常Olson/usr/share/zoneinfo/システムには2つのモードがあります。

  • カーネルの「エポック以降の秒」は、うるう秒を除く1970-01-01 00:00:00 UTC以降のUTC秒数と見なされます。これはposix/Olsonタイムゾーンデータベースファイルセットを使用します。終日86400カーネル秒があり、1分に61秒は決してありませんが、常にSI秒の長さではなく、うるう秒が発生したらカーネル時計を回転またはステップする必要があります。
  • カーネルの「エポック以降の秒」は、1970-01-01 00:00:10 TAI以降のTAI秒数と見なされます。これはright/Olsonタイムゾーンデータベースファイルセットを使用します。カーネル秒の長さは 1 SI 秒で、うるう秒を調整するためにカーネル時計を回転させたりカスケードしたりする必要はありませんが、セグメンテーション時間は 23:59:60 のような値を持つことができます.

M. Bernsteinは、1970-01-01 00:00:00 TAI以降のTAI秒数を取得するために10を追加するだけで、daemontools必要なツールセットを含むいくつかのツールを作成しました。彼はこれをマニュアルページに文書化した。right/time_t

daemontools-encoreこの要件は、Felix von Leitnerなどのツールセットによって(おそらく無意識的に)継承されています。使用runitlibowfatバーンスタインmultilogガンターmultilogまたはパプフsvlogdたとえば、Olsonposix/設定を使用すると、すべてのTAI64Nタイムスタンプが(作成時に)26秒遅れます。実際TAI 1970-01-01 00:00:10 TAI以降の秒数。

Laurent Bercotと私は異なるアプローチをとりましたが、s6とnoshでこの問題を解決しました。 M.ベルコートtai_from_sysclock()コンパイル時フラグによって異なります。 TAI64Nを処理するnoshツールは、環境変数を調べて自動的に検出してTZ可能であることを確認します。TZDIRposix/right/

興味深いことに、FreeBSDのドキュメントtime2posix()posix2time()機能はOlsonright/モードと同じTAI秒を許可しますtime_t。しかし、明らかにアクティブではありません。

また…

UNIX時間は、コンピュータのハードウェアに含まれているオシレータを使用してUNIXを実行しているコンピュータで測定されます。 SI秒を使用しません。表面積は似ていますが、UTCではありません。意図的に時計が間違っていることを許可します。

追加読書

答え3

時計の調整はIERSによって調整されます。彼らは必要に応じて時間の流れにうるう秒を挿入することを計画しています。

~からNTPタイムスタンプとうるう秒

これ国際地区回転サービスパリ天文台のIERS(IERS)は、USNOや他の天文台が提供する天文観測を使用して、地球自転の不規則な変化に対して修正されたUT1(Navigator)時間尺度を決定します。

私が知っている限り、23:59:60(うるう秒)と翌日の00:00:00は、Unix時間で同じ秒と見なされます。

関連情報