Python의 GIL(Global Interpreter Lock)
- 파이썬 인터프리터가 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 제어하는 메커니즘
- 멀티스레드 환경에서 동시에 여러 개의 CPU 코어를 활용하는 것을 제한하는데 사용
GIL은 다음과 같은 문제를 발생시킬 수 있다
- 성능 제한:GIL로 인해 파이썬 스레드는 하나의 CPU 코어에서만 실행되므로// 멀티코어 시스템에서 CPU 사용률을 최적화할 수 없다(=멀티코어 활용의 제한=멀티코어에서 병렬처리가 제한됨). → (특히)CPU 집약적인 작업을 수행하는 다중 스레드 응용 프로그램의 성능이 크게 저하될 수 있다.
- 스레드 간 경쟁: GIL로 인해 파이썬 스레드는 CPU 자원에 대한 경쟁을 경험하게 된다. 이로 인해 스레드 간의 경쟁이 발생할 수 있고, 이는 동기화 오버헤드 및 스레드 전환 비용을 증가시킬 수 있다.
- IO 바운드 작업의 성능 하락: CPU 바운드 작업이 아닌 IO 바운드 작업의 경우 GIL의 영향이 적을 수 있다. CPU 바운드 작업에 비해 IO 바운드 작업의 성능 하락은 더 미미하다.
이러한 문제로 인해 GIL은 파이썬의 멀티스레딩 성능을 제한하고, 파이썬이 CPU 바운드 작업에 대한 최적의 선택이 아닐 수 있음을 의미한다.
따라서 CPU 집약적인 작업을 수행하는 프로그램이나 멀티코어 시스템에서 최대한의 성능을 내고자 하는 경우, 파이썬 외부에서 멀티스레딩이나 멀티프로세스를 사용하는 것이 좋다.
파이썬의 메모리 관리 방식
파이썬은 기본적으로 메모리 관리를 개발자 대신 수행해서, 개발자가 직접 메모리 할당과 해제에 신경쓰지 않아도 되게 설계된 언어이다.
- 파이썬은 객체의 참조 횟수를 추적(카운팅)해서, 객체의 참조 횟수가 0이 되면 가비지 컬렉터를 이용해서 (해당 객체의)메모리를 해제함
- 또 파이썬은 객체들 간의 종속성을 추적하여, 객체 간의 순환 참조가 발생하는 경우에도 메모리 누수를 방지함
- → 가비지 컬렉터가 해제 or 약한 참조(import weakref모듈) or 명시적인 참조 해제
- 순환참조: 2개 이상의 객체가 서로를 참조하는 상황
- 객체가 더 이상 사용되지 않아도 참조 계수 카운팅이 0이 되지 않아서 메모리 누수 발생가능
'TIL' 카테고리의 다른 글
[TIL 2024. 04. 29] 모의면접 회고록 (0) | 2024.04.30 |
---|---|
[TIL 2024. 04. 26] 파이썬이 느린 이유 | 데코레이터 | 파이썬 메모리 관리 (0) | 2024.04.29 |
[TIL 2024. 04. 24] 컴파일러와 인터프리터 | 정적타입과 동적타입 (0) | 2024.04.24 |
[TIL 2024. 04. 23] REST | RESTful API | JSON과 Dict의 차이 (0) | 2024.04.24 |
[TIL 2024. 04. 22] 개념정리 (0) | 2024.04.22 |