GIL(Global Interpreter Lock)
GIL(Global Interpreter Lock)이란?
GIL(Global Interpreter Lock, 전역 인터프리터 락)이란, 인터프리터가 소스 코드를 실행함에 있어서 스레드 동기화를 목적으로 일순간에 목표 스레드의 작업만을 수행하도록 이를 제외한 나머지 스레드들의 작업을 '락(Lock)'을 통해 중단시키는 행위를 말한다.
GIL 배경
Python 참조 구현체 중 가장 많이 사용되는 것은 C 기반의 'CPython'이다. 당시 C에 포함되어있던 기존 라이브러리들은 thread safety(스레드 안전성, 병렬 작업에서의 무결성을 보장하는 속성)이 보장되지 못하였고, 이를 해결하기 위한 방법으로 채택된 것이 GIL이었다.
GIL 채택 이유(GIL 장점)
그렇다면 "GIL이 아닌 다른 방식으로 제어할 수는 없었나"하는 의문이 들 수 있다. GIL의 장점은 '호환성'과 '구현 용이성'이다.
GIL방식의 제어는 기존 C 라이브러리들을 적용함에 있어서 스레드 안전성을 보장하지 못하는 부분을 보완할 수 있는 방법이어서 C와의 호환성이 좋았다. 또한, GIL은 전역변수를 기반으로 모든 스레드를 일괄적으로 통제한다는 부분에서 개별적으로 스레드들을 제어하는 방식에 비해 구현이 쉽고 메모리 오버헤드가 적다는 장점이 있었다.
GIL 수행방식, 과연 최적일까?(GIL 단점)
GIL은 상기한 이유들에 근거해 파이썬에서 다수의 스레드 간 병행성을 제어하기위한 방법으로서 채택되었지만 이것 또한, 완전무결한 방법은 아니다.
다음은 GIL과 일반 멀티프로그래밍 방식의 스레드 작업수행 소요시간을 비교한 그림이다.
GIL(빨간색)은 싱글스레드 수행방식처럼 작업을 수행하는 스레드들이 정해지면 인터프리터 자원을 독점하는 방식으로 수행된다. 멀티스레딩 작업임에도 불구하고 작업 중인 특정 스레드 때문에 다른 모든 스레드들이 멈춰야 하는 특성은 싱글 스레드 작업방식과 차이가 없기 때문에 멀티프로그래밍 특유의 효율성이 사라져 버리게 되었다.
이를 우회하여, 독자적 인터프리터 인스턴스를 가질 수 있는 멀티프로세싱을 채택한다고 하여도 context switching(컨텍스트 스위칭)으로 인한 타임 오버헤드가 발생하기 때문에 여전히 비효율적인 부분이 남아있다고 할 수 있다.