1

特定のユーザースレッドがカーネルによってプリエンプションされてはならないアプリケーションを実行しています。セットアップについて説明します。OS:Linux2.6.32カーネル

カーネルレベル:1。カーネルに組み込まれているモジュールはたくさんあります。2.Work_queuesも一部のモジュールで初期化されます(work_queues用に個別のスレッドが作成されると思います)3。ハードウェア割り込みが発生した場合、isr中にこれらの初期化されたwork_queueのいずれかにこの作業をキューに入れます。

アプリケーションレベル:複数のスレッドが並行して実行されており、そのうちのいくつかは、処理中の他のスレッドよりも優先度が高くなっています。(カーネルでも)

目的:1。ハードウェア割り込みが発生すると、isrが自動的に呼び出され、work_queueのキューに入れられます。ただし、その間に優先度の高いユーザーレベルのスレッドが実行されている場合は、これらのwork_queuesをスケジュールする必要はありません。特定のユーザーレベルのスレッドは、kernelでのwork_queue処理によってプリエンプトされるべきではありません。今、カーネルが他のどのユーザースレッドよりも優先されることを確認しました。2.カーネルに複数のwork_queuesがあります。異なるワークキューに異なる優先度を与えるにはどうすればよいですか。カーネルにwork_queuesの優先度を設定するAPIを見たことがありません。

4

1 に答える 1

1

カーネルモードスレッドはハードウェアイベントに応答する必要があるため、ユーザースレッドは常にカーネルモードスレッドによってプリエンプト可能である必要があります。これは仕様によるものです。

ユーザーモードのスレッドがハードウェアと対話する必要がある場合、またはリアルタイムであるためにプリエンプトしてはならない場合は、カーネルモードのスレッドにすることを検討してください。

重要な操作中にスレッドのスケジュールが解除され、別のスレッドが操作を踏みにじることによってエラーが発生しただけの場合は、ロックを実装する必要があります。

linux-kernelのこの基本的な設計を破る必要がある場合は、kernel-modeスケジューラの動作を変更する必要があります。

于 2012-05-10T08:37:34.637 に答える