12

そのため、マルチスレッドのパフォーマンスを向上させるために Python インタープリターからグローバル インタープリター ロック (GIL) を削除しようとする試みに関するこの記事を読んでいて、興味深いことに気付きました。

GIL の削除が実際に事態を悪化させた場所の 1 つは、メモリ管理であることが判明しました。

フリースレッドでは、参照カウント操作はスレッド セーフを失います。したがって、このパッチは、カウントを更新するためのアトミック操作とともに、グローバル参照カウント ミューテックス ロックを導入します。Unix では、ロックは標準の pthread_mutex_t ロック (PyMutex 構造内にラップ) と次の関数を使用して実装されます...

...Unix では、単純な参照カウント操作が 3 つ以上の関数呼び出しに置き換えられ、さらに実際のロックのオーバーヘッドが発生することを強調する必要があります。はるかに高価です...

...参照カウントのきめの細かいロックがパフォーマンス低下の主な原因であることは明らかですが、ロックを取り除いたとしても、参照カウントのパフォーマンスは何らかの余分なオーバーヘッド (関数呼び出しなど) に非常に敏感です。 .)。この場合でも、パフォーマンスは GIL を使用した Python の約 2 倍遅くなります。

以降:

参照カウントは、フリースレッドのメモリ管理手法としては非常に厄介です。これはすでに広く知られていましたが、パフォーマンスの数字はそれをより具体的な数字にしています. これは間違いなく、GIL 除去パッチを試みる人にとって最も困難な問題です。

問題は、参照カウントがスレッドにとって非常に厄介である場合、Objective-C はどのようにそれを行うのでしょうか? 私はマルチスレッドの Objective-C アプリを書いたことがありますが、メモリ管理のオーバーヘッドはあまり気になりませんでした。彼らは何か他のことをしていますか?グローバルロックではなく、オブジェクトごとのロックのようなものですか? Objective-C の参照カウントは実際にスレッドに対して技術的に安全ではありませんか? 私は並行処理の専門家であり、実際に多くのことを推測することはできませんが、知りたいと思っています。

4

2 に答える 2

11

オーバーヘッドがあり、(たとえば、マイクロベンチマークのような) 最適化が実施されているかどうかに関係なく (その多くが存在します)、まれに重大な場合があります。ただし、通常のケースでは、オブジェクトの参照カウントの競合のない操作に最適化されています。

問題は、参照カウントがスレッドにとって非常に厄介である場合、Objective-C はどのようにそれを行うのでしょうか?

複数のロックが実行されており、事実上、特定のオブジェクトの保持/解放により、そのオブジェクトのランダム ロックが選択されます (常に同じロックが選択されます)。したがって、オブジェクトごとに 1 つのロックを必要とせずに、ロックの競合を減らします。

(そして、Catfish_man が言ったこと。一部のクラスは独自の参照カウント スキームを実装して、クラス固有のロック プリミティブを使用して、競合を回避したり、特定のニーズに合わせて最適化したりします。)

実装の詳細はより複雑です。

Objectice-C の参照カウントは実際にスレッドに対して技術的に安全ではないのですか?

いいえ -- スレッドに関しては安全です。

実際には、典型的なコードは呼び出しretainを行いrelease、他の操作と比較して非常にまれです。したがって、これらのコード パスに大きなオーバーヘッドがあったとしても、アプリ内の他のすべての操作で償却されます (たとえば、ピクセルを画面にプッシュすると、比較すると非常にコストがかかります)

オブジェクトがスレッド間で共有されている場合 (一般的には悪い考えです)、保持/解放の頻度が低いため、データ アクセスと操作を保護するロックのオーバーヘッドは、保持/解放のオーバーヘッドよりもはるかに大きくなります。


Python の GIL オーバーヘッドに関する限り、通常のインタープリター操作の一部として参照カウントがインクリメントおよびデクリメントされる頻度にもっと関係があると思います。

于 2012-12-18T22:19:26.950 に答える
10

bbum が言ったことに加えて、Cocoa で最も頻繁にスローされるオブジェクトの多くは、通常の参照カウント メカニズムをオーバーライドし、オブジェクトに refcount インラインを格納します。これは、ロックではなくアトミックな加算および減算命令で操作します。

(将来からの編集: Objective-C は、refcount を「isa」ポインターと混合することにより、最新の Apple プラットフォームでこの最適化を自動的に行うようになりました)

于 2012-12-18T22:35:19.800 に答える