iOS セマフォによりスレッド優先順位が逆転する | JD Cloud テクニカル チーム

同時キューでセマフォを使用すると、スレッドの優先順位が逆転する可能性がある

1. iOS16 & XCode14で発生 - セマフォの使用によるスレッド優先度逆転の注意事項



情報をクエリしたところ、次のようなツールが XCode14 に追加されていることがわかりました。

スレッド パフォーマンス チェッカー (XCode14 ではデ​​フォルトで有効になっています)。このツールを使用すると、APP は、実行時にスレッド優先度の逆転やメイン スレッドで実行されている非 UI 作業などの問題を見つけることができます。このツールは、XCode の問題ナビゲーション バーに表示されます。ラグ リスクの警告がシステムで表示されます。これは、開発の初期段階で隠れたラグ リスクの問題を発見して解決するのに役立ちます。これはクラッシュではありません。望ましくない場合は、診断で削除できます。 「製品 -> スキーム -> スキームの編集 スレッド パフォーマンス チェッカーがチェックされました」



XCode14 には他にもいくつかの新しく追加されたツール クラスがあります。「iOS スタック検出」を参照してください。

2. スレッド優先度逆転について

優先度の逆転 (Poiority Inversion) とは、優先度の高いタスクが実行を続行する前に、優先度の低いタスクが完了するまで待機する必要があることを意味します。この場合、優先度が逆転します。

例: A、B、C の 3 つのスレッドがあります。優先度 A > B > C、スレッド A と B はサスペンド状態にあり、特定のイベントの発生を待っています。スレッド C は実行中であり、この時点でタスク C は共有リソース Source の使用を開始します。Source を使用する場合、スレッド A はイベントの到着を待ち、スレッド A は準備完了状態に変わります。スレッド A はスレッド C よりも高い優先順位を持っているため、スレッド A はすぐに実行されます。スレッド A が共有リソース Source を使用したい場合、共有リソース Source はスレッド C によって使用されているため、スレッド A は一時停止され、スレッド C が実行を開始します。この時点で中優先度のスレッド B がイベントの到着を待っている場合、スレッド B は準備完了状態に変わります。スレッド B はスレッド C よりも高い優先順位を持っているため、スレッド B が実行を開始し、スレッド C は実行が終了するまで実行を開始しません。スレッド A は、スレッド C が共有リソース Source を解放するまで実行できません。この場合、優先順位が逆転し、スレッド B がスレッド A よりも前に実行されます。

3. 優先順位の逆転の結果は何ですか?

優先度の低いタスクは優先度の高いタスクよりも前に実行されるため、タスクの混乱や論理的な混乱が生じます。

システムクラッシュを引き起こす可能性があります。

デッドロック。優先度の低いスレッドは長時間スケジュールできず、優先度の高いスレッドは実行できず、デッドロックが発生します。

4. スレッド優先度の逆転を回避する方法

(block1) などのスレッド上で進行中の操作を待機しているために現在のスレッドがブロックされており、システムが block1 が配置されているターゲット スレッドを知っている場合、システムは関連するスレッドの優先順位を上げることで優先順位逆転の問題を解決します。 (スレッドAなど) スレッドCが共有リソースを取得しようとして停止している間、スレッドCの優先度は同じスレッドAの優先度まで上げられ、スレッドCの処理が完了するとスレッドCの優先度が下げられます。これにより、C が B にプリエンプトされるのを防ぐことができます。block1 が配置されている対象スレッドが分からないと、誰の優先度を上げるべきかが分からず、セマフォなどの逆転の問題も解決できません。

5. セマフォを使用すると、スレッドの優先順位が逆転する可能性がありますが、これは避けられません。

QoS (サービス品質)。タスクまたはキューの実行優先度を示すために使用されます。

1. ホルダーを記録する API は、優先度の逆転を自動的に回避できます。システムは、dispatch_sync などの関連するスレッドの優先度を上げることで、優先度の逆転の問題を解決します。システムがホルダーが位置するスレッドを認識していない場合、システムは優先度の逆転の問題を解決します。誰の優先順位を上げるべきかを知ることは不可能であり、逆転問題は解決できません。

2. スレッド同期には注意してdispatch_semaphoreを使用してください

API はどのスレッドがセマフォを保持しているかを記録しないため、dispatch_semaphore は簡単に優先度の逆転を引き起こす可能性があります。そのため、優先度の高いスレッドがロックを待機しているとき、カーネルはどのスレッドの優先度 (QoS) を上げるべきかを知ることができません。

3.dispatch_semaphore が優先順位の逆転を回避できない理由

dispatch_semaphore_wait() を呼び出すとき、システムはどのスレッドがdispatch_semaphore_signal() メソッドを呼び出すか分からず、所有者情報を知ることができず、優先度を調整することができません。dispatch_group はセマフォに似ており、enter() メソッドを呼び出すとき、誰が left() を実行するかを予測することができないため、システムは所有者情報を知りません。

参考文献:

優先順位の逆転

優先順位逆転のやつ

パフォーマンスの問題を早期に診断する

dispatch_semaphore は優先順位の逆転を引き起こすため、使用には注意してください。

著者: JD Retail 孫橋橋

出典:JD Cloud Developer Community 転載の際は出典を明記してください

OpenAI が ChatGPT Voice Vite 5 をすべてのユーザーに無料で公開、正式にリリース オペレーターの魔法の操作: バックグラウンドでネットワークを切断、ブロードバンド アカウントを非アクティブ化、ユーザーに光モデムの変更を強制 Microsoft オープン ソースの ターミナル チャット プログラマーが ETC 残高を改ざんし、年間 260 万元以上を横領 Redis の父が使用する Pure C 言語コードは、Telegram Bot フレームワークを実装しています あなたがオープンソース プロジェクトのメンテナである場合、この種の返答にどこまで耐えることができますか? Microsoft Copilot Web AI は 12 月 1 日に正式にリリースされ、中国の OpenAI をサポートします 元 CEO 兼社長の Sam Altman 氏と Greg Brockman 氏が Microsoft に加わりました Broadcom は VMware の買収に成功したと発表しました
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10150683