Zettelkasten

python 3.12부턴 cpython stack이 PyInterpreterFrame으로 관리된다.

·수정 2026.04.23·수정 2

요약

  • 핵심 아이디어 한 줄 요약
  • “이 노트는 왜 중요한가?” → 맥락 설명

본문

  • 원래는 python 함수 호출 = C 함수 호출 이였음
  • 예를 들어 파이썬에서 foo()를 호출하면 _PyEval_EvalFrameDefault()라는 함수가 재귀적으로 호출됨, 즉 python 콜 스택과 C 콜 스택이 1:1로 맞물려 있음

변경 점

  • cpython 3.12부터 python 프레임을 c 스택에 얹지 않고 별도의 데이터 구조(_PyInterpreterFrame)으로 관리하기 시작함
  • 변경 이유
    • 성능: 재귀적 C 호출을 줄이면 인터프리터 루프가 더 효율적(specialiizing adaptive interpreter)
    • free threading: GIL 제거를 위해 스레드별 상태관리를 재설계 해야하는데, C 스택에 python 상태가 묶여 있으면 이게 어려움

greenlet에 미치는 영향

  • C 스택 swap 시 추가로 저장/복원 해야할 내부 상태가 늘어남 context switch 비용 증가
  • cpython 버전마다 내부구조가 달라져서 greenlet이 매 버전마다 추적해서 맞춰야함

참고

스택은 함수의 실행 정보를 프레임 단위로 저장한다 greenlet의 동작 방식