본문 바로가기

COMPUTER SCIENCE/Python

[Section 3] 동적 메모리의 할당 _ 파이썬 메모리 관리자

 

파이썬 목차 보기

 

[Intro] 파이썬 미리보기

* 파이썬과 라이브러리 설치하기 파이썬과 라이브러리 설치하기 1. 파이썬이란? 파이썬은 고급 프로그래밍 언어로, 다양한 윈도즈에서 동작 가능합니다. 그리고 파이썬은 비영리 재단이 관리하

hookspedia.tistory.com

0. INTRO

메모리 할당에 있어 파이썬과 C 프로그래밍의 차이는 바로 데이터의 객체화에 있다. C 언어는 특정 변수를 정의하고 컴파일하면, 메모리 영역에 바로 데이터가 저장되는 반면에, 파이썬은 특정 변수를 오브젝트화 하여 저장한다. 또 파이썬에는 동적 메모리의 할당 함수가 존재하지 않는다. 동적 메모리의 조작 및 관리가 없다면, 엉뚱한 데이터의 주소에 메모리를 할당해버리는 메모리 충돌 오류의 위험이 존재할지도 모른다. 

1. 파이썬 메모리 관리자 _ Python/C API 함수의 존재

파이썬의 메모리 관리는 Python/C API 함수를 통해서 가능하다. 이는 확장 모듈로써 파이썬에서 C 라이브러리에 존재하는 malloc()calloc()realloc() and free() 함수를 사용 가능하게 만들어준다. 작동 방식에 있어 C 언어 함수와 차이는 있을지 모르지만, 파이썬에서 동적 메모리 할당 기능을 충실히 수행하는 함수들이다. 이 함수들이 작동하면 특정 목적을 위한 라 영역(Raw domain), 멤 영역(Mem domain), 그리고 오브젝 영역(Object domain)이라 불리는 할당자 영역들로 메모리가 할당된다. 이 세 가지 할당자 영역들의 특징을 간단히 명시해놓겠다.

 

* 아래의 세 영역은 메모리 할당 측면에서 데이터들이 어떻게 물리적으로 연결되어있는지를 이해하는 데 필요한 용어들이다. 따라서 그냥 이러한 영역들이 존재한다는 정도만 인지하고 넘어가기로 하자.  

 

A. 라 영역(Raw domain)

일반적인 메모리 버퍼(buffer) 목적을 위해서 메모리를 할당하는 영역이다. 할당 메모리는 시스템에서 직접적으로 받기 때문에, GIL(Global Interpreter Lock)이라는 것이 필요가 없다. 

B. 멤 영역(Mem domain)

멤 영역 역시 일반적 메모리 버퍼 그리고 파이썬 버퍼를 위해 메모리를 할당하는 영역이다. 멤 영역의 할당 메모리는 파이썬 개인 힙(Python private heap)으로 부터 할당되며, GIL이 필요하다.

C. 오브젝 영역(Object domain)

파이썬의 오브젝(object)에 해당하는 메모리의 할당을 목적으로 존재하는 영역이다. 이 영역 또한 파이썬 개인 힙으로부터 할당된다.

 

그렇다면, 파이썬의 메모리 관리를 위해서 C 라이브러리 파일을 어떻게 파이썬 환경에서 호출할 수 있을까?

2.  라이브러리 파일 불러오기 _ #include "Python.h"

라이브러리 파일을 포함시키는 코드는 우리가 흔히 알고 있는 C언어와 매우 흡사하다. 라이브러리 파일을 파이썬 환경에서 불러온다면, 이제 남은 일은 C언어 문법을 사용하는 것이다. 하지만, 여기에서는 C언어의 구조만 간단히 언급하고 넘어가기로 한다.

 

A. 전처리기와 헤더 파일의 의미 _ Preprocessor and Header File

전처리기는 라이브러리 파일을 불러오기 위해서 "#"이라는 특수 문자를 입력하는데, 이 #을 전처리기라고 부른다. 전처리기는 컴파일러에게 가장 먼저 처리해야 할 명령을 보내는 코드이다. 다음으로 헤더 파일은 '. h'의 확장자를 가지는 파일을 의미한다. 우리가 파이썬에 불러온 라이브러리 파일은 'Python.h' 로 이 라이브러리 파일 안에 표준적으로 제공하는 함수들의 데이터가 포함되어있다. 결과적으로 헤더 파일을 전처리기로 표시함으로써 목적에 맞는 표준 라이브러리 함수를 사용할 수 있게 되는 것이다.

B. C언어 구조  _ 출력 형태  / 함수 이름 / ( 입력 형태 ) / {  코드 작성 }

C언어는 라이브러리에서 제공되는 표준 함수를 이용하여 사용자의 입맛대로 특정 목적을 위해 명령을 실행하는 새로운 함수를 만드는 것이라고 볼 수 있다. 따라서 가장 먼저 사용자의 함수가 어떤 형태로 출력될 것인지, 이름은 무엇인지, 그리고 사용될 변수들의 입력 형태는 어떤지를 먼저 정의해주어야 한다. 가장 기본적으로 C언어를 시작할 때 배우는 코드는 다음과 같은 형태를 취한다.

 

#include <stdio.h>

int main(void)

{

...

}

 

void는 '빈'이라는 뜻으로 아무것도 없는 것을 의미한다. 따라서 정의에 따라 해석하자면, main 함수에 입력 데이터 없이 정수 형태의 프로그램 결과를 출력하는 프로그램이 되는 것이다. 어떤 결과가 출력될 것인지는... (코드)에 달려 있다. 

 

* 위 구조는 C언어에서의 구조를 의미한다. 실제로 파이썬에서 C 라이브러리를 사용하는 것은 현재의 난이도를 상회하기 때문에, 이후에 새로운 목차를 만들어 공부하기로 하자.