이 글은 이전 글인 “파이썬의 숨겨진 심장박동, 레퍼런스 카운팅”을 보고오시면 더 쉽게 이해하실 수 있습니다.
Global Interpreter Lock (GIL)의 역할
Global Interpreter Lock(GIL)은 파이썬 객체에 대한 접근을 보호하는 뮤텍스로, 여러 스레드가 동시에 파이썬 바이트코드를 실행하는 것을 방지합니다. GIL은 경쟁 상태를 방지하고 스레드 안전성을 보장합니다.
위의 글의 내용은 파이썬 위키에서 발췌한 내용입니다.
이는 파이썬 멀티 스레드 환경에서는 동일한 메모리 공간(힙 메모리)를 통해 자원을 공유하기 때문에 각각의 스레드가 이러한 자원을 동시에 사용하고자 할 때 경쟁 상태(Race Condition)를 예방하고 스레드의 안정성을 보장하기 위해 고안된 파이썬 만의 기법입니다.
파이썬에서 GIL이 하는 역할
파이썬은 멀티 프로세서 시스템이 흔치 않고 멀티코어 프로세서는 아예 존재하지도 않았던 시절에 만들어진 언어이므로 이 참조 카운트 메커니즘에는 스레드 안전성이 없다. 대신 파이썬은 객체에 대해 한 번에 하나의 스레드만 허용하는 방법으로 스레드 안전성을 확보한다.
파이썬에서는 Garbage Collection(GC)은 자동적으로 관리 되며, 이는 Reference Count방식으로 진행됩니다. 하지만, 이 방식은 여러 스레드가 동시에 객체의 참조 카운트를 수정할 경우 동시성 문제가 발생할 수 있습니다. GIL은 이러한 문제를 방지하기 위해 한 시점에 단 하나의 스레드만이 파이썬 객체에 접근하도록 제한함으로써, 참조 카운트의 안전한 수정을 보장합니다.
그렇다면, 파이썬만 왜 GIL을 쓰는거지? 라고 할때 이는 파이썬의 설계방식과 연관이 되어 있다고 합니다. 파이썬은 가비지 컬렉터로 주로 레퍼런스 카운팅 방식을 사용하기 때문에 만약 여러 스레드가 동시에 같은 객체에 대해 참조 수를 수정한다면, 참조 수 계산이 잘못될 수 있어 메모리 관리에 심각한 문제가 발생할 수 있습니다.
Thread vs Process
파이썬에서 병렬 처리를 구현하는 방식은 주로 두 가지입니다:
- 멀티 쓰레드
- 파이썬의 스레드는 가볍고 시스템 리소스를 적게 사용합니다. 하지만, GIL(Global Interpreter Lock) 때문에 모든 네이티브 파이썬 쓰레드가 실질적으로 CPU 연산을 동시에 수행할 수 없습니다. 이는 CPU 바운드 작업에서는 병목 현상을 초래하지만, I/O 바운드 작업에서는 GIL이 자주 해제되기 때문에 효율적으로 사용할 수 있습니다. 즉, 파일 읽기/쓰기나 네트워크 요청과 같이 I/O 대기 시간이 긴 작업에 적합합니다.
- 멀티 프로세스
- 각 프로세스는 독립된 메모리 공간을 가지므로, 프로세스 간에는 GIL의 영향을 받지 않습니다. 따라서, 각 프로세스가 CPU를 병렬로 사용할 수 있어 CPU 바운드 작업에 매우 적합합니다. 하지만 프로세스는 스레드보다 무겁고 메모리 사용량이 더 많습니다. 멀티 프로세스 방식은 또한 분산 처리 시스템을 구현할 때도 유용하며, 이를 통해 여러 머신에 걸쳐 작업을 분산시킬 수 있습니다.
no-GIL
- 샘그로스라는 양반이 GIL을 제거하기 위해서 PEP 703에서 제안을 함
- GIL 제거 시도를 하려 했지만 멀티 스레드의 속도는 향상, 싱글 스레드는 성능 저하가 있다.
- 하지만, 대다수의 파이썬 프로그램은 싱글 스레드이므로 손해가 크다.
- 따라서 싱글 프로그램 속도를 저하시키지 않는다는 전제하에 GIL 제거를 진행하기로 함
no-GIL에 대한 내용은 분량이 많을 것으로 예상되어 다음 번에 다시 작성하도록 하겠습니다.
참조
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/blob/main/Python/README.md
https://it-eldorado.tistory.com/160
https://www.itworld.co.kr/news/302737#csidx4442e5092543c4698ff6fbd1e6da85b
'Language > Python' 카테고리의 다른 글
[Python]파이썬의 숨겨진 심장박동, 레퍼런스 카운팅 (0) | 2024.04.15 |
---|---|
[Python]리스트의 메모리 할당 (0) | 2023.03.27 |
[Python]파이썬은 모든것이 객체? (0) | 2022.08.22 |
[Python] 함수 인자 전달 방식 - Call by assignment (0) | 2022.08.22 |