Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
07-20 03:50
관리 메뉴

hamlet-story

PYTHON - [개념] GIL (Global Interpreter Lock) 에 대해서 알아보자 본문

Language/Python

PYTHON - [개념] GIL (Global Interpreter Lock) 에 대해서 알아보자

hamlet-story 2024. 1. 2. 07:00

들어가며

2023 기준 간단하게 Python 3.8 기준 내용을 조사한 내용에 대해서 정리 해볼려고 합니다.

따라서 혹여 잘못된 부분이 있을 경우 답글 남겨주시면 감사하겠습니다.

설명은 아래와 같이 이루어 집니다.

1. GIL (Global Interpreter Lock)

2. Thread-Safe

3. Mutex

4. Reference Counting

GIL (Global Interpreter Lock)

GIL (Global Interpreter Lock) 은 "파이썬(CPython) 인터프리터에 한개의 Thread가 하나의 ByteCode를 실행 할 수 있도록 걸어두는 Lock" 입니다.

먼저 이해를 위해 파이썬(CPython)의 Multi Thread 를 그림으로 확인해 보겠습니다.

보통은 Multi Thread 를 생각하실 때 아마 위의 그림처럼 생각하실것 입니다.

하지만 파이썬(CPython)은 GIL 을 적용함으로써 위의 그림처럼 실행 되도록 만들었습니다.

이로 인해 "Thread Context Switch" 과정에 대한 비용이 발생하여 오히려 시간이 오래 걸리는 문제도 발생하게 되었습니다.

그럼에도 불구하고 파이썬(CPython) 은 GIL 을 적용하였습니다.

왜.... 그런걸까요?

Thread-Safe

 

먼저 "Thread-Safe"란 여러개의 Thread 가 공유된 자원(데이터)에 엑세스 하고 수정하는 순서에 따라 데이터가 올바른 값 또는 잘못된 값으로 설정되는 상황에 데이터를 받지 않도록 방지하는 것입니다.

다르게 말하면 공유된 자원에 동시에 접근하면서 Read/Write 과정을 진행한다면 이는 "Thread-Safe" 한 상황은 아니라고 볼 수 있습니다.

이처럼 여러 Thread 가 공유된 자원에 동시에 접근하면서 발생하는 문제를 "race condition" 이라 합니다.

따라서 이를 해결하기 위해 파이썬(CPython)은 "Mutex"을 도입하였습니다.

Mutex

"Mutex" 는 공유 자원에 하나의 Thread 만 진입하며, 작업을 처리할 수 있도록 만들어진 "Lock" 개념 입니다.

 

이 개념을 통해서 앞서 말씀드렸던 공유 자원에 동시에 접근할 때 발생 할 수 있는 문제점인 "Race Condition" 을 해결하는데 도움을 얻을 수 있었습니다.

이제 본론으로 넘어가서, 파이썬(CPython) 에서 GIL을 적용하게 된 이유는 파이썬(CPython)의 메모리 관리 방식 때문입니다.

Reference Counting

파이썬(CPython)의 "Reference Counting"을 활용하여 메모리를 관리합니다.

위의 그림을 확인하면 알 수 있듯이 각각의 Object 의 값이 같을 경우 동일한 메모리 ID 를 참조하여 관리하고 있습니다.

그렇기 때문에 참조하고 있는 Object 가 한개 사라지게 될 경우 "Reference Count" 가 -1 씩 줄어들게 됩니다.

그렇게 -1씩 계속해서 줄어가다가 참조하는 "Reference Count"의 개수가 0 이 될 경우 "Garbage Collector" 관리할 수 있게 되는 형식 입니다.

그리고 이렇게 참조하는 방식은 Thread 가 동시에 실행될 때 생길 수 있는 문제 "Race Condition" 문제가 발생 할 수가 있습니다.

결론

파이썬(CPython, Python)은 이와 같은 구조적 문제로 인하여 이를 해결하기 위한 방안을 찾아내야 했으며, 결국 "Mutex"로 모든 "Reference"에 대해 보호하지 않고 파이썬(CPython, Python)인터프리터 자체를 하나의 Thread만 사용할 수 있도록 Global 하게 잠궈버리는 GIL (Global Interpreter Lock) 정책을 채택하게 된것입니다.

이렇게 알아보았을 때, 먼저 파이썬(CPython, Python)을 사용하는 입장에서, MultiThread 로 접근을 하는 것보다는 MultiProcessing 로 접근을 해야겠다는 생각이 들었습니다.

그리고... 애매한 점으로 2023년도 8월 9일날 나온 내용 중 (파이썬에서 GIL 삭제된다⋯“병렬 처리의 혁신적 진전”)

이런 내용이 나왔습니다.

그래서 이것도 고민을 많이 해야겠습니다.

이미 개발하고 있는 파이썬 버전은 3.8 이므로, 차라리 이걸로 고정해서 계속 개발을 하다가 몇년 정도 상황을 지켜보면서 프로그램 개발 성능도 차차 올리는 형식으로 접근해야겠다는 생각도 들었습니다.

 

참조