프로세스의 주소 공간

June·2022년 1월 19일
0
post-thumbnail

프로그램이 CPU에 의해 실행됨 → 프로세스가 생성되고 메모리에 프로세스 주소 공간이 할당됨

1. Code(Text)

  • 작성한 소스코드가 들어가는 부분으로, 프로그램 소스코드가 저장되는 영역이다.
  • Code영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
  • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정되어 있다.

2. Data

  • 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
  • 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
  • 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다.
    (상위 그림에서는 표현되어있지 않지만,) 초기화 된 데이터는 Data 영역에 저장되고,초기화 되지 않은 데이터는 BSS(Block Stated Symbol)영역에 저장된다.

3. Stack

  • 지역 변수와 매개변수가 저장되는 영역이다.
  • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다. 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.

4. Heap

  • 런타임에 크기가 결정되는 메모리 영역이다.
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 참조형의 데이터의 값이 저장된다.
  • 예를 들어 클래스, 클로저가 이 부분에 해당 된다.
  • Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • HEAP과 STACK영역은 사실 같은 공간을 공유한다. HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭합니다.

이렇게 구역을 나눈 이유는?

  • 최대한 데이터를 공유하여 메모리 사용량을 줄여야 한다.
  • Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유한다.
  • Stack과 data를 나눈 이유는, 스택 구조의 특성과 전역 변수의 활용성을 위한 것이다.

data영역과 bss 영역을 구분하는 이유는 무엇?

초기화되지 않은 변수는 프로그램이 실행될 때 영역만 잡아주면 되고 그 값을 프로그램에 저장하고 있을 필요는 없으나 초기화가 되는 변수는 그 값도 프로그램에 저장하고 있어야 하기 때문이다. 따라서 bss 영역 변수들이 많아져도 프로그램의 실행코드 사이즈를 늘리지 않는다.

출처

  1. https://gona.tistory.com/4 [건강한개발자]
  2. https://dar0m.tistory.com/258
  3. https://gyoogle.dev/blog/computer-science/operating-system/Process%20Address%20Space.html
profile
회사와 “함께” 성장하는 개발자

0개의 댓글