14

私は GCD がどのように機能するかについて確かな考えを持っていますが、宣伝されている「オペレーティング システム管理」の内部構造についてもっと知りたいと思っています。Grand Central Dispatch が「オペレーティング システム」とどのように連携するかについての技術的な説明は、ほとんどすべてがまったく異なるようです。私の発見のいくつかを言い換えます。

「これは、多くのコアにタスクを分散する OS にグローバルなデーモンです。」

私はそれを信じるほど愚かではありません。

「カーネルには、すべての GCD アプリケーションを認識するためのサポートが組み込まれています。GCD アプリケーションは、カーネルと連携して動作し、アプリケーション内のスレッドの管理方法について論理的な決定を下します。」

この同期スキームは、アプリケーション内のロジックを管理するよりもはるかに遅くなるようです。

「GCD はアプリケーション内にのみ存在し、現在のシステム負荷をその動作の指標として使用します。」

これは私にはより現実的に聞こえますが、このようなステートメントは 1 か所でしか見ませんでした。

ここで実際に何が起こっているのですか?それは単なるライブラリですか、それとも「システム」全体ですか?

4

1 に答える 1

22

これはライブラリですが、システムレベルの制御を可能にするカーネルの最適化がいくつかあります。pthread_workqueue特に、 GCDがカーネルに特定の関数を実行するスレッドを要求しているが、実際にはスレッドを開始しない(基本的には継続)ことを許可する追加のインターフェイスがあります。その時点で、カーネルはシステムの負荷に応じて、その継続を開始するかどうかを選択できます。

そうです、カーネル内のGCDスレッドを管理するグローバルなシステム全体のインフラストラクチャがあり、2番目の答えは正しいものです。あなたが犯している間違いは、同期が行われていると考えていることです。スケジューラーは何があっても実行されます。GCDが行ったことは、スケジューラーが相対的な優先順位に基づいてスレッドを実行するかどうかだけでなく、スレッドを作成または破棄するかどうかを決定できる新しいインターフェイスを使用します。良い。

これは(重要な)最適化ですが、厳密には必要ではなく、FreeBSDポートは実際にはシステム全体をサポートしていません。実際のインターフェイスを確認したい場合は、ここにpthread_workqueue.hがあり、実装はAppleのpthread.cにあり、カーネルがstart_wqthread.sのasmスタブでワークキューを起動するために使用するスタブエントリポイントを確認できます。本当に必要な場合は、xnuをクロールして、スタブにアップコールする方法を確認することもできます。

于 2009-10-17T10:18:34.087 に答える