C파이썬에서 GIL이 차차 사라질 것이라는 뉴스를 접하게 되었다
생소한 내용에 이해하기 위해 공부하며 정리해보았다
파이썬에서 GIL 삭제된다⋯“병렬 처리의 혁신적 진전”
파이썬에서 GIL 삭제된다⋯“병렬 처리의 혁신적 진전”
많은 논란 끝에 파이썬 운영 위원회(Python Steering Council)가 “C파이썬에서 전역 인터프리터 잠금(Global Interpr
www.itworld.co.kr
GIL은 무엇인가
python은 멀티프로세스, 멀티 스레드 등의 개념이 없던 시절 만들어진 싱글 스레드 언어입니다. 시대에 따른 컴퓨터와 개발 환경의 발전에 따라 python을 사용한 멀티 프로세스 라이브러리가 만들어졌습니다. 이러한 라이브러리들을 메모리에서 안정성 있게 실행하기위해 GIL의 개념이 생겼습니다.
GIL이란 Global Interpreter Lock의 약자로 여러 개의 스레드가 동작할 경우 파이썬 바이트코드를 특정 시점에 한 스레드만 사용할 수 있게 락을 거는 것을 말합니다.
GIL은 메모리 안정성을 보장하기 위해 설계되었습니다.
멀티 스레드로 하나의 객체를 사용하게되는 경우, reference counting 변수가 멀티 스레드 환경에서 두 스레드가 동시에 값을 늘리거나 줄이는 Race Condition이 발생할 수 있습니다. 이 때문에 메모리 누수 혹은 참조가 남아있음에도 잘못된 메모리 해제가 일어날 수 있습니다.하나의 스레드에 모든 자원을 허락하고 그 후에는 Lock을 걸어 다른 스레드는 실행할 수 없게 막아버리는 동작, GIL을 함으로써 reference count 동기화 문제를 해결하는 것입니다.
CPU 환경의 프로그램에 대해서 GIL은 락을 걸어, 오히려 성능 병목 현상을 만들어냅니다. 반면에, I/O 한 프로그램에서는 성능이 좋아짐을 확인할 수 있습니다.
*** 프로그램의 두가지 종류 cpu i/o
- I/O Bound Program
I/O bound 프로그램은 말그대로 입출력을 많이 하는 프로그램
파일 시스템에 데이터를 읽어오고, 쓰는 과정이 잦은 프로그램들은 I/O bound하다고 표현할 수 있다 - CPU Bound Program
CPU bound 프로그램은 CPU 연산량이 많은 프로그램을 의미
보통 같은 메모리에 접근하는 스레드들이 락에 걸리고, 연산을 많이하는 프로그램의 경우 이 경우에 대부분 해당
이렇게 작성한 프로그램이 어떤 종류의 집중도를 가지고 있느냐에 따라서 멀티스레드가 성능을 높이기도, 낮추기도 합니다.
문제는 이러한 CPU bound 프로그램들이 멀티코어로 스레드를 수행할 때 성능에서의 이득을 볼 수 없다는 것입니다.
정리하자면,
python 환경에서 GIL은 메모리 안전성을 보장하기 위한 제약이 과하다고 보기도 하지만
이득을 보는 부분이 분명히 있다고 할 수 있습니다.
왜 파이썬에서 GIL을 없애려고 하는가
GIL을 개선하려는 노력이 꾸준히 있어왔지만 멀티 스레드에 대한 성능 병목현상 미 해결, 멀티 스레드 프로그램 성능 향상 대신 싱글 스레드 성능의 저하(파이썬의 어플리케이션의 대다수가 싱글 스레드여서 매우 큰 손해임) 등의 문제가 생겼기 때문입니다.
따라서 싱글 스레드 프로그램의 속도를 저하시키지 않으면서 제거할 수 있어야 한다는 전제 조건을 두고 GIL을 제거하여 파이썬 언어를 병렬 처리와 동시성이 지원되는 멀티코어 언어로 발전시키기로 한 것입니다.
다만, 당장 no-GIL환경을 구성하자는 것이 아니라 “C파이썬에서 전역 인터프리터 잠금(Global Interpreter Lock)을 선택 사항으로 두자”고 의견을 모아 기간을 두고 단계적으로 no-GIL을 지향하기로 협의되었습니다.
gc : garbage collection, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능
https://ko.wikipedia.org/wiki/쓰레기수집(컴퓨터_과학)
https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189
참조 횟수 계산 (reference counting) 메모리 관리, gc의 한 방식
파이썬에서 생성된 객체가 객체를 가리키는 참조의 수를 추적하는 참조 카운트 변수를 가진다는 것
https://ko.wikipedia.org/wiki/참조횟수계산_방식
참고 및 사진 출처 :
https://ssungkang.tistory.com/entry/python-GIL-Global-interpreter-Lock은-무엇일까
'CS' 카테고리의 다른 글
[기술면접] 자료구조 | 시간복잡도와 공간복잡도 (0) | 2023.09.06 |
---|