12

タイムスタンプカウンター(TSC)をサポートするプロセッサーでは、LinuxはTSCを使用した高解像度タイマーオプションを提供します。私が理解していることから、TSCは読み取ることができるレジスタですが、設定されたレートでCPUに割り込むオプションを提供していません。したがって、Linuxでのタイマー割り込みの生成は、HZ値が通常1000または250に設定されているI / O APIC(x86上)に依存する必要があります。

TSCはマイクロ秒の粒度でタイムスタンプを提供しますが、タイマー/スケジューリングの粒度は、HZ値に応じて4msまたは1msのままです。この理解は正しいですか?または、TSCを使用してタイマーの粒度を改善するオプションはありますか?

4

1 に答える 1

9

デフォルトのLinux2.6カーネルでは、Programmable Interrupt Controller(PIT)(すべてのPCで使用可能)がシステムタイマーとして使用されます[1]。PITは、その名前が示すように、(通常はカーネルの起動時に)事前に決定された速度でCPUに割り込むようにプログラムできます。この事前に決定されたレートは、参照するHZ値です。これは、カーネルコンパイルパラメーターCONFIG_HZに等しい静的にコンパイルされた値です。[2] したがって、コンパイル時にCONFIG_HZを変更すると、PITは上記の頻度でCPUへの割り込みを開始します。ただし、PITは内部で約1.193 MHZのクロックで駆動されるため、CONFIG_HZをこの値より大きく設定することはお勧めできません。そして[3]で指摘されているように

マルチプロセッサシステムのローカルAPIC(Advanded Programmable Interrupt Controller)のタ​​イマーは、プロセッサ間同期に使用されます

[1]の説明によると、HZ値(少なくとも2.6カーネルまで)に関連付けられているPIT(ローカルAPICではない)を信じています。

さて、あなたの質問に来て、理論的にはあなたの考えは正しいように見えます。ローカルAPICやPITのようなタイムスタンプカウンターは、もう1つのタイムソースです[1]。[4]で、これの確認を見つけます。

Linuxは、このレジスタを利用して、プログラマブルインターバルタイマーによって提供されるものよりもはるかに正確な時間測定値を取得する場合があります。これを行うには、Linuxはシステムの初期化中にクロック信号の周波数を決定する必要があります。実際、カーネルのコンパイル時にこの周波数は宣言されていないため、同じカーネルイメージが、クロックが任意の周波数で刻々と変化する可能性のあるCPUで実行される可能性があります。

ただし、タイムスタンプカウンターはCPUクロックサイクルごとにインクリメントされることに注意してください。そしてこれは、CPUクロックサイクルに関連するカウンターに関連するトリッキーな落とし穴に私たちをもたらします[5]。1つの例は、最新のCPUがCPUクロックレートを変更して電力を節約できることです。これは、タイムスタンプカウンターに格納されている値に影響します。その場合、時間測定に与える影響を見積もることができます。また、完全にアイドル状態のカーネルは、外部割り込みを受信するまでプロセッサを完全に停止するHALT命令を呼び出す場合があります。この間ずっと、TSCは決して増分されず、いくつかの貴重な「増分」が失われます。そうしないと、測定がより正確になります。要するに、TSCの処理は難しい問題であり、プログラム可能な割り込みとして使用するのに特に適しているわけではありません。

  1. ロバート・ラブ、LKD--第3版。(第11章)
  2. http://lxr.linux.no/linux+v2.6.31/arch/x86/include/asm/param.h#L5
  3. http://www.6test.edu.cn/~lujx/linux_networking/0131777203_ch02lev1sec7.html
  4. http://www.makelinux.net/books/ulk3/understandlk-CHP-6-SECT-1
  5. http://lwn.net/Articles/209101/
于 2012-12-19T23:59:40.783 に答える