1

「1msスリープ」にかかる時間を知りたかったのです。

カーネルモジュールでこのクエストを実行しました:

rdtscl(aj);
msleep(1);
rdtscl(b);
printk(KERN_INFO "Difference = %lu", (b-a));// Number of clock cycles consumed

私が得た出力:

Difference = 13479219

cat /proc/cpuinfo の出力

cpu MHz : 1197.000

それで、遅延を計算したところ、11.26 ミリ秒になりました。

約 1 ミリ秒で取得できないのはなぜですか?

アップデート:

cat /proc/cpuinfo のプロセッサ周波数は、次の行から取得する必要があります。

model name  : Intel(R) Core(TM) i3 CPU         540  @ 3.07GHz

=> プロセッサの周波数は 3.07 GHz です。ただし、この行「cpu MHz : 1197.000」の意味がわかりません。

ありがとう

4

1 に答える 1

1

プロセスの解像度は、テスト コードを実行したシステムで構成された HZ 値によって異なります。HZ 値は 100 または 1000 です。100 の場合、スケジューラは 10 ミリ秒に 1 回だけ起動します。ほとんどのデスクトップ システムでは、最近のディストリビューションでは 1000 に設定されます (Fedora の /boot にある構成ファイルを確認できます)。スケジューラはそれに基づいてのみスケジュールを設定するため、スケジューラが 10 ミリ秒ごとに 1 回起動する場合、10 ミリ秒未満の解像度を取得する方法はありません。または、カーネルで HR タイマーを使用する必要があります。

kernel-3.4.5 (u3-1 *)$ cat /boot/config-3.6.10-4.fc18.x86_64 | grep HZ
CONFIG_NO_HZ=y
# CONFIG_RCU_FAST_NO_HZ is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000

本当に遅延が必要で、スリープしない場合は、mdelay を使用できます。これは、指定された時間だけループして戻ります。

于 2013-04-02T10:55:20.223 に答える