Python reference count
- Python은 각 object들이 reference count를 가지고 있다. reference count는 메모리 관리를 위한 Garbage Collection 방법 중에 하나인데, 특정 object가 참조 될 때마다 reference count를 증가시키고, 참조가 해제되면 이 값을 감소시킨다.
그리고 결국 이 reference count 값이 0이 되면 메모리 할당을 해제하게 된다.
GIL
- 파이썬에서 멀티스레드 프로그래밍을 하는 경우를 생각해보자.
- 위에서 언급한 reference count는 각 object 마다 존재하기 때문에, 여러 스레드가 하나의 object를 사용한다면, reference count를 정확하게 계산하기 위해 Mutex와 같이 lock을 걸어주는 작업이 필요하다. (만약 그렇지 않으면 특정 object의 실제 참조가 0이 되어도 reference count가 남아 있어 메모리 유실이 발생할 수 있다. 또는 반대로 아직 참조되고 있는 object를 할당 제거할 수도 있을 것이다.)
- 모든 object에 개별적인 lock-unlock을 사용한다면, deadlock이 발생할 가능성이 아주 커진다.
→ 따라서, 파이썬 Interpreter가 하나의 스레드에게만 모든 자원을 허가 해주는 방식을 사용하여 각각의 object들에 대한 reference count를 관리할 필요가 없도록 해주는 방식을 사용하는데, 이것이 바로 GIL(Global Interpreter Lock)이다.
그렇다면, 멀티스레딩의 병렬 처리 효과는 없어지는 건가?
→ 사실상 GIL에 의해 멀티스레딩은 멀티태스킹과 같이 이루어진다. 따라서 단순 연산의 경우 스레드의 context switching 영향으로 싱글스레드 보다 더 느리게 작동한다.
그렇다면 GIL을 사용한 Python 멀티스레딩의 장점은?
→ 단순 연산식으로 실험하는 경우를 제외하면 대부분의 경우 I/O작업이 많아 싱글 스레드가 대기 상태에 머물게 되고, 이 때 생기는 overhead는 멀티스레딩의 context switching으로 인한 overhead 보다 크다고 한다.
따라서 프로그램 동작을 잘~ 이해하고 사용하자!
참조
dgkim5360.tistory.com/entry/understanding-the-global-interpreter-lock-of-cpython
'IT study > Notebooks' 카테고리의 다른 글
DB - Index (0) | 2021.05.03 |
---|---|
OS - paging and Segmentation (0) | 2021.04.30 |
DB - Transaction (0) | 2021.04.15 |
OS - Deadlock (0) | 2021.04.11 |
OS - Cache(feat. Page 교체) (0) | 2021.04.08 |