GNU/Linux >> Linux の 問題 >  >> Linux

割り込みを無効にするとカーネルのプリエンプションが無効になる理由と、スピン ロックがプリエンプションを無効にする方法

私はスケジューラーの第一人者ではありませんが、私がそれをどのように見ているかを説明したいと思います.ここにいくつかのことがあります.

<オール>
  • preempt_disable() IRQ を無効にしません . thread_info->preempt_count を増やすだけです 変数。
  • 割り込みを無効にすると、その後はスケジューラが機能しないため、プリエンプションも無効になりますが、これはシングル CPU マシンでのみです。 SMP では、1 つの CPU で割り込みを閉じると、他の / 他の CPU がまだ処理を行っている / 非同期で何かを行っているため、それだけでは十分ではありません。
  • Big Lock (すべての CPU のすべての割り込みを閉じることを意味します) は、システムを劇的に遅くしています。そのため、使用されなくなりました。これが、preempt_disable() が IRQ を閉じない理由でもあります。
  • 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... より良い説明ができる人はいますか?


    Linux
    1. Ubuntu / Debianのカスタムカーネル–方法、時期、理由

    2. キャッシュとしてのRedis:その仕組みと使用理由

    3. Linuxでユーザーをロックおよびロック解除する方法

    1. データが重要である理由とその保護方法

    2. cpを取得する理由:Linuxでのディレクトリエラーの省略と解決方法

    3. なぜScpはとても遅いのですか、そしてそれをより速くする方法は?

    1. リモートDockerホストを使用する方法と理由

    2. GDB と QEMU を使用して Linux カーネルをデバッグするには?

    3. Linux カーネル パニックを読み取り、理解し、分析し、デバッグする方法は?