프로세스 주소 공간

이상우·2022년 1월 19일
0

메모리 영역


1)Text 영역

  • 우리가 작성한 소스코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역 이라고도 부른다.
  • 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
  • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다.
    2)Data 영역
  • 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.
  • 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
  • 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다.
    *data영역과 bss 영역을 구분하는 이유
    초기화되지 않은 변수는 프로그램이 실행될 때 영역만 잡아주면 되고 그 값을 프로그램에 저장하고 있을 필요는 없으나 초기화가 되는 변수는 그 값도 프로그램에 저장하고 있어야 하기 때문이다. 따라서 bss 영역 변수들이 많아져도 프로그램의 실행코드 사이즈를 늘리지 않는다.

3)Stack 영역

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

여러 사이트를 보았는데 너무 비슷하였고, 따라서 이해하는 목적으로 따라 적으면서 이해를 하려고 노력했다.

면접 예상 질문

Q.프로세스의 구역을 나눈 이유가 무엇인가?
최대한 데이터를 공유하여 메모리 사용량을 줄이기 위함입니다.
Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유합니다.
예를들면 같은 프로그램을 여러개 띄울때 Code영역을 공유할 수 있습니다.
Stack과 데이터를 나눈 이유는, 스택 구조의 특성과 전역 변수의 활용성을 위함 입니다.

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

참고 사이트

profile
구상한것을 구현할 수 있는 개발자가 되고 싶습니다.

0개의 댓글