프로세스의 구조

kimminjunnn·2025년 4월 5일

CS

목록 보기
4/34
post-thumbnail

프로세스의 메모리 구조

프로세스는 실행 중인 프로그램의 인스턴스로, 여러 메모리 영역으로 구성되어 있습니다. 이 영역들은 프로세스가 효율적으로 실행되도록 각기 다른 역할을 수행합니다.

주요 메모리 영역

메모리의 주소가 더 lower한 아래부터 정리하겠습니다.

  1. 코드 영역 (Code(or Text) Segment)

    • 프로그램의 실제 코드가 저장되는 곳입니다.
    • 실행할 명령어들이 기계어 형태로 저장(컴파일)되어 CPU에 의해 실행됩니다.
    • 읽기전용 영역이기에 프로세스가 함부로 변경할 수 없고, 변경하려고 한다면 오류를 발생시킵니다.
  2. 데이터 영역 (Data Segment)
    데이터 영역은 프로그램의 전역 변수와 정적 변수를 저장하는 메모리 구역으로, 초기화된 데이터와 초기화되지 않은 데이터 영역으로 나뉩니다.

  • 초기화된 데이터 영역 (.data)
    - 정의: 소스 코드에서 초기값이 정의된 전역 변수와 정적 변수를 저장하는 영역입니다.
    - 예시: int globalVar = 5; 와 같은 변수가 여기에 해당합니다.
    - 특징: 프로그램 실행 파일에 변수의 초기 값이 포함되어 있으며, 프로그램 시작 시 해당 값이 메모리에 로드됩니다.

  • 초기화되지 않은 데이터 영역 (BSS, Block Started by Symbol)
    - 정의: 초기값이 명시적으로 주어지지 않은 전역 변수와 정적 변수를 위한 공간입니다.
    - 예시: static int array[1000]; 또는 초기값이 지정되지 않은 int count; 같은 변수가 이 영역에 할당됩니다.
    - 특징: 변수들은 프로그램 시작 시 0으로 초기화되며, 실행 파일에는 이 변수들의 공간만 예약되어 있어 실제 데이터는 포함되지 않습니다. 이는 파일 크기를 절약하는 효과가 있습니다.

이렇게 초기화된 녀석들과 안된 녀석들의 영역을 구분해놓음으로서 실행 파일의 크기를 최소화하고 메모리 할당을 최적화할 수 있게 됩니다.
이는 프로그램 로딩 시간을 단축하고 시스템 자원을 효율적으로 사용할 수 있도록 돕습니다.

  1. 힙 영역 (Heap Segment)
    힙 영역은 프로그램의 동적 메모리 할당을 위한 공간으로, 프로그램 실행 중에 필요에 따라 메모리가 할당되고 해제됩니다.
  • 동적 메모리 할당: 힙은 프로그램의 실행 도중 필요에 따라 메모리를 할당하거나 해제할 수 있는 영역입니다. 예를 들어, 사용자로부터 입력받은 데이터의 크기에 따라 메모리를 동적으로 할당하는 경우 힙 영역이 사용됩니다.

  • 런타임 관리: 힙 영역의 메모리 관리는 운영 체제의 메모리 관리자에 의해 수행됩니다. 개발자는 malloc, free 등의 함수를 사용하여 직접 메모리를 할당하고 해제할 수 있습니다.

  • 메모리 해제의 중요성: 힙 영역에서 할당된 메모리는 사용이 끝난 후에 개발자가 명시적으로 해제해야 합니다. 해제되지 않은 메모리는 메모리 누수를 일으켜 프로그램의 성능 저하 또는 시스템의 안정성 문제를 초래할 수 있습니다.

malloc과 free 는 c언어인데 JS에서는 가비지 컬렉션(garbage collection)이라는 자동 메모리 관리 시스템을 사용해서, 개발자가 메모리를 직접 관리할 필요가 없다.
가비지 컬렉션은 프로그램이 더 이상 사용하지 않는 메모리를 자동으로 해제해주는 방식으로 작동한다. 이 과정은 모두 런타임에서 자동으로 처리되므로, JavaScript 개발자는 메모리 관리에 대해 신경 쓸 필요가 적어서, 코드를 좀 더 직관적으로 작성할 수 있다고한다.

  1. 스택 영역 (Stack Segment)

스택 영역은 프로그램 실행 중 함수 호출과 관련된 지역 변수, 매개변수, 리턴 주소 등을 저장하는 메모리 구역입니다.

  • LIFO 구조: 스택은 Last In, First Out (LIFO) 원칙에 따라 작동합니다. 가장 마지막에 삽입된 항목이 가장 먼저 제거됩니다. 이는 함수 호출과 반환 과정에서 매우 효율적으로 작동합니다.

  • 함수 호출과 스택 프레임: 함수가 호출될 때마다 그 함수의 실행에 필요한 매개변수, 지역 변수, 리턴 주소가 스택에 저장되는 '스택 프레임'이 생성됩니다. 함수가 종료되면 해당 스택 프레임은 스택에서 제거되고, 제어는 호출한 함수로 돌아갑니다.

  • 자동 메모리 관리: 스택 영역은 자동으로 관리되므로 개발자가 별도로 메모리를 할당하거나 해제할 필요가 없습니다. 함수가 끝나면 해당 함수에 할당된 스택 메모리가 자동으로 해제됩니다.

스택과 힙 사이의 빈 공간

스택과 힙 사이의 빈 공간은 메모리 관리 전략의 일부로, 다음과 같은 이유로 중요합니다.

주요 기능과 필요성

  • 성장 관리: 스택은 함수 호출에 따라 위로 주소가 증가하고, 힙은 동적 할당에 따라 아래로 주소가 성장합니다. 빈 공간은 이 두 영역이 서로 침범하지 않고 독립적으로 확장할 수 있도록 해줍니다.
  • 충돌 방지: 스택과 힙이 만나지 않도록 하여 데이터 오버라이트나 프로그램 오작동을 방지합니다.
  • 보안 강화: 빈 공간은 스택 오버플로우나 힙 오버플로우가 다른 메모리 영역으로 확산되는 것을 방지하여 보안을 향상시킵니다.

이 빈 공간은 프로그램의 유연성, 안정성 및 보안을 보장하는 데 필수적인 역할을 합니다.

profile
Frontend Engineers

0개의 댓글