仕事でGIL(Global Interpreter Lock)についての話がでてきたので、改めてどういうものなのか整理してみました。
GILとは何なのか?
Wikipediaによると、
グローバルインタプリタロック(英: Global Interpreter Lock, GIL)とは、プログラミング言語のインタプリタのスレッドによって保持されるスレッドセーフでないコードを、他のスレッドと共有してしまうことを防ぐための排他 ロックである。
グローバルインタプリタロック – Wikipedia
「スレッドによって保持されるスレッドセーフでないコードを、他のスレッドと共有してしまうこと」というのは一体どういうことなのでしょうか。
まずはスレッドについての理解を深める必要がありそうです。
計算機上で、複数の処理を同時に実行する(並行計算、マルチタスク)場合、処理を分割し、同時に実行する部分を指定する事が出来る、処理の分割の単位として、スレッドとプロセスがある。
スレッド (コンピュータ) – Wikipedia
またまたWikipediaからの引用になるのですが、複数の処理を並列で動かす場合には、処理分割の単位としてスレッドとプロセスがあります。
それぞれの違いやメリット・デメリットについては、参考記事を読んでいただきたいのですが、ここで重要なのは処理分割の単位としてスレッドを選んだ場合には、同一メモリ上で処理が実行されるため、複数のスレッドで同じデータが操作される可能性があるということです。
それが最初にWikipediaから引用した部分の「スレッドによって保持されるスレッドセーフでないコードを、他のスレッドと共有してしまうこと」に繋がります。
そしてその問題を防いでくれる機構がGILというわけです。
RubyにおけるGIL
Rubyのマルチスレッドで動くという触れ込みだが、実際にはGILの影響で完全にスレッド数に比例してパフォーマンスがあがるというわけではようです。
ただRubyのコードで処理時間を取られることは少なく、ほとんどがGILが解除されるI/O待ちに処理時間が取られるので、かなりのケースで並列処理が可能なようです。
まとめ
簡単な説明となりましたが、さらに詳しく理解したい方は参考記事を読んだり、そこに出てくるキーワードでさらに調査していただければと思います。
実際にRubyがどのように動いているかについて読んでいただいた方の理解が深まれば幸いです。