새소식

이론/운영체제

프로세스의 메모리 영역

  • -

프로세스는 실행 중인 프로그램이며 프로그램 자체가 프로세스는 아니다. 

 

1. 프로세스와 프로그램의 차이

메모리 영역을 설명하기에 앞서 프로세스와 프로그램의 차이를 알아보자.

둘의 차이는 매우 명확하다. 프로그램은 보조 기억장치(하드디스크, SSD)에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음으로 그 자체로는 생명이 없다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 생명이 있는 프로세스가 된다. 그래서 프로세스는 실행 중인 프로그램이라고 하는 것이다.

 


2. 메모리 영역

 

메모리 영역

메모리 영역을 그림으로 표현하면 위와 같으며, stack 영역으로 갈수록 상위 주소이다. 

 

구분 설명
Text 영역 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역
Data 영역 전역/정적변수, 배열, 구조체 등이 위치하는 곳으로 초기화 된 데이터는 data 영역, 초기화 되지 않은 데이터는 BSS 영역에 저장된다.
Heap 영역 동적 메모리 할당을 위한 영역 (malloc(), new() 사용)
Stack 영역 지역/매개변수, 리턴 값 등이 잠시 사용되었다가 사라지는 데이터를 저장하는 영역

각 영역에 대한 설명은 위 표와 같다.

 

 

메모리 영역을 공부하면서 필자가 궁금했던 것 3가지를 밑에 정리하였다.

 

1) data영역과 bss 영역을 구분하는 이유는 무엇인가?

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

 

 

2) 지역변수와 달리 정적변수의 값이 변하는 이유는 무엇인가?

 

#include <stdio.h>

void addLocal()
{
    int num1 = 0;
    printf("지역변수 : %d\n", num1);
    num1++;
}

void addStatic()
{
    static int num2 = 0;
    printf("전역변수 : %d\n", num2);
    num2++;
}

int main()
{
    addLocal();
    addLocal();
    addLocal();

    addStatic();
    addStatic();
    addStatic();
    return 0;
}

위와 같은 코드가 있다고 하자. C언어를 알고 있다면 위 프로그램의 결과를 예상할 수 있을 것이다.

 

실행결과

지역변수는 addLocal() 함수를 벗어나면 값이 사라지고 다시 addLocal() 함수를 호출했을 대 이전 결과와는 상관없이 새로운 변수가 생성되고 정적변수는 함수를 벗어나더라도 변수가 사라지지 않고 계속 유지된다.

 

이러한 현상이 발생하는 이유를 메모리 영역으로 생각해보자. 지역변수는 동적 할당 영역에 존재하는데 동적으로 생성 및 삭제가 되는 힙, 스택 영역과는 달리 정적 할당 영역에 존재하는 정적변수는 프로그램이 종료될 때 사라지기 때문에 위와 같은 결과가 나오는 것이다.

 

 

3) 힙, 스택 영역 사이의 공간이 있는데 이 두개의 영역이 만나면 어떻게 될까?

Heap overflow와 Stack overflow가 발생한다. Heap overflow는 heap이 위에서부터 주소 값을 채우면서 내려오다가 stack 영역을 침범하는 경우 발생하고 Stack overflow는 stack이 heap 영역을 침범했을 때 발생한다.

 

각각의 오버플로우에 대한 설명은 다른 포스팅에서 하도록 하겠습니다.

 

 

'이론 > 운영체제' 카테고리의 다른 글

커널(Kernel)  (0) 2020.07.09
운영체제(Operating System)  (0) 2020.07.04
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.