반응형

파이썬 동시성/비동기 프로그래밍 2. Asyncio

 

[python]파이썬 동시성/비동기 프로그래밍 2. Asyncio

[python]파이썬 동시성/비동기 프로그래밍 1. 코루틴 [python]파이썬 동시성/비동기 프로그래밍 1. 코루틴 코루틴 3.5 버전부터 지원(async/await 문법은 3.7 이상부터) 코루틴을 사용하면 CPU와 리소스 낭��

leo-bb.tistory.com

GIL(Global Interpreter Lock)

I. 파이썬의 구동방식

  • 파이썬은 대표적인 인터프리터 언어입니다. 때문에 파이썬 실행 시 인터프리터가 메모리에 할당되고, 코드를 컴퓨터의 언어로 해석하여 CPU에 전달하면 CPU가 이를 받아 실행하는 순서로 진행됩니다.(마치 자바의 JVM 같은 것으로 파이썬이 "느린 언어"라고 불리는 이유 )
  • 파이썬은 메모리 관리를 위해 객체의 생성/소멸을 reference count롤 통해 판단. 즉 현재 객체가 어디에 얼마나 참조(reference)되었는가를 판단하여 메모리 사용량을 결정

II. GIL의 존재

스크린샷 2020-07-19 오후 2 38 56

파이썬 스크립트를 실행시켜보면 다수의 스레드가 생성되더라도 싱글코어에서 시분할되어 실행되는 것을 알 수 있습니다. 즉 "항상 하나의 스레드만 처리하고 있습니다" 이는 파이썬 인터프리터에 mutex lock을 걸어 특정 시점에는 단 1개의 스레드만 처리하도록 잠겨있기 때문입니다.

이 때문에 파이썬에서 멀티스레드 작업을 수행하면 단일 스레드 성능보다 떨어지는 경우가 발생합니다. 이를 해결하기 위해 다중 프로세스로 구성하는 해결책이 존재하지만 OS 입장에서 싱글코어를 사용하는 것과 멀티코어를 사용하는 것은 구성 난이도와 비용이 만만치 않기 때문에 GIL은 파이썬의 약점의 원인 중 하나로 지목되고 있습니다.

1. Context swtiching

OS는 request를 받으면 해당 요청을 수행하기 위해 해당 프로세스의 context를 확인하고 저장해두었다가 CPU에 전달하여 수행하도록 합니다. 이때 I/O request, interrupt, fork child proccess 등의 작업 요청이 들어온다면 우선순위에 의해 현재 작업을 중단하고 요청을 수행하게 되는데 이러한 전환 과정을 context swtiching이라 합니다.
이 전환 과정에서 CPU는 idle 하기 때문에 context switching 비용이 클수록, 많을수록 전체 프로그램의 성능 저하를 유발합니다. 파이썬의 모든 스크립트는 GIL을 획득한 경우에 실행되기 때문에 여기에 context swtiching 비용까지 더해져 다중 스레드 성능이 낮은 것입니다.

 

스크린샷 2020-07-19 오후 2 40 11

 

III. GIL의 목적

1. 시스템 보호

reference count를 통해 메모리를 관리하는 파이썬 언어 특성상 Race condition(다수 스레드가 특정 값에 동시에 점근)이 발생하는 경우 객체의 메모리 누수 또는 완전 부하(release)가 발생할 수 있으며 이는 버그 또는 시스템 손상을 유발하게 됩니다.

2. 성능 향상

GIL이 아닌 각 객체에 lock을 걸어 보호하는 방식은 deadlock을 회피하기 어렵고 객체의 호출/생성/소멸마다 lock 정보를 계속 업데이트해야 하기 때문에 객체 수가 증가할수록 성능이 감소하게 됩니다.

 

 

* 아래는 파이썬 언어 개발자인 Guido van van Rossum 이 GIL을 지적하는 문서에 대한 답문입니다. 요약하면 실제로 GIL을 제거하기 위한 시도가 여전히 시도되고 있으나, 단일 스레드 성능 저하를 해결할 수 없기 때문에 제거할 수 없었으며 이를 해결하면서 GIL을 제거할 수 있는 방법이 있다면 언제든 환영한다는 글입니다. (https://www.artima.com/weblogs/viewpost.jsp?thread=214235)

It isn't Easy to Remove the GIL by Guido van van Rossum September 10, 2007

This has been tried before, with disappointing results, which is why I'm reluctant to put much effort into it myself.
(중략)
However, after benchmarking, it was shown that even on the platform with the fastest locking primitive (Windows at the time) it slowed down single-threaded execution nearly two-fold, meaning that on two CPUs, you could get just a little more work done without the GIL than on a single CPU with the GIL.(...)

반응형
복사했습니다!