私はスケジューラーの第一人者ではありませんが、私がそれをどのように見ているかを説明したいと思います.ここにいくつかのことがあります.
<オール>thread_info->preempt_count
を増やすだけです 変数。preempt_disable() とは何かがわかります。これを試してください:1。スピンロックを取得します。2.通話スケジュール()
dmesg には、「BUG:Scheduling while atomic」のようなものが表示されます。これは、スケジューラーがアトミック (プリエンプティブではない) コンテキストでプロセスを検出した場合に発生しますが、それ自体をスケジュールします。
頑張ってください。
タスクを監視/プロファイリングするために作成したテスト カーネル モジュールで、次の方法で割り込みを無効にしようとしました:
1 - local_irq_save() の使用
2 - spin_lock_irqsave() の使用
3 - /proc/interrupts 内のすべての IRQ に対して手動で disable_irq() を実行
3 つのケースすべてで、IRQ が無効になっていても、hrtimer を使用して時間を測定できました (監視していたタスクもプリエンプトされました)。
私はこれが奇妙だと思います...私は個人的にセバスチャン・マウンタニオールが指摘したことを予想していました->割り込みなし-時計なし。時計なし - タイマーなし...
単一コア、単一 CPU 上の Linux カーネル 2.6.32... より良い説明ができる人はいますか?