Multiprocessing Semaphore의 실체를 파헤쳐보기

Multiprocessing 이나 Threading 등을 고민하거나, CS(Critical Section)에 대한 접근을 제어하기 위해서 보통은 Lock을 사용합니다. 오픈소스를 찾아볼 때 가끔 Lock, RLock(Reentrant Lock), Semaphore, Condition, Event 등 다양한 Lock 관련 구현들을 볼 수 있습니다.


그러다가 문득 내부적으로 multiprocessing 모듈에서 Lock이 어떻게 동작하는지 궁금해서 조사해보았습니다.


1/ Multiprocessing 에서 제공하는 Lock, RLock, Semaphore 등은 모두 내부적으로 Semaphore를 활용하여 구현되었습니다. Semaphore는 내부적으로 cpython에서 제공하는 SemLock이라는 C 구현체를 사용합니다.


2/ Multiprocessing 에서 새로운 프로세스를 만드는 방식에는 3가지가 있습니다. Fork는 현재 프로세스를 복사해서 자식을 프로세스를 만드는 방식이고, Spawn은 새로운 파이썬 인터프리터를 가지고 새롭게 시작하는 방식입니다. 마지막으로 Forkserver는 별도의 서버 프로세스를 생성하고, 해당 프로세스가 자식 프로세스를 fork하는 방식입니다.


기본적으로 Unix계열 OS는 3가지 방식을 모두 지원하지만, default로 MacOS는 Spawn 방식을 사용하고, Linux에서는 Fork 방식을 사용합니다. Windows에는 fork 시스템 콜이 없기 때문에, Spawn 방식만 지원합니다.


3/ SemLock Acquire 함수는 먼저 GIL을 해제하지 않고 바로 Lock 획득을 시도합니다. 만약 실패하게 되면, Lock을 잡기 위해 Interrupt를 받을 때까지 대기 상태에 들어갑니다. 다만, 이때는 Blocking IO로 간주되기 때문에 사전에 GIL을 해제하고 대기 상태로 들어갑니다.


4/ SemLock Release 함수는 Lock을 해제할 때까지 시도합니다. 해제가 완료되면, 대기하고 있는 스레드 중 하나는 깨웁니다. 대기하고 있던 스레드는 비로소 Lock를 획득합니다. 다만, 해당 Lock과 별개로, 다음 명령어를 수행하기 위해서는 GIL을 다시 획득해야 합니다.


5/ 내부적으로 Lock은 실제로 Lock 형태로 구현되어 있지 않고, Compare And Swap 방식을 사용합니다. CAS는 Lock-Free 알고리즘을 구현할때 주로 사용하는 패턴인데, 어떠한 값을 비교해서 현재가 같으면, 다음 값으로 교체하는 방식입니다. 이때 해당 교체가 하드웨어 수준에서 Atomic하게 진행되기 때문에, 실제로는 Lock과 같은 효과를 누릴 수 있습니다. Blocking 방식이 아니기 때문에 Non-Blocking 방식으로 애플리케이션을 구현을 할 때 유용하게 활용됩니다.


6/ cpython에서 SemLock이 lock을 획득하거나 해제하는 부분은 glibc에 구현되어 있습니다. 즉, 실제로 CAS를 통해서 값을 변경하고, 획득하지 못할 때 대기하는 부분은 온전히 저수준 API를 구현한 glibc의 몫이고, 그 전/후로 파이썬과 관련된 작업을 수행하는 부분이 cpython에 구현되어 있습니다.


https://open.substack.com/pub/techchallengearena/p/locking-deep-dive-1?r=czded&utm_campaign=post&utm_medium=web&showWelcomeOnShare=true


P.S 배운 내용을 열심히 블로그로 작성해보려고 합니다. 블로그 포스트를 이메일로도 받아보실 수 있으니 많은 관심 부탁드립니다!

링크: https://techchallengearena.substack.com/


#python #lock #multiprocessing

Locking Deep Dive - 1

Substack

Locking Deep Dive - 1

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 6월 9일 오후 8:40

댓글 0

    함께 읽은 게시물

    Next.js 프로젝트를 AWS EKS에 배포하며 배운 것들

    ... 더 보기

    쿠버네티스를 활용한 클라우드 네이티브 데브옵스 | 존 어런들 - 교보문고

    product.kyobobook.co.kr

    쿠버네티스를 활용한 클라우드 네이티브 데브옵스 | 존 어런들 - 교보문고

     • 

    저장 18 • 조회 1,693


    하나부터 열까지 리더가 상세히 설명해 주기를 바라는 구성원이 있습니다. 반대로 큰 얼개만 듣고 나머지는 자율적으로 하고 싶어 하는 경우도 있죠. 회식에 참여하는 것을 너무나 힘겨워 하는 구성원이 있는 반면, 동료들과 함께 시간을 보내며 가까워지는 것을 원하는 구성원도 있습니다.

    ... 더 보기

    다양한 구성원을 하나로 모으고 싶다면 - 리더가 가져야 할 모순

    네이버 블로그 | HSG 휴먼솔루션그룹

    다양한 구성원을 하나로 모으고 싶다면 - 리더가 가져야 할 모순

    서버엔지니어의 시대적 고민

    ... 더 보기

    🌎 해외에서 일하면 뭐가 좋을까요❓

    외국어를 사용해서? 돈을 더 많이 벌어서? 새로운 기회가 많아서? 글로벌 경력을 쌓을 수 있어서?

    ... 더 보기

    한때 천만원에 거래되었던 Manus, Bedrock 무료 오픈소스로 공개

    ... 더 보기

    LinkedIn

    lnkd.in

    LinkedIn

     • 

    저장 19 • 조회 1,553


    무너지고 있는 프론트엔드, 백엔드 직군의 경계에 대한 고찰

    AI 기술이 우리 일상과 산업 전반에 스며들면서 소프트웨어 개발 환경 역시 큰 변화의 물결을 맞이하고 있다. 특히 코딩을 돕는 AI 에이전트의 등장은 개발 생산성에 대한 큰 변화를 만들고 있다. 나 역시 이러한 변화를 체감하며, 나에게 익숙한 소프트웨어 개발의 대표적인 두 축인 프론트엔드와 백엔드 영역에서 AI 기술이 미치는 영향과 그로 인해 변화하는 소프트웨어 엔지니어의 역할에 대해 개인적인 생각을 정리해 본다.

    ... 더 보기

     • 

    저장 35 • 조회 4,658