공부기록

GIL (Global Interpreter Lock) 본문

Programming/python

GIL (Global Interpreter Lock)

코타쿠 2021. 5. 16. 18:59
  • GIL
    인터프리터를 cpython을 사용하고 다중 쓰레드 프로그래밍을 할 경우, 한 쓰레드 만이 인터프리터를 사용할 수 있는 상황, 즉 인터프리터에 mutex가 걸려있는 것을 말한다.

  • 왜 일어나는가
    cpython은 gc를 위해 reference counting을 사용한다. 문제는, reference count를 하는 객체를 사용하는 쓰레드들이 서로 상호배제 되어야만 메모리 누수와 같은 문제가 생기지 않는다는 것이다.이 때문에, cpython은 interpreter 자체에 락을 걸어 문제를 해결하게 되었다.

  • 각 객체가 reference count 변수를 가지기에 객체마다 스스로를 위한 mutex를 가지는 것을 생각해 볼 수 있다. 하지만 이 경우, 많은 mutex에 의해 성능이 저하되고, 여러 개의 lock이 걸리는 현상이 deadlock을 불러 일으킬 수 있는 가능성이 있다.

  • 해결방안
    멀티 프로세스 환경의 경우, 멀티 프로세스가 스레드 보다 무겁기에 성능이 더 저하될 가능성이 존재한다.
    해결방안은 아니지만, 먼저 그냥 싱글 스레드 환경을 구성할 수 있다. 이 경우 이슈가 일어나지 않기 때문이다.
    다른 인터프리터 구현체를 쓰면 된다. Jython, PyPy 등 많은 다른 구현체들은 GIL 이슈가 없다.

  • 참고자료
    https://realpython.com/python-gil/
    https://docs.oracle.com/cd/E19120-01/open.solaris/816-5137/sync-12/index.html
    https://dc7303.github.io/python/2019/08/06/python-memory/
    https://dgkim5360.tistory.com/entry/understanding-the-global-interpreter-lock-of-cpython]