
グローバルインタプリタロック( GIL ) は、コンピュータ言語インタプリタで使用されるメカニズムで、スレッドの実行を同期し、一度に1 つのネイティブ スレッド (プロセスごと) のみが基本的な操作 (メモリ割り当てや参照カウントなど) を実行できるようにします。 [ 1 ]一般的に、GIL を使用するインタプリタは、マルチコア プロセッサで実行されていても、一度に 1 つのスレッドしか実行できないと認識しますが、一部の実装では、CPU 負荷の高いコードが GIL を解放し、複数のスレッドが複数のコアを使用できるようにしています。GIL を持つ人気のあるインタプリタには、CPythonやRuby MRIなどがあります。
グローバルインタプリタロック(GIL)は、プログラミング言語のインタプリタスレッドが保持する相互排他ロックであり、スレッドセーフでないコードを他のスレッドと共有することを回避するために使用されます。GIL を使用する実装では、各インタプリタプロセスごとに必ず 1 つの GIL が存在します。
GILを備えた実装上で動作するアプリケーションは、各プロセスが独自のインタプリタを持ち、さらに独自のGILを持つため、別々のプロセスを使用して完全な並列処理を実現するように設計できます。そうでない場合、GILは並列処理の大きな障壁となる可能性があります。
グローバルなインタープリタロックを採用する理由には、以下のようなものがあります。
GILを回避する方法の一つとして、スレッドごとに個別のインタプリタを作成する方法がありますが、ほとんどの言語ではコストが高すぎます。
言語でグローバル インタプリタ ロックを使用すると、複数のスレッドを持つ単一のインタプリタ プロセスの並行処理によって達成できる並列処理の量が効果的に制限されます。プロセスがほぼ完全に解釈コードで構成され、長時間ブロックするインタプリタ外部の呼び出しを行わない場合(処理中にそのスレッドが GIL を解放できるようにするため)、マルチ プロセッサマシンでプロセスを実行しても速度はほとんど向上しない可能性があります。CPU にバウンドするスレッドとのシグナリングにより、シングル プロセッサでも大幅な速度低下を引き起こす可能性があります。[ 2 ] さらに深刻なことに、単一のネイティブ スレッドがブロッキング OS プロセス (ディスク アクセスなど) を呼び出すと、他のアプリケーション スレッドが待機している場合でも、プロセス全体がブロックされます。
グローバルなインタプリタロックを実装している言語実装には、 Pythonの最も広く使用されている実装であるCPython [ 3 ] [ 4 ]や、Rubyのリファレンス実装であるRuby MRI (ここではグローバル VM ロックと呼ばれています) などがあります。
これらの言語のJVMベースの同等物 ( JythonとJRuby ) はグローバル インタプリタ ロックを使用しません。IronPythonとIronRuby はMicrosoftのDynamic Language Runtime上に実装されており、GIL の使用も回避しています。[ 5 ]
GILを持たないインタプリタ型言語の例として、ベンチマークツールHammerDBで使用されているTclが挙げられる。[ 6 ]
Python のサンプルコードです。各命令呼び出しの間でロックが取得および解放される様子に注目してください。これは、threadingモジュールのLockオブジェクトを使用しています。[ 7 ]
スレッドからロックをインポートINSTRUCTION_TABLE = { ... }def execute ( bytecode : list ) -> None : """バイトコードを実行します。""" lock = Lock () for ( opcode , args ) in bytecode : lock . acquire () INSTRUCTION_TABLE [ opcode ]( args ) lock . release ()フリースレッドビルド(Python 3.13以降)
Python 3.13 では、PEP 703 – CPython でグローバル インタプリタ ロックをオプションにするの一部として、実験的な「フリー スレッド」ビルドの CPython が導入されました。このビルドにより、開発者はグローバル インタプリタ ロック (GIL) なしで Python をコンパイルできるため、複数の CPU コア間で Python バイトコードの真の並列実行が可能になります。この機能はまだ実験段階ですが、将来の Python リリースで並行処理の改善に向けた大きな一歩となります。[ 8 ]
GIL は、Python のすべてのクリティカル セクションを保護するために使用されるロックです。したがって、複数の CPU があっても、一度に「Python らしい」処理を実行できるスレッドは 1 つだけです。
IronPythonにはGILがなく、マルチスレッドコードはマルチコアプロセッサを使用できます。
が TCL で記述されているのは、TCL が持つ独自のスレッド機能のためであることを最初に理解しておくことが重要です。