글로벌 인터프리터 락

글로벌 인터프리터 락(Global interpreter lock, GIL, 전역 인터프리터 잠금)은 한 번에 하나의 기본 스레드(프로세스당)만 실행할 수 있도록 스레드 실행을 동기화하기 위해 컴퓨터 언어 인터프리터에서 사용되는 메커니즘이다.[1] GIL을 사용하는 인터프리터는 멀티 코어 프로세서에서 실행되더라도 항상 한 번에 정확히 하나의 스레드를 실행할 수 있도록 허용한다. GIL이 있는 인기 있는 통역사로는 C파이썬루비 MRI가 있다.

GIL에서 스레드가 작동하는 방식을 도식적으로 표현한 것이다. 녹색 - GIL을 보유하는 스레드, 빨간색 - 차단된 스레드

기술적 배경 개념 편집

GIL은 스레드로부터 안전하지 않은 코드를 다른 스레드와 공유하지 않도록 프로그래밍 언어 인터프리터 스레드가 보유하는 상호 배제 이다. GIL을 사용한 구현에서는 각 인터프리터 프로세스마다 항상 하나의 GIL이 있다.

GIL을 사용하여 구현에서 실행되는 애플리케이션은 별도의 프로세스를 사용하여 완전한 병렬성을 달성하도록 설계할 수 있다. 각 프로세스에는 자체 인터프리터가 있고 자체 GIL이 있기 때문이다. 그렇지 않으면 GIL이 병렬 처리에 심각한 장벽이 될 수 있다.

장점 편집

글로벌 인터프리터 락을 사용하는 이유는 다음과 같다.

  • 단일 스레드 프로그램의 속도 향상(모든 데이터 구조에 대한 잠금을 별도로 획득하거나 해제할 필요 없음)
  • 일반적으로 스레드로부터 안전하지 않은 C 라이브러리를 쉽게 통합할 수 있다.
  • 구현 용이성(단일 GIL을 갖는 것이 잠금 없는 인터프리터나 세분화된 잠금을 사용하는 인터프리터보다 구현하기가 훨씬 간단하다).

GIL을 해결하는 방법은 스레드별로 별도의 인터프리터를 만드는 것인데, 이는 대부분의 언어에서 비용이 너무 많이 든다.

단점 편집

언어에서 글로벌 인터프리터 락을 사용하면 여러 스레드가 있는 단일 인터프리터 프로세스의 동시성을 통해 도달할 수 있는 병렬 처리의 양이 효과적으로 제한된다. 프로세스가 거의 순수하게 해석된 코드로 구성되어 있고 장기간 차단되는 인터프리터 외부 호출을 수행하지 않는 경우(처리하는 동안 해당 스레드에 의해 GIL이 해제될 수 있음) 증가가 거의 없을 가능성이 높다. 다중 프로세서 시스템에서 프로세스를 실행할 때 속도가 향상된다. CPU 바인딩된 스레드를 사용한 신호로 인해 단일 프로세서에서도 상당한 속도 저하가 발생할 수 있다.[2] 더 심각한 것은 단일 기본 스레드가 차단 OS 프로세스(예: 디스크 액세스)를 호출하면 다른 애플리케이션 스레드가 대기 중이더라도 전체 프로세스가 차단된다는 점이다.

같이 보기 편집

각주 편집

  1. “GlobalInterpreterLock”. 2015년 11월 30일에 확인함. 
  2. David Beazley (2009년 6월 11일). “Inside the Python GIL” (PDF). Chicago: Chicago Python User Group. 2009년 10월 7일에 확인함.