[python] GIL( Global Interpreter Lock)

김진만·2023년 8월 16일
0

GIL이란?

여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다. 쉽게 말해서 하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤텍스라고 보면 된다.

For The MEMORY !

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이 발생할 수 있다는 것이다. 이러한 상황이 발생하면 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 잘못 해제할 수 있다.
profile
충분한 전기와 컴퓨터 한 대와 내 이 몸만 남아 있다면 지구를 재건할 수 있습니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

많은 도움이 되었습니다, 감사합니다.

답글 달기