여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다. 쉽게 말해서 하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤텍스라고 보면 된다.
GIL의 설계배경을 한마디로 말하자면 메모리 안전성을 보장하기 위함이다.
그림에서 보듯이 우측의 객체는 참조의 수가 2인데, 좌측의 객체는 참조가 없어져 0이 된다. 이 개수가 0에 도달하면 개체가 점유한 메모리가 메모리 가비지 컬렉터에 의해 해제된다.
# reference count
import sys
x = []
print(sys.getrefcount(x)) # x의 참조 카운트를 가져옵니다. (기본적으로 2입니다)
y = x
print(sys.getrefcount(x)) # y가 x를 참조하므로 카운트가 1 증가합니다.
del y # y의 참조를 제거합니다.
print(sys.getrefcount(x)) # 카운트가 다시 2로 감소합니다.
# Garbage Collection 및 순환 참조 예제
import gc
def create_cycle():
x, y = {}, {}
x['y'], y['x'] = y, x
# x와 y는 서로 참초하므로 순환 참조 발생
create_cycle()
gc.collect()
print(gc.garbage)
if not reference_count:
문제는 이 레퍼런스 카운팅 변수가 멀티 스레드 환경에서 두 스레드가 동시에 값을 늘리거나 줄이는 Race Condition이 발생할 수 있다는 것이다. 이러한 상황이 발생하면 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 잘못 해제할 수 있다.
많은 도움이 되었습니다, 감사합니다.