Global interpreter lock


Global interpreter lock (GIL) atau dalam bahasa Indonesia disebut sebagai Kunci Penerjemah Global merupakan mekanisme yang digunakan dalam bahasa komputer berbasis penerjemahan (interpreter) untuk menyinkronisasikan eksekusi serangkaian utas (thread) sehingga hanya satu utas yang dieksekusi dalam satu waktu. Keberadaan GIL yang membatasi eksekusi yang dilakukan program penerjemah hanya satu utas dalam satu waktu ini juga berlaku saat aplikasi dijalankan dalam sistem berbasis multi-prosesor, keberadaan ini menjadikan aplikasi penerjemah tidak dapat memanfaatkan secara penuh kapabilitas prosesor yang ada. Beberapa program penerjemah populer yang memiliki GIL adalah Python[1][2] dan Ruby.

Namun dalam hal ini, beberapa implementasi berbasis JVM (Jython, JRuby) ataupun CLR (IronPython, IronRuby) dalam hal ini tidak memiliki implementasi GIL tersebut, meski dalam hal ini hal tersebut berarti implementasinya tidak akan bisa memanfaatkan sejumlah besar pustaka yang dimiliki implementasi bahasa induk, namun pada umumnya hal tersebut tergantikan dengan kekayaan pustaka yang dimiliki java ataupun .NET.

Latar belakang teknis

GIL merupakan kunci ataupun mutex yang dimiliki oleh utas (thread) bahasa pemrograman berbasis penerjemahan yang dimaksudkan untuk menghindari akses kode ilegal atas data yang berasal dari utas lainnya. Dalam implementasinya, sebuah program penerjemah memiliki satu GIL untuk setiap satu sesi penerjemahan.

Aplikasi yang berjalan dalam implementasi penerjemahan yang memiliki GIL sebaiknya memanfaatkan mekanisme process (komputasi) untuk memungkinkan pemanfaatan kapabilitas multi prosesor secara penuh, dan tidak melalui pemanfaatan utas (thread). Dengan demikian, setiap proses akan memiliki satu sesi penerjemahan dan satu GIL yang tidak terkait antara satu dengan lainnya, tidak pula berbagi data antara masing-masing proses-nya. Apabila dikehendaki mekanisme berbagi data global, maka hal tersebut bisa dilakukan dengan memanfaatkan aplikasi caching external seperti memcached, redis atau lainnya.

Keuntungan dan kerugian

Penggunaan GIL dalam bahasa pemrograman secara efektif membatasi pemanfaatan paralelisasi komputasi dalam satu sesi penerjemahan yang memanfaatkan beberapa utas/multi-utas. Jika sebuah program sepenuhnya terdiri atas kode yang ditulis dalam bahasa penerjemahan dan tidak melakukan pemanggilan fungsi ataupun prosedur di luar program penerjemah dalam waktu yang lama, akan sangat kecil kemungkinan peningkatan unjuk kerja yang bisa diraih dalam mekanisme seperti ini. Dan pula, disebabkan mekanisme sinyalisasi switching eksekusi yang berbasis jumlah p-code, performa eksekusi akan menurun secara drastis apabila dijalankan pada mesin yang memanfaatkan multi-prosesor ataupun multi-core, lebih rendah bila dibandingkan unjuk kerje eksekusi pada mesin berbasis single prosesor/single-core.[3]

Beberapa alasan pemanfaatan kunci ini adalah:

  • Peningkatan unjuk kerja untuk eksekusi aplikasi yang hanya memanfaatkan satu utas (single thread) karena tidak memerlukan mekanisme penguncian GIL secara terpisah.
  • Mudah diintegrasikan dengan bahasa lain, serta pustaka-pustaka yang umumnya belum dirancang untuk memanfaatkan utas
  • Mudah dalam pengimplementasian (Menulis program penerjemah yang memanfaatkan GIL jauh lebih sederhana dibandingkan program yang tidak memanfaatkan GIL, ataupun memanfaatkan penguncian tersistematis)

Untuk mekanisme sistem yang memanfaatkan multi-utas, sangat disarankan untuk melakukan pemanggilan eksternal dengan cara membuat modul-modul yang bersifat kritis dalam bahasa aras bawah seperti C, Bahasa perakit, atau lainnya. Hal ini disebabkan pemanggilan aras bawah memiliki mekanisme untuk melepaskan kunci GIL tersebut sehingga penerjemah bisa memanfaatkannya untuk mengeksekusi task yang lain.

Pada rilis-rilis terbaru, metode yang lebih baik dalam implementasi switching eksekusi telah diperbaiki, tidak lagi menggunakan jumlah p-code, melainkan berbasis waktu (micro-timer) sehingga memungkinkan eksekusi dalam mesin berbasis multi-prosesor secara lebih baik, meski dalam hal ini tidak dimaksukan untuk menghilangkan keberadaan GIL tersebut sama sekali.[4]

Rujukan

  1. ^ Shannon -jj Behrens (2008-02-03). "Concurrency and Python". Dr. Dobb's Journal. hlm. 2. Diarsipkan dari versi asli tanggal 2008-06-26. Diakses tanggal 2008-07-12. The GIL is a lock that is used to protect all the critical sections in Python. Hence, even if you have multiple CPUs, only one thread may be doing "pythony" things at a time. 
  2. ^ "Python/C API Reference Manual: Thread State and the Global Interpreter Lock". Diarsipkan dari versi asli tanggal 2008-09-14. Diakses tanggal 2015-10-06. 
  3. ^ David Beazley (2009-06-11). "Inside the Python GIL" (PDF). Chicago: Chicago Python User Group. Diarsipkan (PDF) dari versi asli tanggal 2010-12-24. Diakses tanggal 2009-10-07.  Hapus pranala luar di parameter |publisher= (bantuan)
  4. ^ David Beazley. "Inside the new GIL" (PDF). Chicago Python User Group. Diarsipkan (PDF) dari versi asli tanggal 2023-02-08. Diakses tanggal 2015-10-06.  Hapus pranala luar di parameter |publisher= (bantuan)