메모리 할당

신승준·2022년 5월 1일
0
post-custom-banner

메모리 할당

데이터를 저장할 공간을 적정하게 나누는 작업이 메모리 할당(Memory Allocation)이다.

  • 프로그램 : 프로그래머가 만든 프로그램 실행 파일
  • 프로세스 : CPU가 실행 파일에 있는 명령들을 실행할 수 있도록 운영체제가 실행 파일의 명령들을 읽어서 메모리에 재구성한 것
    실행 중인 프로그램이라고도 한다.
    세그먼트의 집합으로 구성되어 있다.
  • 세그먼트 : 명령어, 코드, 데이터 등 여러 정보나 사용자가 입력한 데이터를 기억하는 메모리 공간
  • 보통 프로세스는 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트로 이루어져 있다.


정적 메모리 할당

컴파일러가 소스 코드를 기계어로 번역하는 시점(컴파일)에 변수 크기게 맞게 메모리에 할당하는 것이다. 수정하려면 소스 코드를 바꾸고 다시 컴파일해야 하므로 유지보수 시에 어려움이 있다. 다시 말해서 프로그램 실행 시 할당된 메모리의 크기는 변경이 불가하다. 프로그램 실행 시 메모리의 위치가 결정되기 때문이다.


전역 변수와 지역 변수

  • 전역 변수 : 프로그램이 시작해서 종료까지 유지된다. 프로그램 실행 중에 전역 변수 추가 및 삭제가 불가하고 프로세스의 데이터 세그먼트에 저장된다.
  • 지역 변수 : 함수가 호출될 때 메모리에 할당되었다가 함수가 끝나면 사라진다. 프로세스의 스택 세그먼트에 저장된다.

스택

지역 변수의 갯수가 늘어나거나 줄어들기 때문에 스택(stack)이라는 자료구조를 채용해서 지역 변수 영역을 관리한다.

하지만 주의할 점은, 자료구조에서 배운 스택(이론)과 실제 컴퓨터 시스템의 스택(실제)의 동작은 아래와 같이 상반된다.


이 때 ax는 cpu 안에 있는 메모리(레지스터)이다. 위와 같이 명령어 push로 스택에 공간이 확보된다.


또한 명령어 pop으로 스택에 저장된 데이터가 날라간다.


전에와 같이 push, pop으로 하면 여러번 연산되기 때문에 비효율적이다. 그러나 sub와 add를 사용하면 단 1번에 공간을 확보하거나 날릴 수 있다.

컴파일러가 스택에 할당된 지역 변수를 사용하는 원리

  • BP : Base Pointer, BP를 기준으로 데이터를 추가할 때마다 순서대로 데이터를 쌓아 올린다.
  • SP : Stack Pointer, SP는 새로운 데이터가 추가될 위치를 가르킨다.
pop bx
pop ax
mov ax, 5
push ax
push bx

블록 b의 값을 5로바꾸려면 위와 같이 5개의 연산이 필요하여 많이 비효율적이다.



위와 같이 포인터를 사용하면 1번에 접근하여 값을 읽거나 바꿀 수 있다.

  • IP : Instruction Pointer, IP는 main 함수에서 어디까지 수행되었는지에 대한 위치 번호
    push IP는 실제로 기계어 코드에 없다. Test 함수가 Show 함수를 부를 때 call이라는 명령어로 자동적으로 push IP(Test) 효과를 낸다.

스택 프레임 : 함수를 호출할 때 일어나는 스택의 변화


pop IP는 어셈블리로는 실제로 ret이다.

정적 메모리 할당의 한계


위와 같이 단일 변수 혹은 모든 변수의 크기가 1MB를 넘게 되면 오류가 발생한다. 스택의 기본 메모리 크기는 1MB이기 때문이다.





동적 메모리 할당

malloc

c에서 동적 메모리 할당을 하고 싶으면 malloc이라는 함수를 쓰면 된다. 실제로 쓰는 사람이 어떻게 쓸지 모르니 malloc은 void 포인터형으로 반환한다. 할당한 것을 해제하고 싶으면 free를 쓰면 된다.


동적 메모리 할당의 장단점

profile
메타몽 닮음 :) email: alohajune22@gmail.com
post-custom-banner

0개의 댓글