본문 바로가기
Python

Python 메모리 영역 | Why isn't Python overflowing?

by Kyn 2020. 6. 8.

 

 

Python의 메모리 영역

 

1. Code 영역

  • 코드의 영역이다. 해당 영역에는 실행될 프로그램의 코드가 저장된다.

2. Data 영역

  • 전역 변수와 정적 변수를 저장한다
  • 초기화되지 않은 변수는 BSS( Block started By Symbol)에 저장된다. (BSS - 초기화가 되지 않는 전역 데이터를 위한 별도의 공간이다.)

3. Heap 영역

  • 런타임시 메모리를 할당된다.
  • 메모리의 필요양이 정해진 것이 아닌 프로그램이 실행되는 동안 결정되어야 하는 경우에 사용된다.
  • 사용자가 관리할 수 있는 메모리 영역
  • 메모리의 낮은 주소(low memory)에서 높은 주소(high memory)로 할당된다.

4. Stack 영역

  • 함수 내 선언된 지역변수, 매개변수가 저장되는 영역
  • 함수 호출 시 할당하고 함수 호출을 완료하고 난 이후 소멸된다.
  • 데이터 용량의 불확실성 때문에 높은 주소(high memory)부터 할당하여 낮은 주소(low memory)로 할당된다.
  • Push로 데이터를 저장 , Pop로 데이터를 인출하며 이러한 방식을 LIFO (Last-In Frits-Out) 후입 선출 방식이라 한다.

Overflow

Stack 영역을 초과하게 되면 Stack Overflow   Heap 영역을 초과하게 되면 Heap Overflow 이처럼 프로그래밍에서 메모리 용량을 넘어선 값이 들어가 생기는 오류를 Overflow라고 한다. 

 

Overflow의 종류

  • Stack Overflow : 함수는 변수 등을 저장하기 위해 Stack을 만든다. 해당 함수가 지속적으로 실행되어 만들어진 Stack이 메모리 용량을 넘어서게 되면 Stack Overflow가 발생한다.
  • Buffer Overflow : 프로그램이 실행될 시 버퍼를 입력받다 버퍼가  메모리 용량을 넘어서게 되면 Buffer Overflow가 발생한다.

 

파이썬에서 Overflow?

python2의 경우 int와 long을 각각 분리하여 int 형을 넘어서는 정수 값은 long형으로 다뤄진다.

하지만 python3으로 넘어오면서 long 형이 사라짐과 동시에 int의 제한이 없어졌다. 이를 가능하게 해 준 것은Arbitrary-precision arithmetic의 사용 여부에 따라 달라진다. python2의 경우 int 타입과 long타입으로 나뉘어 int 타입이 초과할 시Arbitrary-precision arithmetic을 사용하는 long타입으로 이를 처리하였다 하지만 python3의 경우 long타입이 사라지고 int타입에서 Arbitrary-precision arithmetic를 사용하였다.

 

What is Arbitrary-precision arithmetic?

큰 정수의 단위를 활용해야 할 때 정밀도의 자릿수를 호스트 시스템의 가용 메모리를 할당하여 작업을 수행하는 것입니다.

이를 활용한다면 Overflow가 발생하지 않는 것이 아닌 호스트 시스템의 가용 메모리가 허용되는 한에서 정수 타입 작업에서 overflow가 발생하지 않는다 라고 보는 것이 올바른 접근입니다.

하지만 c Style을 가진  pydata 스택 (numpy / pandas)에서 작업이 수행되는 경우는 해당되지 않는다 이는  fixed-precision integers을 기반으로 활용하기 때문이다.

댓글