[memory] 메모리의 구조

LDB·2025년 1월 10일
0

CS 지식

목록 보기
3/7

작성하게된 계기

갑자기 메모리에 대해 작성해서 당황할 수 있다, 하지만 메모리에 대해서는 정말 정리하고 싶은 내용이었고 또한 백엔드 개발자로써 메모리를 알아야한다고 생각하는데 어디인지는 정확히 모르나 운영하고 있는 서비스의 메모리관리를 제대로 못하여 결국 메모리 overflow가 발생한 사례를 들었다. 이 사례만으로도 백엔드 개발자가 어째서 메모리에 대해 지식을 가져야하는지 충분한 이유이다.


메모리란?

메모리는 주기억장치 RAM(Random-Access-Memory), 고정 기억 장치 ROM(Read-Only Memory)으로 나뉘는데 간단히 RAM과 ROM을 설명하고 RAM에 대해서 이야기할 생각이다.

RAM(Random-Access-Memory)

  • 자유롭게 읽기/쓰기가 가능한 기억장치로 Read-Write-Memory라고도 불린다, 주로 사용중인 프로그램 혹은 데이터가 저장되어있다.
  • 시스템 전원이 꺼지는 동시에 데이터가 사라지는 휘발성특징을 가지고있다.

ROM(Read-Only-Memory)

  • RAM과 다르게 쓰기는 불가능하고 읽기만 되는 특징을 가지고 있다.
  • RAM과 반대로 시스템 전원이 꺼져도 내용이 지워지지 않는 비휘발성 메모리이다.
  • 주로 자가 진단 시스템등 변경 가능성이 없는 시스템 소프트웨어에 사용된다.

프로그램의 실행 순서

우리는 메모리를 알기전에 프로그램의 실행순서를 알 필요가 있다.

1. 사용자가 프로그램 실행요청을 운영체제(OS)에게 보낸다.
2. 보조기억장치(SSD/HDD)에서 프로그램을 읽어 주기억장치(RAM)에 로드한다.
3. CPU(중앙처리장치)는 프로그램 코드를 가져다 메모리를 관리하고 명령문을 실행한다.
4. 동적(Heap)메모리가 할당된다.
5. 스택(Stack)메모리가 할당된다.

(C++에서는 Heap메모리 영역을 Free Store영역이라고 부르기도 한다.)

메모리의 구조

이제 프로그램의 실행순서를 알게 되었으니 메모리에 구조와 함께 어떻게 프로그램이 메모리에 할당 되는지 알아보자

Program Code 영역

코드 영역은 텍스트(Text) 영역으로 불리며 표현 그대로 프로그램의 소스코드가 저장되는 영역이고 다음과 같은 특징을 가지고 있다.

  1. 중간에 사라지지 않고 프로그램이 시작할 때 생성되고 프로그램이 끝나면 메모리에서 지워진다.
  2. 프로그램의 소스코드들은 컴파일된 기계어로 저장된다.
  3. 함수가 일반적으로 Code영역에 해당한다.

Data / BSS 영역

전역변수(global variable) / 정적변수(static variable)가 저장되는 영역으로 메인(main)함수 전에 그러니까 프로그램 실행 전에 선언되어 프로그램이 끝날 때까지 남아있는 변수들이라는 특징이 있다, 여기서 더 세분화되는데 두 가지로 나눌 수 있다.

  • Data영역 : 전역변수와 정적변수를 선언하고 값을 초기화 하면 생성되는 영역
  • BSS영역 : Block Started By Symbol 약자로 전역변수와 정적변수를 선언하고 값을 초기화하지 않은 경우 생성되는 영역

Heap 영역

메모리에서 Heap 영역은 사용자가 직접 관리할 수 있는 메모리 영역이다. Heap 영역은 사용자에 의해 메모리공간이 동적으로 할당되고 해제 된다. 대표적으로 C언어의 malloc이 여기에 해당한다.

  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • Heap영역의 크기는 Runtime 시에 결정이 된다.
  • Heap영역이 커지면 Stack영역이 작아진다.

Stack 영역

Stack 영역은 함수의 호출과 관계되는 지역변수(local variable)와 매개변수(parameter)가 저장되는 영역이다. stack영역은 프로그램 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸되는 특징을 가지고 있다.

stack은 데이터를 푸시(push)로 저장하고 팝(pop) 동작으로 데이터를 인출한다. 그리고 stack은 후입선출(LIFO : Last-In First-Out) 방식으로 가장 마지막에 들어온 데이터가 가장 먼저 인출되는 특성을 가지고 있다.

  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • Stack영역의 크기는 Compile 시에 결정이 된다.
  • Stack영역이 커지면 Heap영역이 작아진다.
  • 또한 함수 호출 종료시 복귀할 주소를 담고있다.

오버플로우 비교

우리는 메모리에 대해 배우면 반드시 나온다고 해도 과언이 아닌 스택 오버플로우힙 오버플로우가 있다. 이 두 개의 특징도 알아보도록 하자.

  • 스택 오버플로우(stack overflow)

    스택은 기본적으로 고정적으로 공간이 할당되어 있는데 스택 메모리를 그 공간이 넘을 때 까지 사용하면 나타나는 에러이다.
    주로 연속적으로 재귀를 하거나 중첩되는 함수호출이 많으면 생긴다.

  • 힙 오버플로우(Heap overflow)

    힙은 앞에서 설명한 것처럼 프로그램이 실행되고 할당되는 영역인데 스택 오버플로우와 비슷하게 할당된 힙 메모리 영역을 넘었을 때 생기는 에러이다.


코드로 보는 메모리 구조

(https://deeppago.tistory.com/45 님의 게시글 이미지를 사용했습니다.)

참고 사이트

https://st-lab.tistory.com/198

https://daltonic.tistory.com/52

https://code4human.tistory.com/129

https://all-young.tistory.com/17

https://deeppago.tistory.com/45

profile
가끔은 정신줄 놓고 멍 때리는 것도 필요하다.

0개의 댓글

관련 채용 정보