GIL을 알아보자

Global Interpreter Lock

한 CPU만 일함.! 다중 CPU 환경에서 동시에 여러 파이썬 코드를 병렬로 실행할 수 없음.

  • 인터프리터의 구현이 쉬워짐
  • Garbage Collector 만들기 조음
  • C/C++ 확장 만들기 만들기 쉬움.

프로그램에 I/O 작업을 많이하면 파이썬 쓰레드도 좋음.

우리가 하는 일반 프로그래밍은 I/O Bound

계산을 많이 하는 작업 쓰레드 -> 프로세스

다중 CPU에서 병렬 실행을 위해서는 다중 프로세스를 이용하는 multiprocessing 모듈을 사용함. 프로그램에 I/O 작업을 많이하면 파이썬 쓰레드도 좋음.

우리가 하는 일반 프로그래밍은 I/O Bound

계산을 많이 하는 작업 쓰레드 -> 프로세스

다중 CPU에서 병렬 실행을 위해서는 다중 프로세스를 이용하는 multiprocessing 모듈을 사용함.

1
2
3
4
5
6
7
th1 = Thread(target=do_work)
th1.start()
th1.join()

pr1 = Process(target=do_work)
pr1.start()
pr1.join()

Process

운영체제가 작업하는 단위

Thread

이 Process 안에서 공유되는 메모리를 바탕으로여러 작업을 생성하는 작업 단위. -> 각 thread마다 할단된 개인적인 메모리가 있으면서 thread가 속한 process가 가지는 메모리에도접근가능함.

Race condition

여러 thread가 공유된 데이터를 변경함으로써 발생하는 문제.

“Thread-safe 하다” thread들이 race condition을 발생시키지 않으면서 각자의 일을 수행한다는 뜻.

Mutex

  • Thread-safe한 코드를 만들기 위해서 사용하는 것 중 하나.
  • Race condition을 막기 위해 공유되는 메모리의 데이터를 여러 thread가 동시에 사용할 수 없도록 잠그는일을 맡음.
휴대폰이 없던 시절에는 공중 전화를 주로 이용했었다. 거리의 모든 남자들은 각자의 아내에게 전화를 너무나 걸고 싶어한다.
어떤 한 남자가 처음으로 공중 전화 부스에 들어가서 그의 사랑하는 아내에게 전화를 걸었다면, 그는 꼭 전화 부스의 문을 꼭 잡고 있어야 한다. 
왜냐하면 사랑에 눈이 먼 다른 남자들이 전화를 걸기 위해 시도때도 없이 달려들고 있기 때문이다. 줄 서는 질서 문화 따위는 없다. 
심지어 그 문을 놓친다면, 전화 부스에 들이닥친 남자들이 수화기를 뺏어 당신의 아내에게 애정 표현을 할 지도 모른다.
아내와의 즐거운 통화를 무사히 마쳤다면, 이제 문을 잡고 있던 손을 놓고 부스 밖으로 나가면 된다.
 그러면 공중 전화를 쓰기 위해 달려드는 다른 남자들 중 제일 빠른 한 명이 부스에 들어가서 똑같이 문을 꼭 잡고 그의 아내와 통화할 수 있다.
  • thread: 각 남자들
  • mutex: 공중 전화 부스의 문
  • lock: 그 문을 잡고 있는 남자의 손
  • resource: 공중 전화

CPython reference counting 을 하는 과정에서 Rece condition이 일어나면 그 결과는 메모리 유실/object가 죽음이 발생

이를 해결하기 위해 mutex사용 -> object 하나하나 마다 대응하는 mutex가 필요함! 성능적으로 많은 손해, deadlock 위험상황

CPython의 결정 mutex를 통해 모든 reference 개수를 일일히 보호하지 말고 python interpreter자체를 잠구자! -> 오직 한 thread만이 python 코드를 사용할 수 있음 한 프로세스 안에서 여러 쓰레드를 이용한 병렬처리를 막음.

한 쓰레드가 파이썬코드를 실행하기 위해선 공중전화 박스에 들어가 interpreter lock을 잡아야함!
그래서 Global Interpreter Lock