All Articles

운영체제 메모리 구조

운영체제는 프로그램의 실행을 위해 다양한 메모리 영역을 제공한다. 코드 영역, 데이터 영역, 스택 영역, 힙 영역이다. 코드 영역과 데이터 영역을 정적 세그먼트, 스택 영역과 힙 영역을 동적 세그먼트로 분류한다.

정적 세그먼트(Static Segment)

코드(Code) 영역

실행할 프로그램의 코드가 저장되는 부분이다.

  • Read Only 영역이다.
  • 텍스트 영역이라고도 부른다고 한다.
  • 프로세스가 종료될 때까지 계속 유지되는 영역이다.
  • 컴파일 시 크기가 결정된다.

데이터(Data) 영역

전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장되는 부분이다.

  • 런타임 시 크기가 결정된다.

스택(Stack) 영역

지역변수, 매개변수, 리턴 값 등 임시로 사용하는 것들을 저장하는 영역이다.

  • 함수 호출 시 생성되고, 함수 종료시 반환된다.
  • 이름 값 한다. LIFO(Last In First Out)이다.
  • 컴파일 시 크기가 결정된다.
  • 코드, 데이터, 힙과 다르게, 스택은 쓰레드마다 구분되어 존재한다. (참고: [프로세스와 쓰레드])
  • Stack 메모리는 액세스(생성과 삭제 등)가 모두 매우 빠르다는 장점이 있다.
  • CPU에 의해 영역이 효율적으로 관리되며, 개발자가 변수를 명시적으로 할당/해제할 필요가 없다.
  • 크기가 비교적 제한된다.

동적 세그먼트(Dynamic Segment)

힙(Heap) 영역

개발자가 동적으로 사용하는 영역이다. 객체 타입의 변수를 할당하는데 사용한다.

  • malloc, free 또는 new, delete 에 의하여 할당/반환되는 영역이다.
  • 기본적으로 “사용할 때마다” OS에게 메모리를 새로 빌려와서 할당하는 방식이다. 즉, 변수를 할당하고 해제하는 책임이 있다.
  • 메모리를 제대로 관리하지 않으면 메모리가 조각화되는데 이를 메모리 누수(Memory Leak)라고 한다.

    • Java와 C++과 같이 garbage collector가 존재하는 경우 자동으로 관리(반환)된다.
    • 참고: [garbage collection]
  • 런타임 시 크기가 결정된다.
  • 스택과 다르게, 쓰레드가 아닌 프로세스 단위로 존재하는 영역이다.
  • 스택 대비 상대적으로 액세스(생성과 삭제 등)가 느리다.
  • 스택 대비 더 큰 메모리를 사용할 수 있다.

Buffer Overflow

할당된 메모리 영역 이상으로 사용하여 넘쳐버리는 걸 Buffer Overflow라고 한다. Heap 영역이 커지면 Stack 영역이 작아지게 되고, Stack 영역이 커지면 Heap 영역이 작아지게 된다.

Heap Overflow

heap에 할당된 메모리의 범위를 넘어버려서 stack 영역을 침범하는 것

Stack Overflow

stack에 할당된 메모리의 범위를 넘어버려서 heap 영역을 침범하는 것


[참고자료]
https://courses.engr.illinois.edu/cs225/sp2022/resources/stack-heap/
인프런