파이썬

파이썬 메모리 영역

이소금 2019. 9. 11. 23:30
반응형

메모리는 네가지 영역(코드 영역, 데이터 영역, 스택 영역, 힙 영역)으로 나뉘어져 있습니다.

코드 영역(=텍스트 영역)에는 실행할 프로그램의 코드가 저장이 됩니다. 이 영역에서 CPU는 코드 영역에 저장된 명령어를 하나씩 가져가 처리합니다.

데이터 영역은 전역변수와 정적 변수를 저장하는 공간이며 프로그램 시작과 함께 할당하며 프로그램이 종료되면 소멸합니다.

스택 영역은 지역변수와 매개변수를 저장하는 공간이며 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸합니다. 

힙 영역은 사용자의 동적 할당으로 생성되는 공간입니다. 이러한 특징으로 인해 사용자가 공간의 크기를 직접 관리할 수 있습니다.

 

스택 영역

스택 영역에 대해서 자세히 알아보겠습니다. 이 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 합니다. 푸시(push)로 데이터를 저장하며 팝(pop)으로 데이터를 인출합니다. 한쪽 끝에서만 자료를 넣었다 뺐다 할 수 있는 LIFO(Last In First Out) 구조로 제일 최근에 추가한 함수가 제일 먼저 제거되는 형식입니다. 데이터의 높은 주소에서 낮은 주소 방향으로 할당합니다. 넣을 때 1, 2, 3 순으로, 뺄 때 3, 2, 1 순으로 저장됩니다.

스택 영역이 제일 많이 활용되는 구간은 재귀 알고리즘입니다. 재귀 알고리즘이란, 어떤 문제보다 조금 작은 하위 문제를 해결함으로써 그 문제를 해결하는 알고리즘입니다. 즉, 함수 안의 함수라고 이해하면 쉽습니다. 함수 안의 함수를 해결하여 바깥의 함수를 해결하는 형식입니다. 재귀적으로 함수를 호출해야 하는 경우, 임시 데이터를 스택에 넣어줍니다. 스택 메모리를 사용하는 경우는 크게 퇴각 검색(backtrack), 뒤로가기, 실행취소, 역순 문자열, 수식 괄호검사, 혹은 후위 표기법 계산이 있겠습니다.

 

힙 영역

힙 영역에 대해서 자세히 알아보겠습니다. 힙 영역의 크기는 프로그램이 실행되는 도중인 런타임(run time)에 사용자가 직접 결정하게 됩니다. 반면에 데이터 영역과 스택 영역의 메모리 크기는 컴파일 타임에 미리 결정됩니다.

예를 들어, 게임의 회원수가 1000명이지만 동시 접속자 수는 그 중 10%, 100명 정도인 게임을 운영하는 게임 회사가 있습니다. 게임의 회원수가 1000명이라고 하여 1000명분의 메모리를 고정적으로 지정하면 그 중 10프로만 메모리가 사용되어지고 나머지 90%는 사용되어지지 않은 채 메모리 공간만 잡아먹게 되어 시간과 비용적으로 비생산적이고 비효율적이게 됩니다. 하지만 회원이 게임을 접속할때만(프로그램이 실행되는 도중인 run time때) 동적 할당을 사용하게 되면 사용자가 게임을 접속할 때 필요한 메모리만 할당하게 됩니다. 그렇게 되면 더욱 효율적이고 생산적으로 메모리를 관리할 수 있게 됩니다.

이러한 이유로 동적 할당으로 힙 영역을 적절한 곳에 사용하게 된다면 메모리의 낭비 없이 생산적으로 메모리를 할당할 수 있게 됩니다. 런타임에 메모리가 할당받는 것을 메모리의 동적 할당(dynamic allocation)이라고 합니다.

 

파이썬의 힙 영역 사용

C, C++, 또는 Java의 경우 malloc과 같은 함수를 이용해서 동적할당을 사용할 수 있게 됩니다. 하지만, 놀랍게도 파이썬은 동적 할당의 기능이 없습니다. 이 말은 즉, 사용자가 직접 메모리 할당범위를 조정하지 않습니다. 왜냐하면 파이썬은 자동으로 메모리를 관리해주는 언어이기 때문입니다.

그럼 파이썬은 스택 영역만 사용하게 되는가, 그렇지 않습니다. 파이썬은 메모리를 관리해주는 특별한 기능이 있습니다. Python Memory Manager라는 기능인데요, 이 기능이 포인터를 움직여 힙 영역의 메모리 할당 범위와 내부 버퍼를 조정해줍니다. Python Memory Manager는 Python/C API를 통하여 스토리지를 동적으로 관리합니다. 스토리지의 동적 관리가 필요할 때는 메모리의 공유(sharing), 메모리의 세분화(segmentation), 메모리의 사전할당(preallocation), 그리고 캐싱(caching)이 있습니다.

파이썬에서 메모리의 동적 할당은 C와 다르게(C는 메모리 집중(Memory Oriented) 언어) 그리 중요하지 않습니다. 그렇기 때문에 이미 C에서 사용하는 동적할당 API를 호환하여 사용하기 때문에 Python/C API라고 불립니다. 이 API중 사용하는 함수는 malloc(), calloc(), realloc(), free() 등이 있습니다.

힙 안의 메모리 영역을 interpreter가 포인터를 사용해 영역의 범위를 조정함으로써, interpreter가 자동으로 메모리를 OS로 할당하지 않고 가지고 있다가 사용될 때 메모리를 재사용 하는 방식으로 운영됩니다. 즉, 메모리 할당에 있어 OS의 과부하를 줄여주는 획기적인 High level language입니다. 

파이썬의 메모리 구조입니다. -1의 영역은 운영체제의 영역입니다. 제일 낮은 level에서, +1의 raw memory allocator가 운영체제와 소통하면서 heap 영역 안에 데이터가 들어갈 자리가 있는지 확인합니다. 제일 높은 level에서는 +3의 Object-specific memory가 힙 영역을 담당하고 변수 타입에 따라 달라지는 저장방식 때문에 각각의 타입에 맞춰 힙에 저장합니다.

즉, 파이썬은 가비지 콜렉터와 같은 메커니즘을 가지고 있습니다. 변수와 함수가 호출됨에 따라 그에 맞는 메모리를 그때그때 Python Memory Manager가 운영체제와 소통하면서 할당하고 결과값이 return되거나 변수와 함수가 사용을 멈추었을때 바로 메모리가 소멸되는 형식이라고 할 수 있겠습니다.

 

 

부족하지만 저는 이렇게 이해했습니다. 혹시 정확하지 않은 정보가 있다면 댓글 달아주세요!

 

 

출처:

https://docs.python.org/3/c-api/memory.html#tracemalloc-c-api

 

Memory Management — Python 3.7.4 documentation

Overview Memory management in Python involves a private heap containing all Python objects and data structures. The management of this private heap is ensured internally by the Python memory manager. The Python memory manager has different components which

docs.python.org

https://www.evanjones.ca/memoryallocator/

 

Improving Python's Memory Allocator

Improving Python's Memory Allocator Evan Jones <ejones@uwaterloo.ca> http://evanjones.ca/ [PDF version] Abstract Python automatically manages memory using reference counting. In order to provide good performance for typical programs, Python provides its ow</ejones@uwaterloo.ca>

www.evanjones.ca

https://b.luavis.kr/python/python-malloc

 

Luavis' Dev Story - Python의 메모리 할당

Python이 메모리를 할당하고 관리하는 방법

b.luavis.kr

반응형

'파이썬' 카테고리의 다른 글

파이썬 모듈  (0) 2019.09.16
코딩일기1: 파이썬 이미지 로드가 안될때  (1) 2019.09.13
클래스  (0) 2019.09.13
파이썬 기초 및 자료형2  (0) 2019.09.11
파이썬 기초 및 자료형1  (0) 2019.09.05