日本-日本語

製品  >  ソフトウェア  >  OpenVMS

OpenVMS FAQ


≫ 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
第 1 章:概要
第 2 章:ドキュメント
第 3 章:時間の管理
第 4 章:ネットワークとクラスタ
索引
OpenVMS ホーム

HP OpenVMS
FAQ


目次 索引

第 3 章
時間の管理

この章では,時刻,時間管理,システム時刻の同期化,時刻のずれ, SUBMIT/AFTER=TOMORROW を使用する意味,およびその他の時間関連のトピックについて説明します。

3.1 OpenVMS の時間管理に関係する歴史について簡単に説明してください

OpenVMS では計時開始日を 1858 年 11 月 17 日に設定していますが,その理由は何でしょう。

スミソニアン宇宙物理観測所 (SAO: Smithsonian Astrophysical Observatory) が人工衛星追跡のために採用している準ユリウス日 (modified Julian date) は,ユリウス日 2400000.5 であり,これは 1858 年 11 月 17 日午前 0 時に相当します。

SAO が人工衛星の追跡を開始したのは,スプートニクが地球の周回軌道に達した 1957 年のことで,当時は 8K (非仮想) のメモリを搭載した 36 ビットの IBM 704 が使用されていました。 1957 年 1 月 1 日のユリウス日は 2435839 でした。これを 8 進数で表すと 11225377 になりますが,この値は大きすぎて 18 ビットのフィールドに収まりませんでした。メモリが 8K しかないのに,36 ビット・ワードにユリウス日を保存すると,残りの 14 ビットが無駄になってしまいます。 SAO では現在の日付の小数部分も必要だったので (18 ビットで十分な精度を表すことができます),1 ワードの左 18 ビットに日数を,右 18 ビットに 1 日の小数部分を保存することにしました。

18 ビットを使用することで,切り捨てられたユリウス日 (SAO 日) は最大 262143 まで表現することができ, 1858 年 11 月 17 日から 7 世紀の暦を表すことが可能になります。実際には,日付は最大 131071までしか拡大できませんが (17 ビットを使用),それでも 3 世紀を表現することができ,負の時刻を表現する可能性も残されています。 1858 年という日付は,SAO で使用されていた最古の星表より前の日付であったため,人工衛星追跡の計算で負の時刻を使用する必要もありませんでした。

もともとのユリウス日 (JD) は天文学者が使用している暦で,紀元前 4713 年 1 月 1 日正午から数えた日数で表現されます。この計時方法は 16 世紀にジョセフ・スカリゲル (Joseph Scaliger) が発表したものです。 ユリウス日という名前は,彼の父親の名前,ユリウス・カエサル・スカリゲル (Julius Caesar Scaliger) から付けられました。ユリウス日は,ユリウス暦 (ローマ皇帝ユリウス・カエサルの名を付けた暦) とは異なりますので注意してください。

起点となる日が紀元前 4713 年に設定されたのはなぜでしょうか。スカリゲルは 3 つのタイム・サイクルをトレースし,紀元前 4713 年がすべてのサイクルの 1 年目にあたることを発見しました。 3 つのサイクルとは,15 年,19 年,28 年です。これらの 3 つの値を掛け合わせることで (15 * 19 * 28 = 7980),紀元前 4713 年から西暦 3267 年までのすべての日付を表現することができました。

スカリゲルは,起点となる年より以前に起こった歴史的な事件を知りませんでした。事実,ユダヤ暦では世界の始まりを紀元前 3761 年としています。現在も天文学者はスカリゲルのユリウス日を使用することで,各時代で使用されてきたさまざまな暦の月を変換するという煩わしさを回避しています。

時刻に関連する資料については,以下の Web サイトをご覧ください。

  • http://www.openvms.compaq.com/openvms/products/year-2000/leap.html

  • http://www.eecis.udel.edu/~ntp/

  • http://www.nist.gov/

  • http://www.boulder.nist.gov/timefreq/

  • http://www.tondering.dk/claus/calendar.html

  • http://es.rice.edu/ES/humsoc/Galileo/Things/gregorian_calendar.html

  • http://www.timeanddate.com

これらのサイトで提供されている情報は,一般的な内容もあれば, OpenVMS 固有の情報もあります。

3.1.1 OpenVMS システムの時間管理の詳細



3.1.1.1.1 TOY クロック

このクロックは,バッテリでバックアップされるハードウェア計時回路であり,リブート,電源障害,システム・シャットダウンの際に正確な日時を管理するために使用されます。このクロックは月,日,時刻のみを管理します。時刻は,クロックが初期化された年の 1 月 1 日 00:00:00.00 を基準に管理されます。

VAX の TOY (Time-Of-Year) クロック (リブート時あるいは電源障害時に時刻を保管するのに使用) は, 0.0025% の正度で指定されます。この精度は,月当たり約65 秒のずれに相当します。

VAX インターバル・タイムは実行時間を維持するのに使用され, .01% の精度で指定されます。この精度は,1日当たり約8.64秒ずれに相当します。

高い IPL の処理は,IPL 22 あるいは IPL 24 (これは VAX の実装に依存します) のクロック割り込みの影響を受けます。すなわち,大規模なデバイス・ドライバ割り込みあるいはメモリ・エラーなどはクロックを遅らせる原因となります。

3.1.1.1.2 EXE$GQ_SYSTIME

これは OpenVMS VAX システムの時刻セルです。このセルには,基準時点からの時間が 100ns 単位で格納されます。このセルは,ハードウェア・インターバル・タイマによって 10 ms ごとに 100000 ずつ増分されます。

3.1.1.1.3 EXE$GQ_TODCBASE

このセルには,EXE$SETTIME によってシステム時刻が最後に調整されたときの日時が格納されます。セルの形式は EXE$GQ_SYSTIME と同じです。システム時刻の調整時に,EXE$GQ_SYSTIME のコピーがメモリとディスクの両方に保存されます。このセルは,システム時刻の年を取得するために使用されます。

3.1.1.1.4 EXE$GL_TODR

このセルには,EXE$SETTIME によってシステム時刻が最後に調整されたときの日時が格納されます。 このセルの形式は,年クロックの時刻形式と同じです。システム時刻の調整時に,このセルの内容がメモリとディスクの両方に保存されます。このセルの内容は,TOY クロックの有効性をテストするために使用されます。

システム・パラメータ SETTIME と TIMEPROMPTWAIT によって,システム時刻の設定方法が決まります。

  • SETTIME = 0 で TOY クロックが有効の場合,以下のように TOY クロックの内容が EXE$GL_TODR の内容と比較されます。

    • TOY クロックが EXE$GL_TODR より 1 日以上遅れている場合, TOY クロックは無効であるとみなされます。

    • TOY クロックと EXE$GL_TODR の差が 1 日以内の場合,システム時刻は以下の方法で計算されます。
      EXE$GQ_SYSTIME = EXE$GQ_TODCBASE + ((TOY_CLOCK - EXE$GL_TODR) * 100000)

  • SETTIME = 1 であるか,または TOY クロックが無効な場合,以下のように TIMEPROMPTWAIT の値によって日時の再設定方法が決まります。

    • TIMEPROMPTWAIT > 0 の場合
      ユーザは日付と時刻を入力するように求められます。入力を求めるプロンプトは, TIMEPROMPTWAIT マイクロフォートナイトに等しい時間だけ表示されます。

    • TIMEPROMPTWAIT = 0 の場合
      その年の日時は,EXE$GL_TODR の値 + 10 ms になります。

    • TIMEPROMPTWAIT < 0 の場合
      ユーザは日付と時刻を入力するように求められ,情報を入力するまで操作を続行することができません。

OpenVMS VAX システムが収録されている CD-ROM をブートすると,システムは通常,ユーザに時刻の入力を求めるためのプロンプトを表示します。この操作は,正しい時刻でブートするために必要です。

TIMEPROMPTWAIT または SETTIME が 0 に設定されると, OpenVMS VAX は TOY クロックを使用して日時を取得し,年は配布メディアから取得します。 配布メディアに記録されている年の値 (SYS.EXE イメージ内部に保存されている) は,キットが作成された年である可能性が最も高く,この値は変更できません。現在の年が配布メディアに記録されている年と同じでない限り,年は誤った値になります。さらに,現在の年によってうるう年の計算も行われるため,日付も誤った値になる可能性があります。

3.1.1.2.1 バッテリ・バックアップ・ウォッチ (BB_WATCH) チップ

このクロックはバッテリでバックアップされるハードウェア計時回路で,リブート,電源障害,システム・シャットダウンの際に正確な日時を管理するために使用されます。このクロックは日付と時刻を 24 時間のバイナリ形式で追跡します。

BB_WATCH 時間は実行中のシステムの時間を bootstrap 中に初期化するのに使用されます。パラメータなしで SET TIME コマンドが発行されると BB_WATCH 時間の読み取りが行われ,実行中のシステムの時間がBB_WATCH に保管されている値にリセットされます。パラメータを指定して SET TIME コマンドが発行されると,実行中のシステムの時間が BB_WATCH に書き込まれます。

Alpha ハードウェア・クロックの最大ずれ幅の仕様は 50 ppm (parts per million: 百万分の一) で,これは,1 秒当たり ±0.000050 秒未満のずれ, 1 日あたり ±0.000050 日未満のずれ, 1 年あたり ±0.000050 年未満のずれに相当します。たとえば,1 日あたり 1 秒のエラーは, 11ppm あるいは 1000000/(24*60*60) に相当します。言い換えるとこれは .005% のずれで,1か月当たり約 130 秒,あるいは 1 年当たり 26 分に相当します。

ソフトウェアが維持する時間のずれは,主に他のシステム・アクティビティからの影響でこれよりも大きくなります。時間がずれる典型的な原因は,クロック割り込み処理につながる大規模な高い IPL コード (ソフト・メモリ・エラー,デバイス IPL における重い処理など) です。

3.1.1.2.2 EXE$GQ_SYSTIME

これは OpenVMS Alpha システムの時刻セルです。このセルには,11 月 17 日 1858 00:00:00.00 からの時間が 100ns 単位で格納されます。このセルは,ハードウェア・インターバル・タイマによって 10 ms ごとに 100000 ずつ増分されます。

3.1.1.2.3 EXE$GQ_SAVED_HWCLOCK

このセルは,OpenVMS Alpha で EXE$GQ_SYSTIME が最後に調整されたときの日時を追跡するために使用されます。セルに格納される時刻の形式は EXE$GQ_SYSTIME と同じです。このセルの値は,EXE$GQ_SYSTIME が調整されるたびに,メモリとディスクで更新されます。

  • システム・パラメータ SETTIME および TIMEPROMPTWAIT は,システム時刻の設定方法を指定します。

  • SETTIME = 0 の場合,以下のように EXE$INIT_HWCLOCK はハードウェア・クロックの値を使用してシステム時刻を設定します。

    • TIMEPROMPTWAIT > 0 の場合
      TIMEPROMPTWAIT の値によって,ユーザが日時の値を入力するように求められた後,入力されるのを待つ時間が設定されます。この時間が経過しても日時が入力されない場合は,システムは TIMEPROMPTWAIT = 0 として動作します。

    • TIMEPROMPTWAIT = 0 の場合
      システム時刻は EXE$GQ_SAVED_HWCLOCK の内容 + 1 から計算されます。

    • TIMEPROMPTWAIT < 0 の場合
      ユーザは日付と時刻を入力するように求められ,情報を入力するまで操作を続行することができません。

VAX の場合と異なり,Alpha のハードウェア・クロックは,年を除く日時の部分だけでなく,年も含む完全な日時を追跡します。つまり,CD-ROM メディアからブートするときに, CD-ROM のブートストラップで時刻を入力する必要がありません (もちろん,このためには日時が初期化されていることが前提です)。

VAX の TOY (Time Of Year) の分解能は 497 日であるため, VAX のシステム時刻は TOY と OpenVMS VAX のシステム・イメージ SYS.EXEの両方を使用して格納されます。 TOY と SYS.EXE を組み合わせて使用するため,毎年 1 月 1 日からおよそ 4 月 11 日までの間に少なくとも 1 回は SET TIME コマンド (パラメータ指定なし) を実行する必要があり,システム・イメージを変更する場合も (他の OpenVMS VAX システムのブート,スタンドアロン BACKUP イメージのブート, SYS.EXE を置き換える ECO などのために),必ずこのコマンドを実行する必要があります。

パラメータとして現在の時刻を指定した SET TIME コマンドは, SHUTDOWN などのさまざまな標準的な OpenVMS プロシージャで自動的に発行されますが,適切な特権を持つユーザが直接発行することも可能です。 SET TIME コマンドをパラメータとともに発行すると, TOY に格納されている値がリセットされ,(必要に応じて) SYS.EXE システム・イメージに保存されている時刻情報の部分 (現在の年) も更新されます。

OpenVMS VAX インストール・キットやスタンドアロン BACKUP でブート時に時刻の入力が求められるのは, VAX TOY にこのような制限があるためです。また,(保存値を SET TIME で更新していない場合に) 497 日の時間枠の外部でシステムがクラッシュすると時刻の値が「不正確」になったり,異なる SYS$SYSTEM:SYS.EXE が使用されているときに (別のシステム・ディスクを使用したり,スタンドアロン BACKUP を実行するなど),時刻の値が「不正確」になるのもこの制限のためです。

3.1.2 OpenVMS VAX におけるシステム時刻の管理方法を教えてください

VAX システムでは,インターバル・クロックとハードウェア・クロックが管理されています。

VAX ハードウェア・クロックは TOY ("Time Of Year") クロックと呼ばれます。このクロックに関連付けられているレジスタとして TODR ("Time Of Day Register") があります。

TOY クロックには,現在の年の 1 月 1 日 00:00:00.00 を基準にした時刻が格納されます。このクロックは 100 Hz の 32 ビット・カウンタであり, 10 ms ごとに増分されるので,497 日の周期を格納することができます。

VAX プラットフォームで稼動する OpenVMS では,システム日付情報,特に現在の年は,システム・イメージ SYS$SYSTEM:SYS.EXE に格納されます。

システム・イメージに格納されている基本日付と組み合わせて TOY を使用することで,EXE$GQ_SYSTIME に格納されるインターバル・クロックの値が初期化されます。

実行中のシステムへシステム bootstrap の一部としてインターバル・クロックがロードされた後, SET TIME (パラメータ指定なし) が発行されない限り,システムが TOY を再び参照することは通常ありません。インターバル・クロックの値は,定期的な IPL22 または IPL24 (インプリメントに応じて異なります) 割り込みによって更新されます。これらの割り込みが,大規模なドライバ割り込みやハードウェア・エラー,あるいは訂正可能な (ソフト) メモリ・エラーなど,高い IPL コードの動作の結果としてブロックされると,クロックの時刻が「失われる」ため,ユーザに報告される時刻の値は遅れているように見えます。

パラメータなしで SET TIME が発行された場合, TOY クロックがシステム・クロックにロードされ,実行中のシステムのクロックはTOYクロックに保管されている時間に設定されます。これは,通常はシステム・クロックよりも TOY クロックの方が正確であるとの想定にもとずく処理です。

大部分の (あるいはすべての) VAX システムでは, TOY クロックで問題が発生した場合は,バッテリを取り外して交換することができます。 TOY クロックの障害の大部分は,ニッケル・カドニウム (NiCd) またはリチウム電池の問題か, Dallas チップの障害によって発生します。

3.2 OpenVMS のシステム時刻の同期の維持について教えてください

より正確なシステム時刻を維持するため,あるいはシステム・クロックの同期を維持するために, TCP/IP Services NTP,DECnet-Plus DTSS (DECdtss とも呼ばれます),DCE DTS,およびその他の手法が一般に使用されています。インターネット上のいずれかの基準時刻サーバへの IP アクセスができない場合は,ダイヤルアップ回線を使用して,NIST やその他の信頼できるサイトにアクセスできます。あるいはローカルの信頼できるクロックへ直接アクセスする方法もあります。

モデム経由で NIST クロックにアクセスして入手できるデジタル (つまりバイナリ) 形式の時刻を処理するコード (ACTS (Automated Computer Telephone Service)), GPS レシーバ・デジタル・リンクから時刻を取得するコード, WWV や WWVH,WWVB などのラジオ局が発行している時報シグナルを処理するレシーバ (実際にはラジオやコーデック) などがあります。

多くの場合,これらの時刻プロトコルの処理では,レシーバから EIA232 (RS232) シリアル・ラインを読み取ることの他に必要な処理はほとんどなく,ほとんどの言語で可能です。 OpenVMS システム・クロックを基準時刻に合わせるために正しくずらす方法についての情報は, 少なくとも 1 つのOpenVMS Freeware パッケージのロジック内に提供されています (いくつかの可能性のあるハードウェア・オプションについての詳細は, 第 3.3 節 を参照)。

ローカルに組み込んだハードウェアを通して基準時刻を取得する 1 つの例として, IRIG 時刻形式 (IRIG-A,-B,-G) があります。 IRIG 時刻形式は,現在の時刻を現在の年の始めからの時,分,秒,日で表したバイナリ・シグナルです。 IRIG には,時刻を午前 0 時からの秒数で表した形式も含むことができます。 HP Custom Systems やサードパーティ・ベンダーは, OpenVMS システム向けにさまざまな IRIG ベースのリーダー/ジェネレータ・モジュールを提供しています。

最も簡単なアプローチとしては,ネットワーク・ベースの GPS あるいはその他の同じようなレシーバを使う方法があります。基本的にこの方法は,NTP サーバに外部との同期に必要なハードウェアを提供するネットワーク・サーバ・ボックスを使用する方法です。アンテナ,レシーバ,および処理のためのコンポーネントに加え,これらのデバイスはネットワーク・インタフェース (NIC)および NTP タイム・サーバのサポートを提供し, TCP/IP Services 内および他社製 IP スタック内の NTP サポートなどのアプリケーションを使用して基準時刻レシーバで提供される NTP 情報と同期させることができます。その他のホスト・ソフトウェアは必要なく,ホスト構成作業なども必要ありません (いくつかの可能性のあるハードウェア・オプションについての詳細は, 第 3.3 節 を参照)。

種類の異なるタイム・サーバ (DECnet-Plus DTSS,DCE DTS, NTP など) の共存には問題があります。特に,これらのすべてのタイム・サーバを同じノードで使用しようとすると,問題が起こります。どれか 1 種類だけを選んで使用するようにしてください。どうしても共存が必要な場合は,他のプロトコルから基準時間を取得するための 1 つのパッケージを構成することができますが,1 つのタイム・サーバ・パッケージだけがローカル OpenVMS のシステム時刻の管理およびずれを直接制御するようにしなければなりません。 DECnet-Plus DTSS の場合,以前の製品バージョンおよび V7.3 以降の製品のプロバイダ・モジュールが提供され,このモジュールを使用すると,DTSS は NTP から時刻を取得できます。詳細は,モジュール DTSS$NTP_PROVIDER.C のコメントを参照してください。

DECnet-Plus とは異なり,TCP/IP Services NTP は,ネットワーク基準時間あるいはローカル・システム・クロック以外の基準時間に接続する機能はありません。 OpenVMS用の他社製あるいはオープンソースのNTP実装も提供されています。

以下のサイトも参照してください。

  • http://www.boulder.nist.gov/timefreq/service/nts.htm

  • http://www.boulder.nist.gov/timefreq/service/acts.htm

  • http://www.boulder.nist.gov/timefreq/

  • http://www.time.gov/


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項