(57)【要約】【課題】  近年の計算機は異なる属性を持つ異なるタイマーを持つ。属性とは例えば分解能、時間範囲、及び時刻参照値である。タイマーには局所タイマーと大域タイマーがある。局所タイマーはＴＳＣのような相対時間値を示す。ＴＳＣは計算機の電源投入時又はリセット時からのＣＰＵクロックの周期を数える。大域タイマーは絶対時間又は現実時間を示す。計算機には異なるタイマーのクラスがあり、異なるタイマーを互いに関連付けるために大量の計算が必要である。【解決手段】  本発明は単一の高分解能タイマー構造を定義する。時間値をデジタル数で示し、フラグは大域タイマーと局所タイマーを区別する。本発明により時間値の処理をより高速に行える。高分解能タイマーに関連する大域時間をより高速に追跡できる。時間が重要な仕事（データ転送のパケットスケジューリング等）をより高精度にスケジュールできる。【選択図】  図１
2009181576.tif 000002
【特許請求の範囲】
【請求項１】
計算機又はプログラム可能機械において時間値を処理するための方法であって、高精確度タイマー構造が定義されることを特徴とする方法、ここで、前記高精確度タイマー構造は、前記時間値のための少なくとも１つのデジタル数及びフラグを含み、前記フラグは、前記高精確度タイマー構造が、絶対時間若しくは現実時間を示す大域タイマーを示すか、又は、相対時間を示す局所タイマーを示すかを、区別する。
【請求項２】
絶対時間又は現実時間を示す前記大域タイマーは、具体的な日付及び具体的な時刻の意味を持ち、かつ、相対時間を示す前記局所タイマーは、具体的な日付及び具体的な時刻との関連を持たない、請求項１による方法。
【請求項３】
前記高精確度タイマー構造からの２つの時間値を加算する場合に、前記２つの時間値を加算し、かつ、前記フラグを論理和演算によって結合することにより、前記加算の結果の値に対するフラグの値を得る、請求項１又は請求項２による方法、ここで前記大域タイマーを示すフラグは真の値であり、前記局所タイマーを示すフラグは偽の値である。
【請求項４】
前記高精確度タイマー構造からの２つの時間値を減算する場合に、前記２つの時間値を減算し、かつ、前記フラグを排他的論理和演算によって結合することにより、前記減算の結果の値に対するフラグの値を得る、前項までの何れか１項による方法、ここで前記大域タイマーを示すフラグは真の値であり、前記局所タイマーを示すフラグは偽の値である。
【請求項５】
前記時間値のための前記デジタル数は、整数値に対応し、前記整数値は、ＣＰＵのタイムスタンプカウンターであるＴＳＣからのカウンターの値を表現するために十分なビット長を持つ、前項までの何れか１項による方法。
【請求項６】
前記整数値は、６４ビット長の整数値である、請求項５による方法。
【請求項７】
前項までの何れか１項による方法を実行するように構成される装置。
【請求項８】
計算機又はプログラム可能機械で実行すると、請求項１乃至６の何れか１項による方法を実行するように構成される計算機プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機又はプログラム可能機械において、時間値を処理する技術分野に関する。
【背景技術】
【０００２】
計算機又はプログラム可能機械は、普通、複数の異なる時間管理回路又は複数の異なる時間管理ソフトウェア機能（以下、これらを総称して「タイマー」という。）を備える。これらのタイマーは、普通、異なる属性を備える。属性とは、とりわけ、精確度、表現できる時間の範囲、及び、時刻参照値である。時間管理及び時間計算は、計算システム及び通信システムで必す（須）である。
【０００３】
資源のスケジューリングは、普通、時間の計算に基づく。時間の測定は、極めて頻繁に必要である。例えば、データパケットを１つの計算機から別の計算機にデータネットワークを経由して送信する場合に、転送時間を精確に捉えることは、送信側の転送バッファーを最適な方法で満たすために、必要である。この時間測定をより厳密に行えば、転送速度が更に向上する可能性がある。別の例としては、計算機のプログラムコードの最適化がある。コードの最適化を達成するためには、コードの様々な場所の実行時間を精確に知る必要がある。
【０００４】
計算機で処理するための、タイマーデータ構造の主な属性は、分解能、参照時刻及びタイマー範囲である。分解能とは、２つの異なる時間値の間にありうる、最小の時間差の正の値を意味する。参照時刻とは、時間を数え始める、起点の時刻を意味する。タイマー範囲又は時間範囲とは、ありうる最小の時間値と、ありうる最大の時間値の間の範囲を意味する。この範囲は、普通、時間値を格納する、データ構造又はレジスターの大きさによって、限定される。ところで、近年の計算機システムでは、異なる時間システムが、同時に、異なる種類のタイマーを扱っている。ここで、分解能、参照時刻及び範囲が異なっている。
【０００５】
ＵＮＩＸ（登録商標）に基づく多くのシステムでは、ユーザー空間における主時間は、１９７０年１月１日０時０分０秒から経過した秒数を数えている。また、時間範囲は、２３２−１秒である。ＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）の主アプリケーション時間は、１９００年１月１日から経過したミリ秒の値を数えている。
【０００６】
しかし、より高い分解能で、ハードウェアがサポートする、他の時間システムも、多くのシステムで利用できる。例えば、ＴＳＣ（タイムスタンプカウンター）は、計算機の電源投入時からの、全てのＣＰＵサイクルを数える。ＴＳＣは、Ｉｎｔｅｌ（登録商標）の８０ｘ８６ＣＰＵに基づくＰＣプラットフォームで、利用できる。ＣＰＵのサイクル時間は、ＣＰＵに供給されるクロック信号の周期に対応する。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ＰＣプラットフォームにおけるＴＳＣは、６４ビットのレジスターで実装されているものの、ＴＳＣは、多年に渡り動作を継続すれば、１回りしてゼロに戻ってしまうのは、欠点だろう。近年の計算機システムでは、高速なＣＰＵのクロック周波数は、３ＧＨｚを超えるからである。もちろん、電源を入れなおす度に、又はシステムをリセットする度に、ＴＳＣはゼロに戻る。従って、ＴＳＣの最大値に達することは、ほぼあり得ない。例えば、３ＧＨｚのクロック周波数で駆動されるＣＰＵのＴＳＣは、約１９４年間に渡る事象を打刻できる。
【０００８】
分解能が高いカウンター（例えばＴＳＣ）の別の欠点は、そのようなカウンターは、局所的にのみ妥当だということである。２つ以上の計算システムが独立に動作している場合、異なるシステムのＴＳＣで数えた時間同士を比べるのは難しい。しかし、ネットワーク又は通信システムでは、必要なのは、データの流れや処理の段階を、高い時間分解能で測定することなのである。
【０００９】
本発明は、時間値を計算するための効果的な算術を定義し、実装するという課題を、解決しようとする。この時間値は、異なるタイマーからの値である。異なるタイマーは、異なる属性を持つ。異なる属性とは、例えば、タイマーの、範囲、分解能、及び参照時刻である。この計算は、とりわけ、このようなタイマー値の、和の値及び差の値を計算することを含む。この算術は、高い精確度のクロックを比較することを助け、かつ、計算の費用を減らすことを助ける。
【課題を解決するための手段】
【００１０】
本発明は、請求項１に請求する通り、計算機又はプログラム可能機械において時間値を処理するための方法に存する。本発明は、また、請求項７に請求する通り、その方法を実行するための装置にも関する。本発明は、また、請求項８に請求する通り、計算機プログラムにも関する。
【００１１】
本発明によれば、高精確度タイマーデータ構造は、時間値のための少なくとも１つのデジタル数及びフラグを含んで、定義される。フラグは、タイマーが、絶対時間若しくは現実時間を示しているか、又は、相対時間を示しているかを、区別する。絶対時間又は現実時間を示しているタイマーを、大域タイマーという。相対時間を示しているタイマーを、局所タイマーという。タイマーが、大域タイマー状態を得ることになるのは、時間値が絶対時間の値又は現実時間の値を示している場合である。例えば、ＵＮＩＸ（登録商標）の主時間及びＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）のアプリケーション時間は、両方とも、大域タイマーの範疇に入る。タイマーが、局所タイマーであるという属性を持つのは、時間値が、相対的な経過時間を示し、絶対時間の値又は現実時間の値を参照しない場合である。従って、例えば、ＴＳＣは典型的な局所タイマーである。
【発明の効果】
【００１２】
高精確度タイマーのクラスを定義したことにより、ＣＰＵがタイマーデータ構造を更新するために必要な処理能力を大きく減らせる。従来のタイマーデータ構造によれば、タイマーデータ構造の、高精確度の関連する要素と、低精確度の関連する要素を、タイマーデータ構造を更新する度に、同期する必要があった。他方、本発明による、１つの高精確度タイマーデータ構造の定義は、異なる時間尺度及び異なる時間分解能を備える、２つのタイマーシステムの間の、時間同期の単純化した方法を提案する。
【００１３】
フラグの割り当てを備える前述のタイマー構造による計算、即ち、時間の和及び差の計算は、２つの異なる時間システムを組み込む。この計算を、従来より効果的に実行できることになる。時間値の計算をより速く行えることになるので、時間が重要なシステムでは、高精確度タイマーに関連する大域時間を追跡できる。これが意味するのは、時間が重要な仕事のスケジューリング（例えばパケットのスケジューリング）の精確度を、より高められるということである。ネットワークプロトコルのスタックにおいては、時間の計算が大きな負荷であるから、タイマーの効果的な計算方法は重要である。この結果、高速ネットワークにおけるデータパケットの転送率を、本発明の方法により、向上できる。
【００１４】
更なる有利な実施例は、従属請求項より明らかである。時間の差又は時間の和を計算するために、とりわけ有利になるのは、２つの時間値を加算又は減算し、かつ、演算対象のフラグを論理演算で結合して、演算結果の値が、局所的か大域的かを示す、フラグの値を得ることになる場合である。このような論理演算又はブール演算は、極めて速く実行でき、ハードウェアのサポートも得られる。
【００１５】
論理和演算が２つの時間値の加算には有利である。排他的論理和演算が２つの時間値の減算には有利である。
【図面の簡単な説明】
【００１６】
【図１】複数の異なるタイマーを備える２つの計算機が、ネットワークケーブルで接続されている図である。
【発明を実施するための形態】
【００１７】
これより本発明を実施するための形態を図面を参照して説明する。
【００１８】
図１を参照する。２つの計算機１０及び２０が、互いにＬＡＮケーブル４０で接続されている。この接続はデータ通信のためである。この２つの計算機は、例えば、強力なワークステーションでもよいし、普通のＰＣでもよいし、１つの集積回路に集積された計算機でもよい。２つの計算機１０及び２０が接続しているネットワークは、高速ネットワークでありうる。高速ネットワークは、ますます利用できるようになっている。高速ネットワークは、映像制作局（例えば映画やテレビの制作局）だけでなく、広域分散ネットワークでも利用できる。高速ネットワークの顕著な例は１０Ｇイーサネット（登録商標）又はＩｎｆｉｎｉＢａｎｄ（商標）である。このような高速ネットワークに対する要求は、例えば次を含むが、これらに限定されない：
パケット化したデータ転送；
低い転送開始待ち時間；
音声や映像の打刻のような同期情報を含むこと；
映像内容と、それに関連する音声内容を、多重化すること；
誤りに対する頑健性、ビット誤りが上位層から見えないこと；
ハードウェアの構成ブロックにより、容易にサポートされること；及び
メタデータ（例えば、時間、音声、映像、カメラのパラメーター）をサポートすること。
【００１９】
映像制作局では、業務用の映像のネットワークとは、映像の内容を圧縮せずに転送できるネットワークを意味する。高精細度の画像で、いわゆる２ｋ解像度（横２０４８ｘ縦１０８０の画素）の映像ストリームは、合計データ転送速度として、１．５９Ｇビット／秒となる（２４フレーム毎秒で、３ｘ１０ビットの色深度の場合）。より高いデータ転送速度が、４ｋ解像度（横４０９６ｘ縦２１６０の画素）の映像のためには必要となる。高精細度テレビの解像度である１０８０ｉや７２０ｐの場合は、２５０〜３００Ｍビット／秒が、制作局の非圧縮の環境では必要となる。高速ネットワークとは、いまの例の場合、この程度の転送速度を意味する。
【００２０】
事象を打刻し、時間間隔を測るために、近年の計算機システムは、複数の異なるタイマー、カウンター、及び時計を備える。よくあるタイマーのいくつか、及び、その問題点を次に議論する。
【００２１】
まず、ＰＣには組み込みのＲＴＣ（リアルタイムクロック）がある。ＲＴＣは電池で駆動され、ＰＣの電源が落ちている時にも動いている。日付及び時刻を、ＲＴＣから読み出せる。しかし、ＲＴＣは高精確度ではない。１日に＋／−１秒くらいは、簡単にずれてしまう。
【００２２】
プログラミング言語Ｃの標準ライブラリーには、time()という関数がある。時間間隔を測るためには、開始事象の直前にこの関数を呼び、終了事象の直後にもこの関数を呼ぶことになる。２つの戻り値の差を計算すれば、開始事象と終了事象の間の時間間隔が判ることになる。実装により、このタイマーの精確度は約＋／−１秒のことがある。実装により、このタイマーは、約６８年までの時間間隔を測れることがある。
【００２３】
より高い精確度が必要な事象のためには、ＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）では、マルチメディアタイマーを使うことができる。関数の名前はtimeGetTimeである。このタイマーを、前述のＣの実行時関数と同様に使う。即ち事象の前後でtimeGetTime関数を呼ぶ。このタイマーの精確度は約＋／−１０ミリ秒である。このタイマーは、約４９日までの時間間隔を測れる。
【００２４】
処理装置のクロックを使うことにより、より高い精確度を確保できる。３ＧＨｚのクロック周波数の処理装置を備えるシステムでは、このタイマーは、１ナノ秒より短い事象を測れる。このタイマーを、ＴＳＣという。ＴＳＣの精確度は、３ＧＨｚのクロックのシステムの場合は、約＋／−０．３３３ナノ秒となる。しかし、このタイマーを、高水準言語を用いて、直接アクセスすることは少ない。アセンブリー言語では、RDTSC命令を使ってＴＳＣの値を読む。この時間値をどのように格納するかによって、このタイマーは、極めて長い時間に渡りうる事象を処理できる。例えば、時間値の下位３２ビットのみを格納すれば、このタイマーが測れるのは、約１．４３２秒を上限として続く事象だけである。しかし、RDTSC命令で戻ってくる６４ビットの時間値を使えば、約１９４年に渡る事象を測れる。
【００２５】
ＴＳＣの使用は、欠点もあることを理解する必要がある。例えば、Ｉｎｔｅｌ（登録商標）Ｐｅｎｔｉｕｍ（登録商標）ＩＩ及びそれより後の世代の処理装置を使うノートＰＣでは、Ｉｎｔｅｌ（登録商標）ＳｐｅｅｄＳｔｅｐ（商標）という省電力技術を組み込んでいる。同様に、ＡＭＤ（登録商標）の処理装置であるＡｔｈｌｏｎ６４（商標）又はＴｕｒｉｏｎ６４  Ｍｏｂｉｌｅ  Ｔｅｃｈｎｏｌｏｇｙ（登録商標）は、Ｃｏｏｌ‘ｎ’Ｑｕｉｅｔ（登録商標）やＰｏｗｅｒＮｏｗ！（商標）という省電力技術を使う。これらの技術は、電池でノートＰＣを駆動している場合に、電力消費を抑えるには良いのだが、処理装置のクロック周波数が下がってしまう。事象を測定している最中にクロック周波数が変わると、結果の値を読み出しても無駄となる。１回目のＴＳＣの値と、２回目のＴＳＣの値では、同じクロックの周波数を使っているのではないからである。この事象の最中にクロックの１周期が何回起こったかの数それ自体は精確となるが、周波数が不定であるため、経過時間はわからないことになる。また、複数の処理装置を使うシステムの場合は、更なる問題もある。
【００２６】
Ｅｔｉｍｅｒ（拡張タイマー）という、別のタイマーもある。Ｅｔｉｍｅｒは、ＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）の２つのＡＰＩ関数に基づく。即ち、QueryPerformanceCounterと、QueryPerformanceFrequencyである。あるプラットフォームで、この２つの関数を実装するために、何の周波数を使っているかを一般に知る方法は無い。しかし、確かなことは、このＥｔｉｍｅｒの周波数は、時間測定の最中に、変わることは無いということである。実際のタイマーは、チップセットのタイマーかもしれず、電源管理のタイマーかもしれず、又は、それ以外の何かのタイマーかもしれない。Ｅｔｉｍｅｒは、２つの目的を達成するために作られた。１つ目は、ナノ秒単位で精確な、高精確度タイマーとして使えることである。２つ目は、ＳｐｅｅｄＳｔｅｐ（商標）のような省電力技術の影響を受けないことである。ＯＳは、システムに高性能な時計が組み込まれているかどうかを確かめる。システムに高性能な時計が組み込まれており、かつ、システムが省電力機構を持たない場合は、Ｅｔｉｍｅｒは、この高性能な時計を利用することになる。この高性能な時計となる可能性が最も高いのは、処理装置のクロックである。先の条件が満たされない場合には、Ｅｔｉｍｅｒは、別の固定周波数の時計を使うことになる。例えば、チップセットのタイマー、ＢＩＯＳのタイマー、又は電源管理のタイマーを使うことになる。Ｅｔｉｍｅｒをアプリケーションで使う際に考えるべきことがある。Ｅｔｉｍｅｒは、システムコールであるQueryPerformanceCounterとQueryPerformanceFrequencyを使うので、システムコールに伴なうオーバーヘッドを蒙ることになる。Ｅｔｉｍｅｒにはまた、全ての測定が同一の処理装置で行われていることを確かめる確認機構に伴なう、別のオーバーヘッドもある。オーバーヘッドがアプリケーションにとって大きすぎるようであれば、ＲＤＴＳＣ命令を呼ぶことによって処理装置のクロックを使うことも考えられる。
【００２７】
ＵＮＩＸ（登録商標）に基づくシステムでは、所謂ＵＮＩＸ（登録商標）時間又はＰＯＳＩＸ（商標）時間というものがある。これは、１９７０年１月１日の００：００：００ＵＴＣ（協定世界時）から経過した秒数を数えている。（ＵＴＣではなく旧ＧＭＴ（グリニッジ標準時）のこともある。）この時間範囲は２３２−１秒である。ＵＴＣの１日は、ほとんどの場合、厳密に８６４００秒である。計算機は、このＵＮＩＸ（登録商標）時間を、実時間時計が提供する時間の参照値に基づいて、計算する。実時間時計の例はＰＣのＲＴＣである。ＲＴＣよりも精確な時計があれば、そちらを使うことになる。ＲＴＣよりも精確な時計の例は、ＧＰＳの時計や米国規格基準局（ＮＢＳ）の時計である。他にこれらに似た時刻提供サービスもある。例えば、ドイツ連邦共和国のブラウンシュヴァイク連邦物理学研究所（ＰＴＢ）も基準時間を公開している。
【００２８】
ＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）では、主アプリケーション時間は、１９００年１月１日から経過したミリ秒の値を数えている。
【００２９】
Ｌｉｎｕｘに基づくＯＳでは、gettimeofday(2)というシステムコールが、ＵＮＩＸ（登録商標）時間の値を返す。実装により、この関数は、３２ビットの整数で秒の値を返すとともに、３２ビットの符号無し整数でマイクロ秒の値を返すことがある。これは、前述のＵＮＩＸ（登録商標）時間を拡張したものとなっている。
【００３０】
前述の記載のうち、大域的な値を提供するタイマーは、ＲＴＣ、ＧＰＳ，ＮＢＳ、ＰＴＢ、ＵＮＩＸ（登録商標）の主時間、及びＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）の主アプリケーション時間である。それ以外のタイマーは全て局所タイマーである。局所タイマーは、絶対時間又は現実時間を示さない。
【００３１】
図１に示す２つの計算機１０及び２０は、ＴＳＣタイマー１１及び２１、ＲＴＣタイマー１２及び２２、並びにＬｉｎｕｘタイマー１３及び２３を、それぞれ備える。計算機１０は、外部のＧＰＳタイマー３０にも接続する。従って、計算機１０は、計算機２０よりも精確な実時間時計を使える。ネットワークにおける時間の既存のプロトコルであるＮＴＰ（ＲＦＣ−１３０５）を用いて、計算機２０の内部の複数の時計を、ＧＰＳタイマー３０に同期できる。
【００３２】
異なるワークステーション又は異なるＰＣの間で、時刻の値を高い精確度で比べるためには、好ましい解決方法は、大域タイマーと高い精確度のタイマーを組み合わせることである。大域タイマーとは、例えば、秒単位のＵＮＩＸ（登録商標）システムの時間、又は、ミリ秒単位のＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）システムのアプリケーション時間である。高い精確度のタイマーとは、例えば、ＴＳＣである。１つの可能な解決方法として、局所的な高い精確度のタイマーと、大域タイマーを組み合わせることを、従来、しばしば次のように実装している。
【００３３】
タイマーシステムを初期化する際に、大域的な時計（例えばＵＮＩＸ（登録商標）時間）を、局所的な時計（例えばＴＳＣ）に同期する必要がある。標準的なＵＮＩＸ（登録商標）時間では、時刻を示すデータ型は、実装により、符号付き整数のデータ型でありうる。古い実装ではこの型は３２ビットである。この型に、前述のＵＮＩＸ（登録商標）時間の値を直接符号化する。この型が整数であるということは、分解能が１秒だということを意味する。多くのＵＮＩＸ（登録商標）のアプリケーションでは、従って、時間を１秒単位の分解能のみで扱う。この型が３２ビットであり、そのうちの１ビットが符号に取られるということは、この型は、＋／−約６８年（２３１−１秒）の範囲を表現できるということを意味する。起点が１９７０年１月１日０時０分０秒であるから、表現できる最大の時刻は、２０３８年１月１９日３時１４分７秒となる。この最大の時刻の次の秒は、桁溢れを起すので、起点である１９７０年の約６８年前の、１９０１年１２月１３日20時45分52秒になってしまう。
【００３４】
Ｌｉｎｕｘに基づくＯＳでは、gettimeofday(2)というシステムコールが、ＵＮＩＸ（登録商標）時間の値を返す。実装により、この関数は、３２ビットの整数で秒の値を返すとともに、３２ビットの符号無し整数でマイクロ秒の値を返すことがある。
【００３５】
異なる計算機の間で時間値を比べるために、２つのタイマー（大域タイマーと局所タイマー）の間の倍率である、TSC_per_microsecondを定める必要がある。この値を、例えば、実験的に求めることができる。勿論、このためには、ＣＰＵのクロックの周波数を知る必要がある。ＬｉｎｕｘやＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）のようなＯＳには、ＣＰＵのクロック周波数を得るためのシステムコールがある。例えば、ＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）には、所謂Ｅｔｉｍｅｒがある。Ｅｔｉｍｅｒは、Ｗｉｎｄｏｗｓ（登録商標）のＡＰＩの関数である、QueryPerformanceCounterと、QueryPerformanceFrequencyに基づく。周波数が判れば、１マイクロ秒あたりのクロック信号の周期の数が、TSC_per_microsecondの値となる。１つの実装では、TSC_per_microsecondの値を、全てのありうるＣＰＵクロック周波数についての表から求めてもよい。ＣＰＵのクロックの周波数を求めたら、対応するTSC_per_microsecondの値を、この表から検索することになる。これにより、TSC_per_microsecondの値を求めるための、時間のかかる計算を省くことができる。
【００３６】
次に、２つの数である、zeroTSC_seconds及びzeroTSC_microsecondsを設定する。まず、zeroTSC_secondsは、ＴＳＣをリセットした時のＵＮＩＸ（登録商標）時間の値を、秒で示す。また、zeroTSC_microsecondsは、ＴＳＣをリセットした時のＵＮＩＸ（登録商標）時間の値を、マイクロ秒で示す。
【００３７】
従来の方法では、時間データ構造の１つの要素の値を更新する都度、その時間データ構造における、高い分解能の要素の値（例えばＴＳＣの値）と、低い分解能の要素の値（例えば秒やミリ秒の値）とを、互いに同期する必要があった。
【００３８】
プログラミング言語Ｃ＋＋による、従来の方法によるタイマークラスＴｉｍｅｒの実装例を次に示す。
【００３９】
Ｃｌａｓｓ  Ｔｉｍｅｒ｛
ｉｎｔ３２  ｓｅｃｏｎｄｓ；
ｕｉｎｔ３２  ｍｉｃｒｏｓｅｃｏｎｄｓ；
ｉｎｔ６４  ＴＳＣ；
ｐｕｂｌｉｃ：
Ｔｉｍｅｒ（）；
ｐｒｉｖａｔｅ：
ｓｔａｔｉｃ  ｕｉｎｔ３２  ｚｅｒｏＴＳＣ＿ｓｅｃｏｎｄｓ；
ｓｔａｔｉｃ  ｕｉｎｔ３２  ｚｅｒｏＴＳＣ＿ｍｉｃｒｏｓｅｃｏｎｄｓ；
ｓｔａｔｉｃ  ｕｉｎｔ３２  ＴＳＣ＿ｐｅｒ＿ｍｉｃｒｏｓｅｃｏｎｄ；
．．．
｝
従来の方法では、時間データ構造を更新する都度、少なくとも、１つの加算若しくは減算並びに１つの拡大縮小（即ち乗算若しくは除算）の演算を行う必要がある。これにより、時間データ構造における、高い分解能の部分と、低い分解能の部分を、互いに関連付ける。
【００４０】
従来の方法によるＴｉｍｅｒの２つのオブジェクトである、Ｔｉｍｅ１とＴｉｍｅ２を考える。Ｔｉｍｅ１とＴｉｍｅ２について、高い分解能の要素（ＴＳＣ）を、前述のように得るとする。すると、次の計算の工程が必要となる。これにより、Ｔｉｍｅｒのオブジェクトの各要素を同期する。
【００４１】
工程０  Ｔｉｍｅ１．ＴＳＣ  ＝  ＲＤＴＳＣ（）；
工程１  Ｔｉｍｅ１．ｓｅｃｏｎｄｓ  ＝  ｚｅｒｏＴＳＣ＿ｓｅｃｏｎｄｓ  ＋  Ｔｉｍｅ１．ＴＳＣ  ／  １００００００  ／  ＴＳＣ＿ｐｅｒ＿ｍｉｃｒｏｓｅｃｏｎｄｓ；
工程２  Ｔｉｍｅ１．ｍｉｃｒｏｓｅｃｏｎｄｓ  ＝  ｚｅｒｏＴＳＣ＿ｍｉｃｒｏｓｅｃｏｎｄｓ  ＋  Ｔｉｍｅ１．ＴＳＣ  ／  ＴＳＣ＿ｐｅｒ＿ｍｉｃｒｏｓｅｃｏｎｄｓ；
工程３  Ｔｉｍｅ１．ｓｅｃｏｎｄｓ  ＋＝  Ｔｉｍｅ１．ｍｉｃｒｏｓｅｃｏｎｄｓ  ／  １００００００；
工程４  Ｔｉｍｅ１．ｍｉｃｒｏｓｅｃｏｎｄｓ  ％＝  Ｔｉｍｅ１．ｍｉｃｒｏｓｅｃｏｎｄｓ；
同じ操作が、Ｔｉｍｅ２についても必要である。
【００４２】
工程０は、ＴＳＣの値を読むことに相当する。工程１〜工程４に示す通り、従来の方法では、いくつもの加算及び除算が必要であった。このクラスの、高い分解能の要素と、低い分解能の要素を同期した後に、初めて、２つのタイマーを比べることができるようになる。しかし、負荷が高い通信システムでは、このような演算を、通常、１マイクロ秒あたり、１回又は何回も、行う必要がある。このことは、時間が重要なシステムでは、問題になり得る。従って、この時間データ構造の同期を、簡単にすることが望ましい。
【００４３】
次に、本発明による、より効率的な方法を提案する。この方法を、異なる分解能及び異なる参照時刻を持つ、２つの時間システムで使う。本発明によれば、実際のタイマーデータ構造の要素の数を、高い分解能（例えばＴＳＣ）を持つ時間システムのために適切な要素だけに絞る。静的な要素は、従来通り、２つの時間システムの間の差分及び倍率を追跡する。
【００４４】
これらの静的な要素を、時間システムの初期化の際に、計算し、設定することになる。残りの前述の要素の代わりに、１つのブーリアン型の変数をここで導入する。この変数は、ｇｌｏｂａｌ＿ｔｉｍｅｒというフラグである。すると、Ｔｉｍｅｒクラスのデータ構造は前述とは違うようになる。本発明によるＴｉｍｅｒクラスを次に示す。
【００４５】
Ｃｌａｓｓ  Ｔｉｍｅｒ｛
ｉｎｔ６４  ＴＳＣ；
ｂｏｏｌ  ｇｌｏｂａｌ＿ｔｉｍｅｒ；
ｐｕｂｌｉｃ：
Ｔｉｍｅｒ（）；
ｐｒｉｖａｔｅ：
ｓｔａｔｉｃ  ｕｉｎｔ３２  ｚｅｒｏＴＳＣ＿ｓｅｃｏｎｄｓ；
ｓｔａｔｉｃ  ｕｉｎｔ３２  ｚｅｒｏＴＳＣ＿ｍｉｃｒｏｓｅｃｏｎｄｓ；
ｓｔａｔｉｃ  ｕｉｎｔ３２  ＴＳＣ＿ｐｅｒ＿ｍｉｃｒｏｓｅｃｏｎｄ；
｝
あるタイマーを、大域タイマー（即ち、絶対時間又は現実時間を示しているタイマー）であると見なすのは、そのタイマーが、大域的な時刻に設定されている場合である。大域的な時刻とは、例えば、ＵＮＩＸ（登録商標）又はＬｉｎｕｘのシステムでは、１９７０年１月１日からの秒数及びマイクロ秒数であり、ＭＳ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）では、１９００年１月１日からの秒数及びミリ秒数である。本発明によれば、時間値を格納するために、変数ＴＳＣのみがある。従って、秒及びマイクロ秒の値を、ＴＳＣの分解能に合わせる必要がある。例えば次の式のようにする。
【００４６】
ＴＳＣ  ＝  （ｓｅｃｏｎｄｓ  ＊  １００００００  ＋  ｍｉｃｒｏｓｅｃｏｎｄｓ）  ＊  ＴＳＣ＿ｐｅｒ＿ｍｉｃｒｏｓｅｃｏｎｄｓ；
この場合、ｇｌｏｂａｌ＿ｔｉｍｅｒフラグを真に設定する必要がある。この演算は、前述した２つの時間システムの間の従来の方法による工程１乃至３の各々と、およそ同じ時間がかかる。しかし、低い分解能のタイマー（秒とマイクロ秒の要素を持つ）は、高い分解能のタイマー（ＴＳＣの要素を持つ）ほど頻繁には使われない。更に、低い分解能のタイマーに必要な精確度は、高い分解能のタイマーに必要な精確度よりも、低い。従って、低い分解能のタイマーにおける、正しい値からの誤差は、マイクロ秒の分解能より低い程度である。他方、ＴＳＣの分解能における同種の計算は、より重要である。高い分解能のタイマーの場合と、低い分解能のタイマーの場合とでは、およそ同じ量の計算命令が必要であることに注意。
【００４７】
あるタイマーが、高い解像度のタイマーに設定されていれば、このタイマーは、ＴＳＣタイマーデータ構造の一員である。この場合、ｇｌｏｂａｌ＿ｔｉｍｅｒフラグを偽に設定する。このようなタイマーの意味を、局所タイマー（相対時間のタイマー）として記述する。
【００４８】
実際のシステムでは、ＴＳＣが一巡して０に戻るのは、参照時刻から１００年以上経ってからとなる（前述のようにＴＳＣが動作する場合）。このことが問題になり得るのであれば、本願によるデータ構造に、秒とマイクロ秒の要素を持ち続ける必要がある。しかし、タイマーの意味（即ち、タイマーが局所的か大域的かということ。後述する。）に従って、ＴＳＣの要素か、秒／マイクロ秒の要素かを、使うことになる。こうすると、本発明による方法にとって、いくらか性能上で不利になるが、それでも従来の方法よりは高速である。
【００４９】
クラスをタイマーに割り当てることを除けば、タイマー構造について、最も性能に重要な演算は、加算と減算である。
【００５０】
前述の、タイマーのクラスにおける代入操作並びに加算及び減算では、ＴＳＣの値だけを、設定又は再計算する必要がある。このことは、ＴＳＣ要素への代入又はＴＳＣ要素の加算若しくは減算を、それぞれ意味する。加えて、ｇｌｏｂａｌ＿ｔｉｍｅｒフラグは、結果の値の意味を示すので、次のように設定する必要がある。
【００５１】
ａ）プログラミング言語の代入操作では、新しいタイマーは、代入される値の意味を引き継ぐ。従って、ここでは、大域的か局所的かの属性は、代入元から代入先へ引き継がれる。
【００５２】
ｂ）２つのタイマーを加算する場合は、結果のｇｌｏｂａｌ＿ｔｉｍｅｒフラグは、２つのタイマー項のフラグの論理和演算の結果である。これを次に示す。
【００５３】
――――――――――――――――――――――――――――
演算対象項１のフラグ  演算対象項２のフラグ  結果のフラグ
――――――――――――――――――――――――――――
局所的                局所的                局所的
局所的                大域的                大域的
大域的                局所的                大域的
大域的                大域的                大域的
――――――――――――――――――――――――――――
局所タイマーの値と、大域タイマーの値を加算する例を次に示す。
【００５４】
24:00:00Z+2008-01-25T16:25:00Z=2008-01-26T16:25:00Z。
【００５５】
明らかに、結果は大域的な値となる。
【００５６】
上の表の最後の行の操作（大域的な時間値と大域的な時間値の加算）は、全ての文脈で意味があるとは限らない。しかし、数学的には、これは正しく、ある種の通常の計算で使うことができる。このような操作の１つの使用例は、何らかの事象が起こる、大域的な平均時刻の計算である。この計算のためには、複数の大域タイマーを足し、その結果をタイマーの数で割る必要がある。
【００５７】
ｃ）２つのタイマーを減算する場合は、結果のｇｌｏｂａｌ＿ｔｉｍｅｒフラグは、２つのタイマー項のフラグの排他的論理和演算の結果である。これを次に示す。
【００５８】
――――――――――――――――――――――――――――
演算対象項１のフラグ  演算対象項２のフラグ  結果のフラグ
――――――――――――――――――――――――――――
局所的                局所的                局所的
局所的                大域的                大域的
大域的                局所的                大域的
大域的                大域的                局所的
――――――――――――――――――――――――――――
局所タイマーの値から、大域タイマーの値を減算する例を次に示す。
【００５９】
24:00:00Z-2008-01-25T16:25:00Z=-2008-01-24T16:25:00Z。
【００６０】
この場合、大域タイマーからの時間値は負の値となる。一見、これは物理的に意味が無いように思える。しかし、性能上の理由で、処理装置の算術論理演算部では、このような負の時間値をしばしば使う。更に、このような負の時間値を計算してから符号を反転することは、時間パラメーターの減算項と被減算項を入れ替えるよりも速い。
【００６１】
タイマーの意味の計算で使う、論理和演算及び排他的論理和演算は、１つのタイマーデータ構造をもう１つのタイマーデータ構造に変換するために使う、整数の加減算や乗除算よりも、はるかに高速に実行できる。更に、論理和演算及び排他的論理和演算を、ハードウェアで実装できる。この際に使うゲートの数は少ない。従って、この方法でタイマーを計算すると、従来の方法よりも、はるかに速く実行できることになる。
【００６２】
時間値を足したり引いたり比べたりする必要がある、典型的な応用例を次に示す：データネットワークにおけるデータパケットの転送の往復遅延時間又は片道遅延時間の計算；構成管理；モーターの制御、自動制御技術。
【００６３】
以上の明細、例、及び添付の図面は、本発明の構造の構成及び使用の完全な記述を提供しているわけでは無い。本発明の多くの実施形態を、本発明の精神及び範囲から離れること無く実施できる。本発明は、添付の特許請求の範囲に存する。本発明による方法を、ソフトウェアの手段又はハードウェアの手段によって実装できる。
【図１】
2009181576.tif 000003