優先度継承

優先順位の逆転は、優先順位の低いタスクが優先順位の高いタスクに必要なリソースを保持しているため、優先順位の高いトランザクションが優先順位の低いタスクによって遅延する状況です。優先度逆転を軽減するため、Android は、トランザクション優先度継承、ノード優先度継承、リアルタイム優先度継承という 3 種類の優先度継承を通じて、異なる優先度でスレッドを実行することをサポートしています。

このページでは、さまざまな形式の優先度継承について説明します。

トランザクションの優先度継承

同期バインダー呼び出しを行う場合、優先度の高いスレッドは、優先度の低いスレッドが返信を送信するまで、優先度の低いスレッドによってブロックされる可能性があります。たとえば、nice 値が -19 のスレッドは、デフォルトの nice 値が 0 のスレッドによってブロックされる可能性があります。

トランザクションの優先度継承は、トランザクションを処理するバインダ スレッドの優先度を呼び出し元の優先度に合わせてバインダ ドライバが一時的に変更するため、この問題を解決します。トランザクションが完了すると、バインダ ドライバはバインダ スレッドの優先度を以前の値に戻します。

ノードの優先度の継承

低レイテンシが必要な場合など、状況によっては非同期トランザクションの優先度が重要になります。

ノード優先度継承を使用すると、ノード上のすべてのトランザクションが実行される最小優先度を構成できます。ノード優先度継承が構成されると、ノード上のすべてのトランザクションがこの最小優先度で実行されます。

ノードの優先度の継承に関するルールは次のとおりです。

  • トランザクションが同期の場合、優先度は max(min_node_priority, caller_priority); になります。

  • トランザクションが非同期の場合、優先度は max(default_priority (nice 0), min_node_priority); になります。

ノードの優先度継承を構成する

ノードの優先度の継承を構成するには、BBinder::setMinSchedulerPolicy を使用します。

リアルタイム優先度の継承

Android は、SCHED_FIFO などのリアルタイム スケジューリング ポリシーを使用して、レイテンシが重要なスレッドが時間内に処理を完了するようにします。また、Android のレイテンシが重要な一部の作業は、2 つ以上のプロセスに分割されます。

リアルタイム優先度の継承は、次の点を除いて nice 値と同じように機能します。

  • リアルタイム優先度の継承はデフォルトで無効になっています。
  • リアルタイム優先度の値が大きいほど、値が小さいものよりも優先度が高くなります。

リアルタイム優先度の継承を有効にする

BBinder::setInheritRt(true) 呼び出しを使用して、個々のノードでリアルタイムの優先度の継承を有効にする必要があります。