[OS] 프로세스 주소 공간

foresec·2023년 7월 13일
0

Computer Science

목록 보기
18/28

프로세스 주소 공간

프로세스가 메모리를 할당 받으면, 자신만의 방법으로 메모리를 관리하기 위해 공간을 특정 구조로 관리하는데, 이를 프로세스 주소 공간이라 함

한정된 메모리가 주어지기 때문에 프로세스가 메모리를 절약하려고 시도함.

간략히 Code 부분은 프로그램 소스 코드 저장/Data는 전역 변수 저장/Stack은 함수와 지역변수를 저장함

Stack

함수의 호출과 관계되는 지역변수매개변수가 저장되는 영역

  • Stack 영역의 값은 함수의 호출과 함께 할당, 호출완료시에는 소멸됨
  • 메모리의 높은 주소에서 낮은 주소 방향으로 할당됨
  • 재귀함수가 너무 깊게 호출되거나, 함수가 지역변수를 너무 많이 가져 Stack영역 초과시 stack overflow에러가 발생함

Heap

런타임의 크기가 결정되는 영역

  • 사용자에 의해 고간이 동적을 할당 및 해제됨
  • 주로 참조형 데이터(ex) 클래스) 등의 데이터가 할당됨
  • 메모리의 낮은 주소엣 높은 주소의 방향으로 할당

Data

전역 변수Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역

  • 어떤 프로그램에 위와 같은 변수를 참조하는 코드가 존재한다면, 이 프로그램은 컴파일 된후 data 영역을 참조함
  • 프로그램의 시작과 함께 할당, 프로그램 종료시 소멸
  • 초기화 되지 않은 변수가 존재한다면 BSS 영역에 저장됨

Text(Code)

프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
프로그램이 수정되면 안되기 때문에 ReadOnly 상태로 저장되어 있음

속도는 Stack > Data > Code > Heap

구역을 나눈 이유

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

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

Stack과 data를 나눈 이유는, 스택 구조의 특성과 전역 변수의 활용성을 위한 것임. 함수호출과 관련이 있는데, 함수가 실행되면 관련 데이터와 지역 변수들이 스택에 저장되고 끝날시 위 정보들이 제거됨.

이렇게 프로그램의 함수와 지역 변수는, LIFO(가장 나중에 들어간게 먼저 나옴)특성을 가진 스택에서 실행됨. 따라서 이 함수들 안에서 공통으로 사용하는 '전역 변수'는 따로 데이터 영역에 저장되며 공유되어 함수 간 데이터 공유가 용이해지고 메모리를 절약할 수 있음.

Stack과 Heap의 경우, 실제 객체는 Heap 영역에서 관리되고, Stack에 등장하는 각 변수들은 Heap 영역에 위치한 실제 Object의 참조를 가지고 있음. 즉, Stack의 크기가 생각보다 클 필요가 없음.
Stack은 생성과 동시에 크기가 정해지고 변화가 없으므로 Heap과 다르게 크기의 제한을 받음. Stack Overflow와 같은 문제도 힙 영역을 침입해서가 아닌 정해진 Stack영역의 크기를 초과해서 발생한 문제


참고
https://devsin88.tistory.com/100
https://gyoogle.dev/blog/computer-science/operating-system/Process%20Address%20Space.html

profile
왼쪽 태그보다 시리즈 위주로 구분

0개의 댓글