본문 바로가기
프로그래밍/운영체제

메모리 구조(Memory Structure)에 대해서

by bantomak 2023. 2. 17.

메모리 구조

우리가 exe 파일을 실행하면 운영체제는 프로그램에 정의된 명령어(코드)를 바탕으로 메모리에 프로세스를 적재한다.

해당 프로세스를 위한 Code, Data, Heap, Stack 영역이 생성된다.

 

메모리 구조

  • 코드 영역
  • 데이터 영역
  • 힙 영역
  • 스택 영역

 

코드 영역 (Code)

  • 소스코드가 기계어 형태로 저장된다
  • CPU가 저장된 명령어를 프로그램 카운터에 의해 하나씩 가져가 처리하게 된다.
  • 프로그램 시작부터 종료까지 메모리에 있게 된다.
  • 컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장된다.

 

데이터 영역 (Data)

  • 전역변수, static 변수가 저장된다.
  • 프로그램 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 해제된다.
  • 실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정된다.

 

class Temp
{
    static public int value;        // static 변수
}

class Program
{
    int globalVariable = 0;        // 전역 변수
    string globalString = "";      // 전역 변수

    static void Main(string[] args)
    {
    }
}

 

힙 영역 (Heap)

프로그래머가 할당, 해제하는 메모리 영역

프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며 이를 동적할당이라고 한다.

사용하고 난 후에는 반드시 메모리 해제를 해줘야 한다.

그렇지 않으면 메모리 누수(memory leak)가 발생한다.

 

C#에서는 참조 타임 생성 시에 힙 영역에 할당된다. Class를 New 하는 경우가 대표적!

 

Code, Data, Stack 중 유일하게 런타임 시에 크기가 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.

 

  • 범위가 전역이기 때문에 프로그램의 모든 함수에서 액세스 가능 
  • 할당작업, 해제 작업으로 인한 속도 저하
  • 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
  • 힙 경합(두 개 이상의 쓰레드가 동시에 접근하려 할 때 Lock이 걸림)으로 인한 속도 저하
  • 메모리를 프로그래머가 직접 관리해야함

 

스택 영역 (Stack)

함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등이 저장되고, 함수가 종료되면 저장된 메모리도 함께 해제된다.

컴파일 타임에 결정되기 때문에 이미 크기가 정해져 있다. 높은 메모리 주소부터 낮은 메모리 주소 순서로 생성된다.

 

  • 범위가 지역이기 때문에 선언된 지역에서만 액세스 가능
  • CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 빠르다.
  • 메모리를 프로그래머가 직접 해제하지 않아도 됨

 


힙과 스택의 메모리 관계

 

힙과 스택은 사용되지 않은 메모리를 같이 사용하는 구조로 되어있다.

힙 영역은 낮은 메모리 주소부터 할당받는 것이고

스택 영역은 높은 메모리 주소부터 할당받는 것이다.

 

힙 또는 스택 영역에서 너무 많은 메모리 사용이 일어나면 오버 플로우가 발생한데.

 

프로세스와 스레드, 메모리 구조의 관계

프로세스는 완전히 독립적이기 때문에 메모리 영역(Code, Data, Heap, Stack)을 다른 프로세스와 공유하지 않는다. 그리고 프로세스는 최소 1개의 스레드(메인 스레드)를 가진다.

 

스레드는 프로세스 내에서 Stack 영역만 별도로 할당받고, 그 외의 나머지 영역(Code, Data, Heap) 영역을 공유한다.

 

고유한 Stack 영역을 가지는 스레드를 확인할 수 있다.

 

함께 읽으면 좋은 글

 

스레드(Thread)란

스레드 오늘날의 운영체제들은 프로세스를 효율적으로 사용하고, 작업의 유연성을 얻기 위해 멀티스레드를 지원한다. 스레드의 정의 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할

jettstream.tistory.com

참조 사이트

 

iOS) 메모리 구조 (Code, Data, Stack, Heap)

안녕하세여~~ 소들입니다 :-))))) 오늘 웬 듣보잡 버그 한 놈이 나왔는데 처음에 메모리 참조 오류인 줄 알고 하루 종일 메모리에 대해서 공부 했는데 버그 원인은 메모리가 아니었음ㅋ (디코딩 네

babbab2.tistory.com

댓글