본문으로 이동

글로벌 인터프리터 락

위키백과, 우리 모두의 백과사전.

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

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

기술적 배경 개념[편집]

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일에 확인함.