GIL을 이해하기 전에 알아야 할 개념들:
쓰레드(Thread)와 프로세스(Process), 멀티 스레딩
ARC(Automatic Reference Counting)
GIL이란?
파이썬은 하나의 프로세스에서 한번에 딱 하나의 스레드만이 실행되도록 제한을 걸어둔다.
이를 GIL(Global Interpreter Lock)이라고 부른다.
주의해야 할 점은, GIL은 여러 스레드의 생성 자체를 막는 게 아니라는 점이다.
GIL은 어디까지나 여러 스레드가 동시에(Parallel) 실행되는 것을 방지하는 것 뿐이기 때문에,
I/O 가 존재하는 프로그램에서는 설사 파이썬으로 작성되었다고 하더라도 여전히 스레딩을 통한 성능 향상을 기대할 수 있다.
왜 GIL이 존재하는가?
GIL의 존재이유는 여러가지가 있지만, 가장 큰 이유는
파이썬의 Reference Count 시스템 때문이다.
파이썬의 가장 기본적인 인터프리터 CPython은 메모리 자동 관리 시 두 가지 방법을 사용한다.
하나는 Generational Garbage Collection이고, 또 하나는 Reference Count이다.
문제가 되는 건 두 번째 Reference Count 인데,
만약 파이썬에서 멀티스레딩이 허용된다면 Reference Count에 문제가 발생할 가능성이 생긴다. 스레드간에는 메모리 공유가 되기 때문에, 한 스레드에서 Reference Counting을 하는 도중에 다른 스레드에서 메모리를 해제하거나 할당할 수 있기 때문이다.
이를 방지하기 위해 파이썬은 GIL을 사용한다.