ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Operating System - 프로세스 주소 공간
    Computer Science/Operating System 2022. 1. 5. 17:21

    메모리 영역

    ㆍ 프로그램이 CPU에 의해 실행되면, 프로세스가 생성되고 메모리에 프로세스의 주소 공간이 할당된다.

    ㆍ 프로세스 주소 공간에는 크게 Code, Data, Heap, Stack 영역이 존재한다.

     

    Code(Text) 영역

    ㆍ 우리가 작성한 소스코드가 들어가는 부분이다. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 Text 영역이라고도 부른다.

    ㆍ Code 영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.

    ㆍ 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only로 지정되어있다.

     

    Data 영역

    ㆍ 프로그램의 전역 변수와 정적 변수가 저장되는 영역이다. 즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.

    ㆍ 전역 변수, 정적 변수의 값을 참조한 코드는 컴파일을 하고 나면 Data 영역의 주소 값을 가리키도록 바뀐다.

    ㆍ Data 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

    ㆍ 실행 도중에 전역 변수가 변경될 수도 있으니, 이 영역은 Read-Write로 지정되어 있다.

    ㆍ 위 사진에서 표현되어있는 것처럼, 초기화된 데이터는 Data 영역에 저장되고, 초기화되지 않은 데이터는 BSS(Block Stated Symbol) 영역에 저장된다.

     

    Heap 영역

    ㆍ 런타임에 크기가 결정되는 메모리 영역이다.

    ㆍ 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

    ㆍ 참조형의 데이터의 값이 저장된다.

    ㆍ 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

    ㆍ Heap 영역과 Stack 영역은 같은 공간을 공유한다. Heap 영역이 메모리 위쪽 주소부터 할당되면 Stack 영역은 아래쪽부터 할당되는 방식이다. 이러한 이유 때문에, 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 heap overflow, stack overflow라고 한다.

     

    Stack 영역

    ㆍ 함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역이다.

    ㆍ Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 끝나면 소멸한다.

    ㆍ Primitive Type의 데이터가 값과 함께 할당된다.

    ㆍ Heap 영역에 생성된 Object Type의 데이터 참조값이 할당된다.

    ㆍ 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되는 특성을 가지고 있다.

    ㆍ 컴파일 타임에 크기가 결정되기 때문에 무한히 할당할 수 없다. 재귀 함수가 너무 깊게 호출되거나 함수가 지역 변수를 너무 많이 가지고 있어 Stack 영역을 초과하면 stack overflow 에러가 발생하게 된다.

     

    프로세스의 구역을 나눈 이유

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

    Code 영역은 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유한다. 예를 들면, 같은 프로그램을 여러 개 띄울 때 Code 영역을 공유할 수 있다.

    Stack 영역과 Data 영역을 나눈 이유는 스택 구조의 특성과 전역 변수의 활용성을 위한 것이다. 프로그램의 함수와 지역 변수는 LIFO 특성을 가진 스택에서 실행된다. 따라서, 이 함수들 안에서 공통으로 사용하는 전역 변수를 Data 영역에 따로 지정해주면 메모리를 아낄 수 있다.

     

    Data 영역과 BSS 영역을 구분하는 이유

    초기화되지 않은 변수는 프로그램이 실행될 때 영역만 잡아주면 되고, 그 값을 프로그램에 저장하고 있을 필요는 없다. 하지만, 초기화가 된 변수는 그 값도 프로그램에 저장하고 있어야 하기 때문에 별도의 영역으로 구분하는 것이다.

    이러한 이유 때문에, BSS 영역의 변수들이 많아져도 프로그램의 실행코드 사이즈를 늘리지 않는다.


    출처

    https://velog.io/@thms200/Process%EB%9E%80

     

    728x90

    댓글

Designed by Tistory.