배워서 남주는 개발자 :)

CS

프로세스 주소공간

핏짜보이 2022. 4. 15. 23:10
반응형

 


1. Text(Code) 영역

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

 

2. Data 영역

  • 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
  • 즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.
  • 전역변수, static 값을 참조한 코드는 컴하일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸된다.
  • 실행 도중에 전역변수가 바뀔수도 있어서 해당 영역은 Read-Write로 지정되어 있다.

 

3. Stack 영역

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

 

4. Heap 영역

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

 

=> Code/ Data/ BSS컴파일 타임에 따라 크기가 결정되고 이후로 변동되지 않는다. (고정)

     Stack/ Heap런타임시에 메모리 사용이 결정된다. Heap은 아래로 Stack은 위로 주소값을 메긴다.

 


 

FAQ

Q) 프로세스의 구역을 나눈 이유는?

A)

최대한 데이터를 공유하여 메모리의 사용량을 줄이기 위함.

Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유함.

예를 들어, 같은 프로그램 여러개를 띄울때, Code영역을 공유할 수 있음.

Stack과 Data를 나눈 이유는 스택구조의 특성과 전역변수의 활용성을 위함.

 

Q) Data영역과 BSS영역구분하는 이유는?

A)

초기화 되지 않은 변수는 프로그램이 실행될 때 영역만 설정해주면 되고, 그 값을 프로그램에 저장하고 있을 필요가 없음.

하지만 초기화 되는 변수는 그 값도 프로그램에 저장하고 있어야하기 때문.

따라서 bss 영역의 변수들이 많아져도 프로그램의 실행코드 사이즈를 늘리지 않음.

 

 

 

 

 

참고자료

 

 

 

 

728x90