メモリ管理

GILとは?Pythonの並列実行参照カウントメモリ管理コレクション今後について

mimalloc

これまで、PythonではPython専用に開発されたメモリアロケータ pymalloc を利用してきましたが、pymallocはロックを必要とするため、GILのない環境ではあまり適切ではありません。PEP-703では、ロック無しで利用できるmimalloc の採用を提案しています。

ストップ・ザ・ワールド

Pythonでは、定期的にガベージコレクターを実行し、参照カウントだけでは検出できない、循環参照による到達不能オブジェクトを開放しています。ガベージコレクターを実行中に参照カウントが更新されると困るので、現在はガベージコレクター実行中はGILを使って他の処理を停止させています。GILのないPythonでも、同様に他のスレッドでの処理を停止させる必要があります。

このため、Pythonの拡張モジュールでは、GILなしPythonでも、従来と同様に PyEval_RestoreThread() などを利用して、実行可能となるまで待ち合わせる処理が必要となります。

世代別GCの廃止

現在、Pythonはオブジェクトを3世代に分けて管理しています。作られたばかりの若い世代は一般的に開放されやすいので頻繁にガベージコレクターによるチェックを行い、古い世代になるほどチェックの回数を減らしています。

しかし、GILのないPythonではGC実行中は全スレッドが停止してしまうため、GCの実行回数を増やすと全体のパフォーマンスへの影響が大きくなってしまいます。そこで、GILなしのPythonでは世代別の管理は廃止し、ガベージコレクターの実行回数を減らすことを提案しています。

Javaなどでは世代別GCで効率的にメモリ管理を行えることが確認されていますが、Pythonの場合、若い世代のオブジェクトのほとんどは参照カウントによって開放されているため、世代別GCを廃止しても大きなインパクトはないとされています。

Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索