2 분 소요

글에 들어가기 앞서…

이 포스팅은 서울시립대학교 인공지능학과 백형부 교수님의 ‘컴퓨터시스템’ 강좌의 중간고사 이전 범위 수업 내용에 대한 정리를 담고 있습니다.

수업 자료 출처: Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, 3rd Edition

기계 수준 프로그래밍 V: 메모리 배치

프로세스의 동작을 이해하기 위해 우리는 보통 추상 메모리 모델을 사용합니다. 이는 프로그램이 실제 물리 메모리에 직접 접근하는 대신, 운영체제가 관리하는 추상적인 메모리 공간에서 실행되기 때문입니다. 이런 접근 방식은 프로세스 관리를 훨씬 효율적으로 만들어줍니다. 이제 이러한 추상적 메모리 배치가 어떻게 이루어지는지 자세히 살펴보겠습니다.

x86-64 Linux Memory Layout

image-20240421161430276

컴퓨터 프로그램이 실행될 때, 운영 체제는 프로세스의 메모리를 여러 섹션으로 나누어 관리합니다. 주요 섹션으로는 스택(Stack), 힙(Heap), 데이터(Data), 그리고 텍스트(Text)가 있습니다.

  1. 스택 (Stack)
    • 스택은 함수 호출과 로컬 변수를 관리하는 데 사용되는 메모리 구역입니다. 함수가 호출될 때마다 그 함수의 매개변수, 지역 변수, 반환 주소가 스택에 저장됩니다. 함수가 종료되면 해당 정보는 스택에서 제거됩니다. 스택은 LIFO (Last In, First Out) 방식으로 동작합니다. 즉, 가장 마지막에 들어간 정보가 가장 먼저 나옵니다.
  2. 힙 (Heap)
    • 힙은 동적 메모리 할당을 위해 사용되는 메모리 구역입니다. 프로그램 실행 중에 필요한 메모리 공간의 크기가 변할 수 있는 경우, 힙에 메모리를 할당하고 해제할 수 있습니다. 예를 들어, malloc, calloc, new 같은 함수를 사용하여 힙에서 메모리를 할당 받을 수 있습니다. 힙은 스택과 달리 메모리를 할당하고 해제하는 순서가 자유롭습니다.
  3. 데이터 (Data)
    • 데이터 섹션은 프로그램의 전역 변수와 정적 변수를 저장하는 메모리 영역입니다. 데이터 섹션은 초기화된 데이터(BSS 세그먼트)와 초기화되지 않은 데이터를 별도로 관리할 수 있습니다. 초기화된 데이터는 프로그램이 시작될 때 이미 특정 값으로 설정된 변수들을 포함하며, 초기화되지 않은 데이터는 0 또는 NULL 값으로 초기화되는 변수들을 포함합니다. 예를 들어 static, string constant들이 여기에 해당됩니다.
  4. 텍스트 (Text)
    • 텍스트 섹션, 또는 코드 섹션은 프로그램의 실행 코드가 저장되는 메모리 영역입니다. 여기에는 프로그램이 실행될 때 CPU에 의해 실행되는 컴파일된 코드(기계어 코드)가 포함됩니다. 텍스트 섹션은 읽기 전용으로 설정되는 경우가 많아, 프로그램 실행 중에 이 영역의 내용을 변경하는 것은 일반적으로 허용되지 않습니다.

메모리 할당 예시

image-20240421161539831

이 코드를 분석하여 각 함수와 변수가 속하는 메모리 섹션을 설명하겠습니다.

  1. 텍스트 섹션(Text Section)

    • 프로그램의 실행 가능한 코드가 저장되는 부분입니다. 여기에는 useless 함수와 main 함수의 컴파일된 코드가 포함됩니다. 이 섹션은 읽기 전용이며 실행 중에 변경되지 않습니다.
  2. 데이터 섹션(Data Section)

    • 초기화된 전역 변수와 정적(static) 변수가 저장됩니다. 이 예제에서 int global = 0;char big_array[1L<<24];, 그리고 char huge_array[1L<<31];은 데이터 섹션에 위치합니다.
  3. 힙 섹션(Heap Section):

    • 동적 메모리 할당에 사용됩니다. malloc 호출을 통해 동적으로 할당된 메모리(p1, p2, p3, p4가 가리키는 메모리)는 힙 섹션에 위치합니다. 코드에서 p1에는 256MB, p2p4에는 각각 256B, p3에는 4GB의 메모리가 할당됩니다.
  4. 스택 섹션(Stack Section):

    • 함수 호출과 지역 변수를 관리하는 데 사용됩니다. 이 코드에서 int local = 0; 지역 변수와 p1, p2, p3, p4 포인터 변수들은 모두 main 함수의 스택 프레임 내에 할당됩니다.

다중 프로세스 메모리 배치

image-20240421162334845

다중 프로세스 환경에서 각 프로세스는 독립적인 추상 메모리 공간을 사용합니다. 이는 여러 함수가 하나의 추상 메모리 공간에 함께 올라가서 처리되는 것이 아니라, 각 프로세스가 자신만의 추상화된 메모리 공간을 가지고, 서로 간섭하지 않는 방식으로 작동합니다. 실제 물리적 메모리 상에서는 여러 프로세스가 동시에 존재하지만, 운영 체제의 메모리 관리 시스템은 각 프로세스에게 독립된 가상 주소 공간을 할당하여 관리합니다.

댓글남기기