Process Address Space
프로그램이 실행되면 메모리에 할당되는 것

 

 

프로세스는 CPU에 의해서 실행이 되고 memory에 저장이 된다.

프로그램이 실행되면 프로세스 주소 공간이 memory에 할당(생성)되는데, 할당 된 프로세스를 실행시키는 것은 CPU가 한다.

구성요소

Address Space안은 위 그림과 같이 Code, Data, Stack 부분으로 이루어져 있다.

 

1) Code(Text)

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

2) Data

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

(상위 그림에서는 표현되어있지 않지만,) 초기화 된 데이터는 Data 영역에 저장되고,초기화 되지 않은 데이터는 BSS(Block Stated Symbol)영역에 저장된다.

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

 

3) Stack

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



Q. 왜 Code 부분을 따로 두었나?
Program의 Code는 Program이 만들어지고(컴파일되고) 나서는 바뀔 일이 전혀 없다. (따라서 Read Only)
그렇기 때문에 같은 프로그램을 실행시켜 몇 개의 Prcess가 실행되더라도 같은 프로그램이라면 Code 부분은 다 똑같은 내용을 가지고 있게 된다.
따라서 같은 Program의 Process일 경우 Code 부분을 공유(Share)하여 메모리 사용량을 줄이는 목적입니다.
Q. 왜 Stack 부분과 Data 부분을 나누었나? 
Stack 구조는 아래의 사진과 같이 이루어져 있다. (하단 부가 막혀있고 상단 부가 뚫려있는 구조)
따라서 한 쪽으로만 데이터를 집어 넣을 수 있고 꺼낼 때는 최근에 집어넣었던 것 부터 꺼낼 수 밖에 없는 구조 C언어를 예로 들면 함수의 호출이 stack 구조로 되어있다고 볼 수 있다.
전역변수는 어떤 함수에서도 접근할 수 있기 때문에 Data로 따로 관리해준다.

 

<stack 구조>

main 함수부터 실행되며 

처음 printf를 수행한 뒤 함수 func1 실행

함수 func1 실행 후 main 에서 다시 printf를 실행하고 함수 func2 실행

tunc2에서 printf를 수행하고 func3실행

 

이러한 stack 구조로 인해 data 부분과 stack 부분을 따로 나누어 둔 것이다.
전역 변수(global variables)는 어떤 함수에서도 접근 할 수 있기 때문에 Data로 따로 관리를 해주는 것

 

 


Reference.

link1 link2 link3

+ Recent posts