꺼내먹는지식 준

GIL, Global Interpreter Lock 간단 정리 본문

CS/OS

GIL, Global Interpreter Lock 간단 정리

알 수 없는 사용자 2022. 1. 28. 15:14

GIL (Global Interpreter Lock) 

GIL 최적화를 연구하는 친구에게 관련 내용을 여러 번 들어도 기본 개념이 없다보니 듣고 흘렸다. 그렇기에 이번 기회에 한번 살펴본다. 

 

대부분의 글은 아래의 블로그들을 참고한 것이므로, 제 글이 가독성이 떨어지면 해당 블로그에서 글을 읽으시기를 추천드립니다. 

참고 글 

https://ssungkang.tistory.com/entry/python-GIL-Global-interpreter-Lock%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

[python] GIL, Global interpreter Lock은 무엇일까?

파이썬에서 멀티스레드를 사용하려고 한다면 GIL이란 단어를 마주치게 됩니다. GIL이 무엇인지 파이썬은 왜 GIL을 가지고 있는지 이번 포스팅을 통해 이해해보도록 합시다. Python으로 멀티스레딩 G

ssungkang.tistory.com

https://blog.seulgi.kim/2015/01/global-interpreter-lock.html

 

Global Interpreter Lock이란?

What is Global Interpreter Lock(a.k.a. GIL)

blog.seulgi.kim

garbage collector

https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189

 

Garbage Collection in Python

Python의 메모리 관리 기법을 알아보자.

medium.com

 

Python 멀티스레딩 

GIL 에 대한 개념을 설명하기 전, 위 블로그에서 진행한 Python 멀티스레딩과 일반적인 경우의 시간 비교를 살펴보자. 

프로세서 : 2.3 GHz 듀얼 코어 Intel Core i5
>> sysctl hw.physicalcpu hw.logicalcpu
hw.physicalcpu: 2
hw.logicalcpu: 4

왜 물리적 cpu와 논리적 cpu의 개수가 다르지? 

하이퍼 스레딩

 

하이퍼 스레딩

CPU에는 코어라는 개념이 존재합니다. 코어는 각종 연산을 하는 CPU의 핵심요소를 말하며 다들 싱글코어, 멀티코어 등의 단어는 익숙하실겁니다. 현재 사용중인 MacOS는 코어를 몇 개 사용할까 확

ssungkang.tistory.com

 

랜덤 생성 배열에서 최대값을 찾는 간단한 연산을 두가지 방법으로 구현해본 후 결과를 비교한 결과이다. 

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)

 

Garbage Collector (Python )

해당 글은 아래의 블로그를 적극 참고하였으므로, 가독성이 떨어지면 해당 블로그를 참고하자. https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189 Garbage Collection in Python Python의..

itforfun.tistory.com

 

: 현대적인 언어에서 필수로 존재하며, 개발자의 생산성을 향상시켜주므로 꼭 알아하는 개념 (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
Comments