[CS/컴퓨터구조] 메모리 구조

728x90

이미지 출처 TCPSchool

안녕하세요.

컴퓨터 프로그램이 실행될 때 메모리는 다양한 용도로 나뉘어 사용되는데요,

그래서! 오늘은 메모리의 각 영역이 어떻게 동작하는지에 대해서 정리해보도록 하겠습니다.

 

 

 

1. 코드(Code) 영역

  • 프로그램의 기계어 코드(실행할 프로그램의 코드/컴파일된 명령어)가 저장되는 메모리 공간
  • 컴파일된 프로그램의 명령어들이 이 영역에서 저장됨
  • 읽기 전용 : 보안 및 안정성을 위해 프로그램 실행 중 수정되지 않음
  • 고정 크기 : 실행되는 코드의 크기에 따라 공간이 할당됨
  • 공유 가능 : 동일한 프로그램을 여러 프로세스가 실행하는 경우 코드 영역은 공유될 수 있음
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // 코드 영역에 저장
    }
}

main() 메서드의 기계어 코드가 메모리의 코드 영역에 저장되며 이 코드는 프로그램이 실행되는 동안 그대로 유지됨

 

 

 

2. 데이터(Data) 영역

  • 전역 변수, 정적 변수(static variables)가 저장되는 공간
  • 영구성 : 프로그램이 실행되는 동안 유지되며 프로그램이 종료될 때까지 살아있음
  • 코드 영역처럼 읽기 전용이 아니며 수정 가능
public class DataExample {
    static int counter = 0; // 데이터 영역에 저장
    int globalVar = 10;     // 전역 변수, 데이터 영역에 저장
}

counter와 globalVar는 프로그램이 실행되면 데이터 영역에 저장되며 프로그램이 종료될 때까지 그 값을 유지함

 

 

 

3. 스택(Stack) 영역

  • 지역 변수와 함수 호출 정보가 저장되는 공간
  • LIFO(Last In First Out) 구조를 가짐
  • 함수가 호출되면 해당 함수의 지역 변수, 매개변수 등이 스택에 저장되고 끝나면 자동으로 제거됨 -> 고급 언어(ex. 자바, 파이썬 등)에서는 이 과정을 자동으로 관리하지만, 저급 언어(ex. C)에서는 수동으로 메모리 해제를 해줘야 함
  • 메모리 접근 속도가 매우 빠르지만 메모리의 크기가 고정(제한적)되어 있음
  • 스택 오버플로우 위험!! : 너무 많은 데이터를 스택에 저장하려 하면 스택 오버플로우(Stack Overflow) 오류 발생
public void stackExample() {
    int x = 10;
    int y = 20; // 둘 다 스택에 저장
}

위 자바코드에서 x와 y는 함수가 실행될 때 스택에 할당되었다가 함수가 종료되면 자동으로 제거됨

 

 

 

4. 힙(Heap) 영역

  • 객체, 배열과 같은 데이터가 저장
  • 동적 할당 : 동적 메모리 할당이 이루어지는 공간. new 키워드나 메모리 할당 함수를 사용해 메모리를 동적으로 할당
  • 크기가 유연하지만 메모리 해제가 늦어질 경우 성능에 영향을 줄 수 있음
  • 메모리 해제 : 자바에서는 가비지 컬렉터가 자동으로 메모리를 관리하지만(그 외 고급 언어도 관리해주는 게 있음) C, C++같은 저급 언어에서는 프로그래머가 직접 메모리를 해제해야함
Cat cat = new Cat("뭉이"); // 힙에 객체 저장

위 코드에서 Cat 객체는 힙에 할당되고, 스택에 있는 cat 변수는 이 힙에 할당된 객체를 참조함

 

 

 

요약

메모리 영역 설명 용도
코드(Code) 영역 프로그램의 실행 코드가 저장되는 읽기 전용 영역 명령어 저장
데이터(Data) 영역 전역 변수, 정적 변수가 저장되는 공간 전역 변수, 정적 변수 저장
스택(Stack) 영역 함수 호출 시 지역 변수와 매개변수가 저장되는 고정 크기 메모리 공간 지역 변수, 함수 호출 데이터 저장
힙(Heap) 영역 동적 메모리 할당을 위한 유연한 공간 객체, 배열 등의 동적 데이터 저장

 

 

 

728x90

'CS > 컴퓨터구조' 카테고리의 다른 글

[CS/컴퓨터구조] 3. 명령어  (1) 2024.01.15
[CS/컴퓨터구조] 2. 데이터  (1) 2024.01.14
[CS/컴퓨터구조] 1. 컴퓨터 구조 시작하기  (0) 2024.01.14