説明

計算機又はプログラム可能機械において時間値を処理するための方法

【課題】
近年の計算機は異なる属性を持つ異なるタイマーを持つ。属性とは例えば分解能、時間範囲、及び時刻参照値である。タイマーには局所タイマーと大域タイマーがある。局所タイマーはTSCのような相対時間値を示す。TSCは計算機の電源投入時又はリセット時からのCPUクロックの周期を数える。大域タイマーは絶対時間又は現実時間を示す。計算機には異なるタイマーのクラスがあり、異なるタイマーを互いに関連付けるために大量の計算が必要である。
【解決手段】
本発明は単一の高分解能タイマー構造を定義する。時間値をデジタル数で示し、フラグは大域タイマーと局所タイマーを区別する。本発明により時間値の処理をより高速に行える。高分解能タイマーに関連する大域時間をより高速に追跡できる。時間が重要な仕事(データ転送のパケットスケジューリング等)をより高精度にスケジュールできる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、計算機又はプログラム可能機械において、時間値を処理する技術分野に関する。
【背景技術】
【0002】
計算機又はプログラム可能機械は、普通、複数の異なる時間管理回路又は複数の異なる時間管理ソフトウェア機能(以下、これらを総称して「タイマー」という。)を備える。これらのタイマーは、普通、異なる属性を備える。属性とは、とりわけ、精確度、表現できる時間の範囲、及び、時刻参照値である。時間管理及び時間計算は、計算システム及び通信システムで必す(須)である。
【0003】
資源のスケジューリングは、普通、時間の計算に基づく。時間の測定は、極めて頻繁に必要である。例えば、データパケットを1つの計算機から別の計算機にデータネットワークを経由して送信する場合に、転送時間を精確に捉えることは、送信側の転送バッファーを最適な方法で満たすために、必要である。この時間測定をより厳密に行えば、転送速度が更に向上する可能性がある。別の例としては、計算機のプログラムコードの最適化がある。コードの最適化を達成するためには、コードの様々な場所の実行時間を精確に知る必要がある。
【0004】
計算機で処理するための、タイマーデータ構造の主な属性は、分解能、参照時刻及びタイマー範囲である。分解能とは、2つの異なる時間値の間にありうる、最小の時間差の正の値を意味する。参照時刻とは、時間を数え始める、起点の時刻を意味する。タイマー範囲又は時間範囲とは、ありうる最小の時間値と、ありうる最大の時間値の間の範囲を意味する。この範囲は、普通、時間値を格納する、データ構造又はレジスターの大きさによって、限定される。ところで、近年の計算機システムでは、異なる時間システムが、同時に、異なる種類のタイマーを扱っている。ここで、分解能、参照時刻及び範囲が異なっている。
【0005】
UNIX(登録商標)に基づく多くのシステムでは、ユーザー空間における主時間は、1970年1月1日0時0分0秒から経過した秒数を数えている。また、時間範囲は、232−1秒である。MS(登録商標)Windows(登録商標)の主アプリケーション時間は、1900年1月1日から経過したミリ秒の値を数えている。
【0006】
しかし、より高い分解能で、ハードウェアがサポートする、他の時間システムも、多くのシステムで利用できる。例えば、TSC(タイムスタンプカウンター)は、計算機の電源投入時からの、全てのCPUサイクルを数える。TSCは、Intel(登録商標)の80x86CPUに基づくPCプラットフォームで、利用できる。CPUのサイクル時間は、CPUに供給されるクロック信号の周期に対応する。
【発明の概要】
【発明が解決しようとする課題】
【0007】
PCプラットフォームにおけるTSCは、64ビットのレジスターで実装されているものの、TSCは、多年に渡り動作を継続すれば、1回りしてゼロに戻ってしまうのは、欠点だろう。近年の計算機システムでは、高速なCPUのクロック周波数は、3GHzを超えるからである。もちろん、電源を入れなおす度に、又はシステムをリセットする度に、TSCはゼロに戻る。従って、TSCの最大値に達することは、ほぼあり得ない。例えば、3GHzのクロック周波数で駆動されるCPUのTSCは、約194年間に渡る事象を打刻できる。
【0008】
分解能が高いカウンター(例えばTSC)の別の欠点は、そのようなカウンターは、局所的にのみ妥当だということである。2つ以上の計算システムが独立に動作している場合、異なるシステムのTSCで数えた時間同士を比べるのは難しい。しかし、ネットワーク又は通信システムでは、必要なのは、データの流れや処理の段階を、高い時間分解能で測定することなのである。
【0009】
本発明は、時間値を計算するための効果的な算術を定義し、実装するという課題を、解決しようとする。この時間値は、異なるタイマーからの値である。異なるタイマーは、異なる属性を持つ。異なる属性とは、例えば、タイマーの、範囲、分解能、及び参照時刻である。この計算は、とりわけ、このようなタイマー値の、和の値及び差の値を計算することを含む。この算術は、高い精確度のクロックを比較することを助け、かつ、計算の費用を減らすことを助ける。
【課題を解決するための手段】
【0010】
本発明は、請求項1に請求する通り、計算機又はプログラム可能機械において時間値を処理するための方法に存する。本発明は、また、請求項7に請求する通り、その方法を実行するための装置にも関する。本発明は、また、請求項8に請求する通り、計算機プログラムにも関する。
【0011】
本発明によれば、高精確度タイマーデータ構造は、時間値のための少なくとも1つのデジタル数及びフラグを含んで、定義される。フラグは、タイマーが、絶対時間若しくは現実時間を示しているか、又は、相対時間を示しているかを、区別する。絶対時間又は現実時間を示しているタイマーを、大域タイマーという。相対時間を示しているタイマーを、局所タイマーという。タイマーが、大域タイマー状態を得ることになるのは、時間値が絶対時間の値又は現実時間の値を示している場合である。例えば、UNIX(登録商標)の主時間及びMS(登録商標)Windows(登録商標)のアプリケーション時間は、両方とも、大域タイマーの範疇に入る。タイマーが、局所タイマーであるという属性を持つのは、時間値が、相対的な経過時間を示し、絶対時間の値又は現実時間の値を参照しない場合である。従って、例えば、TSCは典型的な局所タイマーである。
【発明の効果】
【0012】
高精確度タイマーのクラスを定義したことにより、CPUがタイマーデータ構造を更新するために必要な処理能力を大きく減らせる。従来のタイマーデータ構造によれば、タイマーデータ構造の、高精確度の関連する要素と、低精確度の関連する要素を、タイマーデータ構造を更新する度に、同期する必要があった。他方、本発明による、1つの高精確度タイマーデータ構造の定義は、異なる時間尺度及び異なる時間分解能を備える、2つのタイマーシステムの間の、時間同期の単純化した方法を提案する。
【0013】
フラグの割り当てを備える前述のタイマー構造による計算、即ち、時間の和及び差の計算は、2つの異なる時間システムを組み込む。この計算を、従来より効果的に実行できることになる。時間値の計算をより速く行えることになるので、時間が重要なシステムでは、高精確度タイマーに関連する大域時間を追跡できる。これが意味するのは、時間が重要な仕事のスケジューリング(例えばパケットのスケジューリング)の精確度を、より高められるということである。ネットワークプロトコルのスタックにおいては、時間の計算が大きな負荷であるから、タイマーの効果的な計算方法は重要である。この結果、高速ネットワークにおけるデータパケットの転送率を、本発明の方法により、向上できる。
【0014】
更なる有利な実施例は、従属請求項より明らかである。時間の差又は時間の和を計算するために、とりわけ有利になるのは、2つの時間値を加算又は減算し、かつ、演算対象のフラグを論理演算で結合して、演算結果の値が、局所的か大域的かを示す、フラグの値を得ることになる場合である。このような論理演算又はブール演算は、極めて速く実行でき、ハードウェアのサポートも得られる。
【0015】
論理和演算が2つの時間値の加算には有利である。排他的論理和演算が2つの時間値の減算には有利である。
【図面の簡単な説明】
【0016】
【図1】複数の異なるタイマーを備える2つの計算機が、ネットワークケーブルで接続されている図である。
【発明を実施するための形態】
【0017】
これより本発明を実施するための形態を図面を参照して説明する。
【0018】
図1を参照する。2つの計算機10及び20が、互いにLANケーブル40で接続されている。この接続はデータ通信のためである。この2つの計算機は、例えば、強力なワークステーションでもよいし、普通のPCでもよいし、1つの集積回路に集積された計算機でもよい。2つの計算機10及び20が接続しているネットワークは、高速ネットワークでありうる。高速ネットワークは、ますます利用できるようになっている。高速ネットワークは、映像制作局(例えば映画やテレビの制作局)だけでなく、広域分散ネットワークでも利用できる。高速ネットワークの顕著な例は10Gイーサネット(登録商標)又はInfiniBand(商標)である。このような高速ネットワークに対する要求は、例えば次を含むが、これらに限定されない:
パケット化したデータ転送;
低い転送開始待ち時間;
音声や映像の打刻のような同期情報を含むこと;
映像内容と、それに関連する音声内容を、多重化すること;
誤りに対する頑健性、ビット誤りが上位層から見えないこと;
ハードウェアの構成ブロックにより、容易にサポートされること;及び
メタデータ(例えば、時間、音声、映像、カメラのパラメーター)をサポートすること。
【0019】
映像制作局では、業務用の映像のネットワークとは、映像の内容を圧縮せずに転送できるネットワークを意味する。高精細度の画像で、いわゆる2k解像度(横2048x縦1080の画素)の映像ストリームは、合計データ転送速度として、1.59Gビット/秒となる(24フレーム毎秒で、3x10ビットの色深度の場合)。より高いデータ転送速度が、4k解像度(横4096x縦2160の画素)の映像のためには必要となる。高精細度テレビの解像度である1080iや720pの場合は、250〜300Mビット/秒が、制作局の非圧縮の環境では必要となる。高速ネットワークとは、いまの例の場合、この程度の転送速度を意味する。
【0020】
事象を打刻し、時間間隔を測るために、近年の計算機システムは、複数の異なるタイマー、カウンター、及び時計を備える。よくあるタイマーのいくつか、及び、その問題点を次に議論する。
【0021】
まず、PCには組み込みのRTC(リアルタイムクロック)がある。RTCは電池で駆動され、PCの電源が落ちている時にも動いている。日付及び時刻を、RTCから読み出せる。しかし、RTCは高精確度ではない。1日に+/−1秒くらいは、簡単にずれてしまう。
【0022】
プログラミング言語Cの標準ライブラリーには、time()という関数がある。時間間隔を測るためには、開始事象の直前にこの関数を呼び、終了事象の直後にもこの関数を呼ぶことになる。2つの戻り値の差を計算すれば、開始事象と終了事象の間の時間間隔が判ることになる。実装により、このタイマーの精確度は約+/−1秒のことがある。実装により、このタイマーは、約68年までの時間間隔を測れることがある。
【0023】
より高い精確度が必要な事象のためには、MS(登録商標)Windows(登録商標)では、マルチメディアタイマーを使うことができる。関数の名前はtimeGetTimeである。このタイマーを、前述のCの実行時関数と同様に使う。即ち事象の前後でtimeGetTime関数を呼ぶ。このタイマーの精確度は約+/−10ミリ秒である。このタイマーは、約49日までの時間間隔を測れる。
【0024】
処理装置のクロックを使うことにより、より高い精確度を確保できる。3GHzのクロック周波数の処理装置を備えるシステムでは、このタイマーは、1ナノ秒より短い事象を測れる。このタイマーを、TSCという。TSCの精確度は、3GHzのクロックのシステムの場合は、約+/−0.333ナノ秒となる。しかし、このタイマーを、高水準言語を用いて、直接アクセスすることは少ない。アセンブリー言語では、RDTSC命令を使ってTSCの値を読む。この時間値をどのように格納するかによって、このタイマーは、極めて長い時間に渡りうる事象を処理できる。例えば、時間値の下位32ビットのみを格納すれば、このタイマーが測れるのは、約1.432秒を上限として続く事象だけである。しかし、RDTSC命令で戻ってくる64ビットの時間値を使えば、約194年に渡る事象を測れる。
【0025】
TSCの使用は、欠点もあることを理解する必要がある。例えば、Intel(登録商標)Pentium(登録商標)II及びそれより後の世代の処理装置を使うノートPCでは、Intel(登録商標)SpeedStep(商標)という省電力技術を組み込んでいる。同様に、AMD(登録商標)の処理装置であるAthlon64(商標)又はTurion64 Mobile Technology(登録商標)は、Cool‘n’Quiet(登録商標)やPowerNow!(商標)という省電力技術を使う。これらの技術は、電池でノートPCを駆動している場合に、電力消費を抑えるには良いのだが、処理装置のクロック周波数が下がってしまう。事象を測定している最中にクロック周波数が変わると、結果の値を読み出しても無駄となる。1回目のTSCの値と、2回目のTSCの値では、同じクロックの周波数を使っているのではないからである。この事象の最中にクロックの1周期が何回起こったかの数それ自体は精確となるが、周波数が不定であるため、経過時間はわからないことになる。また、複数の処理装置を使うシステムの場合は、更なる問題もある。
【0026】
Etimer(拡張タイマー)という、別のタイマーもある。Etimerは、MS(登録商標)Windows(登録商標)の2つのAPI関数に基づく。即ち、QueryPerformanceCounterと、QueryPerformanceFrequencyである。あるプラットフォームで、この2つの関数を実装するために、何の周波数を使っているかを一般に知る方法は無い。しかし、確かなことは、このEtimerの周波数は、時間測定の最中に、変わることは無いということである。実際のタイマーは、チップセットのタイマーかもしれず、電源管理のタイマーかもしれず、又は、それ以外の何かのタイマーかもしれない。Etimerは、2つの目的を達成するために作られた。1つ目は、ナノ秒単位で精確な、高精確度タイマーとして使えることである。2つ目は、SpeedStep(商標)のような省電力技術の影響を受けないことである。OSは、システムに高性能な時計が組み込まれているかどうかを確かめる。システムに高性能な時計が組み込まれており、かつ、システムが省電力機構を持たない場合は、Etimerは、この高性能な時計を利用することになる。この高性能な時計となる可能性が最も高いのは、処理装置のクロックである。先の条件が満たされない場合には、Etimerは、別の固定周波数の時計を使うことになる。例えば、チップセットのタイマー、BIOSのタイマー、又は電源管理のタイマーを使うことになる。Etimerをアプリケーションで使う際に考えるべきことがある。Etimerは、システムコールであるQueryPerformanceCounterとQueryPerformanceFrequencyを使うので、システムコールに伴なうオーバーヘッドを蒙ることになる。Etimerにはまた、全ての測定が同一の処理装置で行われていることを確かめる確認機構に伴なう、別のオーバーヘッドもある。オーバーヘッドがアプリケーションにとって大きすぎるようであれば、RDTSC命令を呼ぶことによって処理装置のクロックを使うことも考えられる。
【0027】
UNIX(登録商標)に基づくシステムでは、所謂UNIX(登録商標)時間又はPOSIX(商標)時間というものがある。これは、1970年1月1日の00:00:00UTC(協定世界時)から経過した秒数を数えている。(UTCではなく旧GMT(グリニッジ標準時)のこともある。)この時間範囲は232−1秒である。UTCの1日は、ほとんどの場合、厳密に86400秒である。計算機は、このUNIX(登録商標)時間を、実時間時計が提供する時間の参照値に基づいて、計算する。実時間時計の例はPCのRTCである。RTCよりも精確な時計があれば、そちらを使うことになる。RTCよりも精確な時計の例は、GPSの時計や米国規格基準局(NBS)の時計である。他にこれらに似た時刻提供サービスもある。例えば、ドイツ連邦共和国のブラウンシュヴァイク連邦物理学研究所(PTB)も基準時間を公開している。
【0028】
MS(登録商標)Windows(登録商標)では、主アプリケーション時間は、1900年1月1日から経過したミリ秒の値を数えている。
【0029】
Linuxに基づくOSでは、gettimeofday(2)というシステムコールが、UNIX(登録商標)時間の値を返す。実装により、この関数は、32ビットの整数で秒の値を返すとともに、32ビットの符号無し整数でマイクロ秒の値を返すことがある。これは、前述のUNIX(登録商標)時間を拡張したものとなっている。
【0030】
前述の記載のうち、大域的な値を提供するタイマーは、RTC、GPS,NBS、PTB、UNIX(登録商標)の主時間、及びMS(登録商標)Windows(登録商標)の主アプリケーション時間である。それ以外のタイマーは全て局所タイマーである。局所タイマーは、絶対時間又は現実時間を示さない。
【0031】
図1に示す2つの計算機10及び20は、TSCタイマー11及び21、RTCタイマー12及び22、並びにLinuxタイマー13及び23を、それぞれ備える。計算機10は、外部のGPSタイマー30にも接続する。従って、計算機10は、計算機20よりも精確な実時間時計を使える。ネットワークにおける時間の既存のプロトコルであるNTP(RFC−1305)を用いて、計算機20の内部の複数の時計を、GPSタイマー30に同期できる。
【0032】
異なるワークステーション又は異なるPCの間で、時刻の値を高い精確度で比べるためには、好ましい解決方法は、大域タイマーと高い精確度のタイマーを組み合わせることである。大域タイマーとは、例えば、秒単位のUNIX(登録商標)システムの時間、又は、ミリ秒単位のMS(登録商標)Windows(登録商標)システムのアプリケーション時間である。高い精確度のタイマーとは、例えば、TSCである。1つの可能な解決方法として、局所的な高い精確度のタイマーと、大域タイマーを組み合わせることを、従来、しばしば次のように実装している。
【0033】
タイマーシステムを初期化する際に、大域的な時計(例えばUNIX(登録商標)時間)を、局所的な時計(例えばTSC)に同期する必要がある。標準的なUNIX(登録商標)時間では、時刻を示すデータ型は、実装により、符号付き整数のデータ型でありうる。古い実装ではこの型は32ビットである。この型に、前述のUNIX(登録商標)時間の値を直接符号化する。この型が整数であるということは、分解能が1秒だということを意味する。多くのUNIX(登録商標)のアプリケーションでは、従って、時間を1秒単位の分解能のみで扱う。この型が32ビットであり、そのうちの1ビットが符号に取られるということは、この型は、+/−約68年(231−1秒)の範囲を表現できるということを意味する。起点が1970年1月1日0時0分0秒であるから、表現できる最大の時刻は、2038年1月19日3時14分7秒となる。この最大の時刻の次の秒は、桁溢れを起すので、起点である1970年の約68年前の、1901年12月13日20時45分52秒になってしまう。
【0034】
Linuxに基づくOSでは、gettimeofday(2)というシステムコールが、UNIX(登録商標)時間の値を返す。実装により、この関数は、32ビットの整数で秒の値を返すとともに、32ビットの符号無し整数でマイクロ秒の値を返すことがある。
【0035】
異なる計算機の間で時間値を比べるために、2つのタイマー(大域タイマーと局所タイマー)の間の倍率である、TSC_per_microsecondを定める必要がある。この値を、例えば、実験的に求めることができる。勿論、このためには、CPUのクロックの周波数を知る必要がある。LinuxやMS(登録商標)Windows(登録商標)のようなOSには、CPUのクロック周波数を得るためのシステムコールがある。例えば、MS(登録商標)Windows(登録商標)には、所謂Etimerがある。Etimerは、Windows(登録商標)のAPIの関数である、QueryPerformanceCounterと、QueryPerformanceFrequencyに基づく。周波数が判れば、1マイクロ秒あたりのクロック信号の周期の数が、TSC_per_microsecondの値となる。1つの実装では、TSC_per_microsecondの値を、全てのありうるCPUクロック周波数についての表から求めてもよい。CPUのクロックの周波数を求めたら、対応するTSC_per_microsecondの値を、この表から検索することになる。これにより、TSC_per_microsecondの値を求めるための、時間のかかる計算を省くことができる。
【0036】
次に、2つの数である、zeroTSC_seconds及びzeroTSC_microsecondsを設定する。まず、zeroTSC_secondsは、TSCをリセットした時のUNIX(登録商標)時間の値を、秒で示す。また、zeroTSC_microsecondsは、TSCをリセットした時のUNIX(登録商標)時間の値を、マイクロ秒で示す。
【0037】
従来の方法では、時間データ構造の1つの要素の値を更新する都度、その時間データ構造における、高い分解能の要素の値(例えばTSCの値)と、低い分解能の要素の値(例えば秒やミリ秒の値)とを、互いに同期する必要があった。
【0038】
プログラミング言語C++による、従来の方法によるタイマークラスTimerの実装例を次に示す。
【0039】
Class Timer{
int32 seconds;
uint32 microseconds;
int64 TSC;

public:
Timer();

private:
static uint32 zeroTSC_seconds;
static uint32 zeroTSC_microseconds;
static uint32 TSC_per_microsecond;
...

従来の方法では、時間データ構造を更新する都度、少なくとも、1つの加算若しくは減算並びに1つの拡大縮小(即ち乗算若しくは除算)の演算を行う必要がある。これにより、時間データ構造における、高い分解能の部分と、低い分解能の部分を、互いに関連付ける。
【0040】
従来の方法によるTimerの2つのオブジェクトである、Time1とTime2を考える。Time1とTime2について、高い分解能の要素(TSC)を、前述のように得るとする。すると、次の計算の工程が必要となる。これにより、Timerのオブジェクトの各要素を同期する。
【0041】
工程0 Time1.TSC = RDTSC();
工程1 Time1.seconds = zeroTSC_seconds + Time1.TSC / 1000000 / TSC_per_microseconds;
工程2 Time1.microseconds = zeroTSC_microseconds + Time1.TSC / TSC_per_microseconds;
工程3 Time1.seconds += Time1.microseconds / 1000000;
工程4 Time1.microseconds %= Time1.microseconds;
同じ操作が、Time2についても必要である。
【0042】
工程0は、TSCの値を読むことに相当する。工程1〜工程4に示す通り、従来の方法では、いくつもの加算及び除算が必要であった。このクラスの、高い分解能の要素と、低い分解能の要素を同期した後に、初めて、2つのタイマーを比べることができるようになる。しかし、負荷が高い通信システムでは、このような演算を、通常、1マイクロ秒あたり、1回又は何回も、行う必要がある。このことは、時間が重要なシステムでは、問題になり得る。従って、この時間データ構造の同期を、簡単にすることが望ましい。
【0043】
次に、本発明による、より効率的な方法を提案する。この方法を、異なる分解能及び異なる参照時刻を持つ、2つの時間システムで使う。本発明によれば、実際のタイマーデータ構造の要素の数を、高い分解能(例えばTSC)を持つ時間システムのために適切な要素だけに絞る。静的な要素は、従来通り、2つの時間システムの間の差分及び倍率を追跡する。
【0044】
これらの静的な要素を、時間システムの初期化の際に、計算し、設定することになる。残りの前述の要素の代わりに、1つのブーリアン型の変数をここで導入する。この変数は、global_timerというフラグである。すると、Timerクラスのデータ構造は前述とは違うようになる。本発明によるTimerクラスを次に示す。
【0045】
Class Timer{
int64 TSC;
bool global_timer;

public:
Timer();

private:
static uint32 zeroTSC_seconds;
static uint32 zeroTSC_microseconds;
static uint32 TSC_per_microsecond;

あるタイマーを、大域タイマー(即ち、絶対時間又は現実時間を示しているタイマー)であると見なすのは、そのタイマーが、大域的な時刻に設定されている場合である。大域的な時刻とは、例えば、UNIX(登録商標)又はLinuxのシステムでは、1970年1月1日からの秒数及びマイクロ秒数であり、MS(登録商標)Windows(登録商標)では、1900年1月1日からの秒数及びミリ秒数である。本発明によれば、時間値を格納するために、変数TSCのみがある。従って、秒及びマイクロ秒の値を、TSCの分解能に合わせる必要がある。例えば次の式のようにする。
【0046】
TSC = (seconds * 1000000 + microseconds) * TSC_per_microseconds;
この場合、global_timerフラグを真に設定する必要がある。この演算は、前述した2つの時間システムの間の従来の方法による工程1乃至3の各々と、およそ同じ時間がかかる。しかし、低い分解能のタイマー(秒とマイクロ秒の要素を持つ)は、高い分解能のタイマー(TSCの要素を持つ)ほど頻繁には使われない。更に、低い分解能のタイマーに必要な精確度は、高い分解能のタイマーに必要な精確度よりも、低い。従って、低い分解能のタイマーにおける、正しい値からの誤差は、マイクロ秒の分解能より低い程度である。他方、TSCの分解能における同種の計算は、より重要である。高い分解能のタイマーの場合と、低い分解能のタイマーの場合とでは、およそ同じ量の計算命令が必要であることに注意。
【0047】
あるタイマーが、高い解像度のタイマーに設定されていれば、このタイマーは、TSCタイマーデータ構造の一員である。この場合、global_timerフラグを偽に設定する。このようなタイマーの意味を、局所タイマー(相対時間のタイマー)として記述する。
【0048】
実際のシステムでは、TSCが一巡して0に戻るのは、参照時刻から100年以上経ってからとなる(前述のようにTSCが動作する場合)。このことが問題になり得るのであれば、本願によるデータ構造に、秒とマイクロ秒の要素を持ち続ける必要がある。しかし、タイマーの意味(即ち、タイマーが局所的か大域的かということ。後述する。)に従って、TSCの要素か、秒/マイクロ秒の要素かを、使うことになる。こうすると、本発明による方法にとって、いくらか性能上で不利になるが、それでも従来の方法よりは高速である。
【0049】
クラスをタイマーに割り当てることを除けば、タイマー構造について、最も性能に重要な演算は、加算と減算である。
【0050】
前述の、タイマーのクラスにおける代入操作並びに加算及び減算では、TSCの値だけを、設定又は再計算する必要がある。このことは、TSC要素への代入又はTSC要素の加算若しくは減算を、それぞれ意味する。加えて、global_timerフラグは、結果の値の意味を示すので、次のように設定する必要がある。
【0051】
a)プログラミング言語の代入操作では、新しいタイマーは、代入される値の意味を引き継ぐ。従って、ここでは、大域的か局所的かの属性は、代入元から代入先へ引き継がれる。
【0052】
b)2つのタイマーを加算する場合は、結果のglobal_timerフラグは、2つのタイマー項のフラグの論理和演算の結果である。これを次に示す。
【0053】
――――――――――――――――――――――――――――
演算対象項1のフラグ 演算対象項2のフラグ 結果のフラグ
――――――――――――――――――――――――――――
局所的 局所的 局所的
局所的 大域的 大域的
大域的 局所的 大域的
大域的 大域的 大域的
――――――――――――――――――――――――――――
局所タイマーの値と、大域タイマーの値を加算する例を次に示す。
【0054】
24:00:00Z+2008-01-25T16:25:00Z=2008-01-26T16:25:00Z。
【0055】
明らかに、結果は大域的な値となる。
【0056】
上の表の最後の行の操作(大域的な時間値と大域的な時間値の加算)は、全ての文脈で意味があるとは限らない。しかし、数学的には、これは正しく、ある種の通常の計算で使うことができる。このような操作の1つの使用例は、何らかの事象が起こる、大域的な平均時刻の計算である。この計算のためには、複数の大域タイマーを足し、その結果をタイマーの数で割る必要がある。
【0057】
c)2つのタイマーを減算する場合は、結果のglobal_timerフラグは、2つのタイマー項のフラグの排他的論理和演算の結果である。これを次に示す。
【0058】
――――――――――――――――――――――――――――
演算対象項1のフラグ 演算対象項2のフラグ 結果のフラグ
――――――――――――――――――――――――――――
局所的 局所的 局所的
局所的 大域的 大域的
大域的 局所的 大域的
大域的 大域的 局所的
――――――――――――――――――――――――――――
局所タイマーの値から、大域タイマーの値を減算する例を次に示す。
【0059】
24:00:00Z-2008-01-25T16:25:00Z=-2008-01-24T16:25:00Z。
【0060】
この場合、大域タイマーからの時間値は負の値となる。一見、これは物理的に意味が無いように思える。しかし、性能上の理由で、処理装置の算術論理演算部では、このような負の時間値をしばしば使う。更に、このような負の時間値を計算してから符号を反転することは、時間パラメーターの減算項と被減算項を入れ替えるよりも速い。
【0061】
タイマーの意味の計算で使う、論理和演算及び排他的論理和演算は、1つのタイマーデータ構造をもう1つのタイマーデータ構造に変換するために使う、整数の加減算や乗除算よりも、はるかに高速に実行できる。更に、論理和演算及び排他的論理和演算を、ハードウェアで実装できる。この際に使うゲートの数は少ない。従って、この方法でタイマーを計算すると、従来の方法よりも、はるかに速く実行できることになる。
【0062】
時間値を足したり引いたり比べたりする必要がある、典型的な応用例を次に示す:データネットワークにおけるデータパケットの転送の往復遅延時間又は片道遅延時間の計算;構成管理;モーターの制御、自動制御技術。
【0063】
以上の明細、例、及び添付の図面は、本発明の構造の構成及び使用の完全な記述を提供しているわけでは無い。本発明の多くの実施形態を、本発明の精神及び範囲から離れること無く実施できる。本発明は、添付の特許請求の範囲に存する。本発明による方法を、ソフトウェアの手段又はハードウェアの手段によって実装できる。

【特許請求の範囲】
【請求項1】
計算機又はプログラム可能機械において時間値を処理するための方法であって、高精確度タイマー構造が定義されることを特徴とする方法、ここで、前記高精確度タイマー構造は、前記時間値のための少なくとも1つのデジタル数及びフラグを含み、前記フラグは、前記高精確度タイマー構造が、絶対時間若しくは現実時間を示す大域タイマーを示すか、又は、相対時間を示す局所タイマーを示すかを、区別する。
【請求項2】
絶対時間又は現実時間を示す前記大域タイマーは、具体的な日付及び具体的な時刻の意味を持ち、かつ、相対時間を示す前記局所タイマーは、具体的な日付及び具体的な時刻との関連を持たない、請求項1による方法。
【請求項3】
前記高精確度タイマー構造からの2つの時間値を加算する場合に、前記2つの時間値を加算し、かつ、前記フラグを論理和演算によって結合することにより、前記加算の結果の値に対するフラグの値を得る、請求項1又は請求項2による方法、ここで前記大域タイマーを示すフラグは真の値であり、前記局所タイマーを示すフラグは偽の値である。
【請求項4】
前記高精確度タイマー構造からの2つの時間値を減算する場合に、前記2つの時間値を減算し、かつ、前記フラグを排他的論理和演算によって結合することにより、前記減算の結果の値に対するフラグの値を得る、前項までの何れか1項による方法、ここで前記大域タイマーを示すフラグは真の値であり、前記局所タイマーを示すフラグは偽の値である。
【請求項5】
前記時間値のための前記デジタル数は、整数値に対応し、前記整数値は、CPUのタイムスタンプカウンターであるTSCからのカウンターの値を表現するために十分なビット長を持つ、前項までの何れか1項による方法。
【請求項6】
前記整数値は、64ビット長の整数値である、請求項5による方法。
【請求項7】
前項までの何れか1項による方法を実行するように構成される装置。
【請求項8】
計算機又はプログラム可能機械で実行すると、請求項1乃至6の何れか1項による方法を実行するように構成される計算機プログラム。

【図1】
image rotate


【公開番号】特開2009−181576(P2009−181576A)
【公開日】平成21年8月13日(2009.8.13)
【国際特許分類】
【出願番号】特願2009−15248(P2009−15248)
【出願日】平成21年1月27日(2009.1.27)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.Linux
【出願人】(501263810)トムソン ライセンシング (2,848)
【氏名又は名称原語表記】Thomson Licensing 
【住所又は居所原語表記】46 Quai A. Le Gallo, F−92100 Boulogne−Billancourt, France