GIL이란

dj-yang·2024년 3월 23일
0

python

목록 보기
4/4

파이썬 설계적 결함.

  1. Global Interpreter Lock (GIL)
  • 등장 배경 : 레퍼런스 카운팅(생성된 객체가 가르키는 참조의 수) -> 이 참조 객체가 0이되면 메모리 가비지 컬렉터에 의해 해제된다. 이와 같은 방식을 파이썬에서는 사용하고 있는데, 두 개 이상의 쓰레드에서 같은 객체에 접근을 해 업데이트 등과 같은 작업을 진행할 때 레이스 컨디션이 일어날 수 있다.(메모리 누수가 발생하거나 참조하고 있는 객체가 존재했는데 해체를 하고자 한다거나. 이와 같은 메모리 이슈의 안전성을 보장하기 위한 디자인 선택

  • 단점 : 스레드의 병목 현상이 일어나게 된다면 병렬 프로그램임에도 불구하고 싱글 스레드로 실행한 것보다 오랜 작업시간이 걸릴 수 있다. 이는 CPU bound한 프로그램에서 많이 발생한다. 오히려 I/O Bound한 프로그램에서는 이득이 될 수 있을 가능성이 높다.

  • 해결법

    1. 멀티프로세싱(9장)
    2. Numpy(6장)
    3. Numexpr(6장)
    4. 사이썬(7장)
  • 현재 상황 : PEF 703 (C 파이썬에서 GIL을 선택사항으로 두자)가 제안을 승인하는 방향으로 방향성을 잡고 있음. 그 방식은 아래와 같음

    1. 불멸화 : None과 같은 객체는 할당을 해체할 필요 없으므로 참조 카운트 추적이 필요하지 않음.
    2. 편향 참조 가운팅 : 멀티 스레드에서 접근하는 객체의 카운팅과 싱글 스레드에서 접근하는 카운팅을 다르게 함.
    3. 스레드 안전 메모리 할당 : 가바지 수집기에서 조금 더 쉽게 객체를 추적하는 방식으로 진행.
    4. 지연된 참조 카운트 : 모듈의 최상위 함수와 같은 일부 객체에 대한 참조 카운트는 안전한 지연이 가능하다. -> 아마 여러 곳에서 사용되는 만큼 해체될 일이 없기 때문에 그런듯 보임.
    5. 수정된 가비지 수집기 : C 파이썬 가비지 수집기는 둘 이상의 객체가 상호 참조를 갖는 순환 객체 참조를 정리한다. No-GIL 빌드에서는 객체 추적을 위한 “세대” 시스템이 제거되는 등 가비지 수집기의 많은 부분이 변경된다.
profile
비전공자가 고통받으며 개발합니다

0개의 댓글