[파이썬] Python 프로그램의 메모리 맵과 PVM 실행 과정

파이썬을 배우면서 알게된 메모리 맵과 PVM, 그 내용들을 정리해보고자 한다.


1) 메모리 맵 (Memory Map)

메모리 맵은 프로그램이 실행될 때 메모리가 어떻게 분배되고 사용되는지를 나타낸다. 주요 메모리 영역은 다음과 같다

  • cs(code segment) 코드 영역: 프로그램의 소스 코드가 저장되는 영역으로, 실행 가능한 명령어 집합이 포함
  • ds(data segment) 데이터 영역: 전역 변수와 정적 변수가 저장되는 영역으로, 프로그램 실행이 끝날 때까지 유지
  • static 정적 영역: 클래스, 함수, 구조체, 유니온, 그리고 static으로 선언된 자료형이 저장
  • heap 동적 할당 영역: 동적으로 메모리가 할당되는 영역으로 프로그램 실행 시 다른 프로세스가 실행되지 않는 공간을 할당받고 실행이 끝나면 소멸
  • stack 고정 영역: 함수 호출과 관련된 임시 데이터가 저장되는 곳으로 함수의 매개변수와 지역 변수가 포함

2) PVM (Python Virtual Machine)

파이썬 가상 머신(PVM)은 파이썬 코드를 실행하는 데 사용되는 환경입니다. PVM에서도 메모리 맵을 유사하게 사용할 수 있다

  • cs(code segment) 코드 영역: 소스 코드가 바이트 코드로 컴파일되어 로드되는 곳
  • ds(data segment) 데이터 영역: 모듈에 선언된 변수가 저장
  • static 정적 영역: 클래스와 함수 등에서 static으로 선언된 자료형은 힙(heap)에서 함께 관리
  • heap 동적 할당 영역: 파이썬의 자료형 객체가 할당되는 곳
  • stack 고정 영역: 함수 호출 시 실행 컨텍스트가 저장되는 곳

PVM 실행 과정

예시 코드

# example.py

def greet(name):
    message = f"Hello, {name}!"
    return message

if __name__ == "__main__":
    name = "World"
    print(greet(name))

 

  1. Python 인터프리터 실행:
    • 터미널에서 python example.py를 입력한다.
  2. PVM 초기화:
    • PVM이 초기화되고 내장 모듈들이 임포트되며 시스템 환경 설정이 이루어진다.
  3. 바이트코드 컴파일:
    • example.py 파일의 소스 코드가 바이트 코드로 컴파일된다.
    • 예를 들어, greet 함수와 if __name__ == "__main__" 블록이 컴파일된다.
  4. 바이트코드 실행:
    • PVM이 컴파일된 바이트코드를 실행한다.
    • name = "World"가 실행되어 name 변수에 "World"가 할당된다.
    • greet(name) 함수가 호출된다.
      • 이때, greet 함수의 실행 컨텍스트가 스택에 저장된다.
    • greet 함수 내부에서 message 변수에 "Hello, World!"가 할당되고, message가 반환된다.
    • print(greet(name))가 실행되어 "Hello, World!"가 출력된다.

요약

  • PVM 초기화: 내장 모듈 임포트 및 시스템 환경 설정
  • 바이트코드 컴파일: Python 소스 코드가 바이트 코드로 변환
  • 바이트코드 실행: 컴파일된 바이트 코드를 실행하여 프로그램이 동작