꺼내먹는지식 준
GIL, Global Interpreter Lock 간단 정리 본문
GIL (Global Interpreter Lock)
GIL 최적화를 연구하는 친구에게 관련 내용을 여러 번 들어도 기본 개념이 없다보니 듣고 흘렸다. 그렇기에 이번 기회에 한번 살펴본다.
대부분의 글은 아래의 블로그들을 참고한 것이므로, 제 글이 가독성이 떨어지면 해당 블로그에서 글을 읽으시기를 추천드립니다.
참고 글
https://blog.seulgi.kim/2015/01/global-interpreter-lock.html
garbage collector
https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189
Python 멀티스레딩
GIL 에 대한 개념을 설명하기 전, 위 블로그에서 진행한 Python 멀티스레딩과 일반적인 경우의 시간 비교를 살펴보자.
프로세서 : 2.3 GHz 듀얼 코어 Intel Core i5
>> sysctl hw.physicalcpu hw.logicalcpu
hw.physicalcpu: 2
hw.logicalcpu: 4
왜 물리적 cpu와 논리적 cpu의 개수가 다르지?
랜덤 생성 배열에서 최대값을 찾는 간단한 연산을 두가지 방법으로 구현해본 후 결과를 비교한 결과이다.
1) 하나의 스레드가 두 개의 작업을 연속으로 실행
2) 두 개의 스레드가 각각 하나의 작업을 실행
import random
import threading
import time
def working():
max([random.random() for i in range(500000000)])
# 1 Thread
s_time = time.time()
working()
working()
e_time = time.time()
print(f'{e_time - s_time:.5f}')
# 2 Threads
s_time = time.time()
threads = []
for i in range(2):
threads.append(threading.Thread(target=working))
threads[-1].start()
for t in threads:
t.join()
e_time = time.time()
print(f'{e_time - s_time:.5f}')
당연히 멀티 스레딩이 하나의 스레드보다 성능이 향상될 것이라 기대한다. (둘이 하나보다 낫다.)
그러나 결과는 오히려 멀티스레딩 결과가 더 나쁜 것을 확인 하게 된다.
이를 위하여 GIL 에 대한 설명의 필요성이 등장한다.
GIL(Global Interpreter Lock, here after, GIL)
파이썬 인터프리터가 한 스레드만 하나의 바이트코드를 싱행할 수 있도록 하는 Lock이다. 전역에 lock을 두고, 이 lock을 점유해야만 코드를 실행할 수 있도록 제한한다. 즉 실제로 사용하는 코어는 하나뿐이다.
*바이트 코드
바이트코드(Bytecode)는 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다. 가상머신은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일한다. 어셈블리어에 가까운 형태를 띄고 있으며 어떨 때는 가상머신용 오브젝트 코드까지 바이트코드라고 부르기도 한다.
하나의 스레드에 모든 자원을 허락 한 후 Lock을 걸어 다른 스레드는 실행할 수 없게 막는다.
스레드 3개를 통한 작업
일반적 경우에 각각 스레드가 병렬적으로 일할 것이라 기대하지만, 실제로는 그렇지 않다.
아래의 그림을 보면, python에서 3개의 스레드가 어떻게 동작하는지 설명해 준다.
각각의 스레드는 lock을 얻기 전까지 모두 동작을 멈춘다.
그리고 thread context switch로 인한 비용도 발생하여 오히려 싱글 스레드보다 시간이 오래 걸린다.
그렇다면 왜 GIL 을 쓸까?
GIL 사용 이유
python은 기본적으로 garbage collection과 reference counting을 통해 할당된 메모리를 관리한다.
*Garbage Collection (here after, GC)
: 현대적인 언어에서 필수로 존재하며, 개발자의 생산성을 향상시켜주므로 꼭 알아하는 개념 (feat. C#, JS, Python / C, C++ 도 library 존재)
*reference counting
:
'CS > OS' 카테고리의 다른 글
운영체제란? (0) | 2022.03.05 |
---|---|
Reference Counts (Python) (0) | 2022.01.28 |
Garbage Collector (Python ) (0) | 2022.01.28 |