본문 바로가기

시스템

[시스템 프로그래밍] 프로그램과 프로세스

목차
1. 들어가며
2. 프로그램과 프로세스
3. 프로세스 메모리
4. 스택프레임
5. 마치며

 

 

들어가며

 프로그램과 프로세스는 시스템 프로그래밍 과목에서 초반부에 다뤄지는 내용이며 면접 질문으로도 종종나오는 주제이다. 오늘은 프로그램과 프로세스, 그리고 프로세스 메모리와 스택프레임의 개념까지 더하여 프로그램의 전체적인 흐름을 정리해보려고 한다.

 

 

프로그램과 프로세스

더보기

 프로그램이란 무엇일까? 프로그램의 사전적 정의는 어떤 작업을 하기위해 해야할 일들을 순서대로 나열한 것이다. 단순히 파일 시스템에 존재하는 실행파일을 의미한다. ex) Window 기준 .exe 파일 

 

 

 

 

 

 그렇다면 프로세스란 무엇인가? 위키백과에서는 프로세스에 대해 다음과 같이 정의하였다.

 

 

프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 프로그램이다. 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다.

 

 

 

 

 위의 정의에서 추론할 수 있듯이 프로세스는 컴퓨터에서 현재 실행중인 프로그램이다. 리눅스 운영체제를 기준으로 아래와 같이 현재 실행중인 프로세스들의 PID와 자세한 정보들을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 결론적으로 우리는 프로세스를 현재 실행중인 프로그램으로 정의할 수 있다. 그렇다면 그 이후의 과정은 어떻게 될까? 프로그램이 실행되면 컴퓨터에서는 어떤 일이 일어날까? 실행중인 프로그램의 수를 늘려가다보면 프로그램을 무한히 실행할 수 있을까? 불가능하다면 왜 일까?

 

 

 

 이러한 의문들에 대해 생각해보기전에 우리는 프로세스 메모리와 스택프레임 등에 대해 알아봐야한다. 이 개념들에 대해 알게되면 이러한 의문들은 자연스럽게 해결될 것이다.

 

프로세스 메모리

더보기

 프로그램을 실행하기 위해서는 메모리에서 프로그램 실행에 필요한 공간을 할당해 주어야한다. 우리는 이 과정을 메모리에 적재된다고 표현하기도 한다.

 

 

 

 

 

 여기서 메모리라 함은 컴퓨터 하드웨어 중에서는 램이라고 불리는 저장장치이다. 용량이 적은데 비해 속도가 굉장히 빠르기에 프로세스를 띄우기 위해서는 이 램에서 프로세스를 위한 공간을 할당받아야 CPU에서 램에 있는 데이터를 활용하여 연산이 가능해지게 되는 것이다.

 

 

 

 

 

 물론 램의 경우 SSD, HDD등의 보조 저장장치보다 용량이 매우 작기에 공간을 효율적으로 활용해야한다. 따라서 프로그램 실행시에 프로그램의 모든 내용을 메모리(램)에 올리지는 않는다. 이는 '가상 메모리'라는 기술을 활용하기 때문인데, 가상 메모리에 대해서는 다른 포스팅에서 정리할 계획이다. 이 글에서는 단순히 프로세스의 현재 실행을 위한 부분만을 메모리에 올린다고 이해하면 될 것이다.

 

 

 

 

 

 

 

"프로세스 메모리란 무엇인가?"

 

 

프로세스 메모리

 

 

 

 

 컴퓨터 공학쪽을 전공한 사람이라면 한번씩 스택 메모리, 힙 메모리 등에 대해 들어본 적이 있을 것이다. 이 메모리들 외에도 코드 영역, 데이터 영역을 합쳐 프로세스 메모리라고 부르게된다.

 

 

 

 프로세스 메모리는 앞서 언급하였듯이 프로세스를 띄우기위해 메모리로부터 할당받는 공간을 의미하며, 스택 메모리, 힙 메모리, 코드 영역, 힙 영역으로 구분된다. 프로세스 메모리가 프로세스 실행을 위한 메모리상의 공간임을 알았으니, 각각의 영역이 어떤 역할을 하는지 정리해보자.

 

 

 

1. 코드 영역

- 프로그램의 실행 코드가 저장되는 영역

 

 

 코드 영역은 텍스트 영역이라 불리기도 하며 프로세스 동작을 위한 코드들이 저장되어 있는 영역이다. 프로그램 명령이 위치하는 곳이다.

 

 

 

 

2. 데이터 영역

- 전역 변수, 정적 변수등 프로그램 실행 중에 변하지 않는 데이터가 저장되는 영역

 

 

 프로그램에서 전역 변수나 static 키워드 등으로 선언된 정적 변수들이 저장되는 영역이다. 데이터 영역에 저장된 데이터들은 프로그램이 실행되고 내려갈 때까지 메모리에 남아있게 된다.

 

 

 

 

 

3. 힙 영역

- 프로그램 실행 중에 동적으로 할당되는 메모리 영역

 

 

 프로그램이 실행되는 동안 사용자에 의해 관리되어 할당, 해제가 자유롭게 이뤄지는 영역이다. new 키워드 등으로 새로운 객체의 인스턴스를 생성하거나 malloc 등을 통해 메모리 공간을 할당받거나 delete, free 등의 키워드를 통해 사용이 완료된 메모리를 반환한다.

 

 

 

 C#이나 Java와 같은 일부 객체지향 언어들은 GC(garbage collector)가 존재하기에 메모리 해제에 민감할 필요는 없으나 C/C++등의 언어에서는 사용이 되지 않는 동적 메모리에 대해 자동으로 해제 되지 않으므로 동적 할당 시에 주의 가 필요하다.

 

 

 

 사용이 완료된 동적 메모리가 반환되지 않고 계속 남아있게 되어 메모리공간을 차지하게 되버리는 상황을 메모리 릭(Memory Leak)이라고 말한다. 

 

 

 

 

 

4. 스택 영역

- 함수 호출 시 지역 변수, 매개 변수, 반환 주소 등이 저장되는 영역

 

 

 힙 영역과 달리 프로세스가 실행되면서 자동으로 할당 해제가 이뤄지는 영역이다. 스택 영역과 힙영역은 사실 상 같은 공간을 사용하게 되는데, 때문에 스택이 힙 영역을 침범하는 경우를 Stack Overflow, 그 반대의 경우를 Heap Overflow라고 부른다.

 

 

 프로그램의 코드에서 함수를 호출하게 되면 스택 프레임이 생성되며 스택프레임에 공간을 할당받게 되며, 함수 반환시 스택 포인터가 원래의 위치로 이동하며 스택 프레임에 의해 사용했던 공간을 다시 반환하게 된다.

 

 

 

 

 

 

 

 

"스택 프레임이란 무엇인가?"

 

 

 

 

 함수를 호출하게 되면 스택 프레임이 생성되며 스택 공간을 차지하게되고, 함수 반환시에 다시 함수 포인터가 함수 호출 이전의 위치로 이동하여 스택영역에서 할당받은 공간을 반환한다고 언급하였다. 그렇다면 스택 프레임이란 무엇일까? 스택영역에 대해 완벽히 이해하기 위해선 스택 프레임에 대해 알아볼 필요가 있다. 다음 목차에서 알아보도록하자.

 

 

스택프레임

더보기

 

 

프로세스 메모리의 구조

 

 

 앞서 설명한 프로세스 메모리의 구조를 나타내면 위와 같이 나타낼 수 있다. 주의 깊게 봐야할 부분은 스택 영역은 메모리의 높은 주소부터 낮은 주소로 데이터를 기록하고, 힙 영역은 반대로 낮은 주소에서 높은 주소로 올라감을 확인 할 수 있다.

 

 

 

 프로그램에서 함수가 호출이 되면 스택 프레임이 생성되고, 함수가 반환되면 스택 프레임이 해제된다. 여기서 스택 프레임이 해제 된다는 것은 스택 포인터가 함수를 호출하기 이전 위치로 올라감을 의미한다.

 

 

 

 

 

 

 

 

 

"스택 포인터?"

 

 

 

 

 스택 포인터는 메모리의 스택 영역에서 가장 최근에 저장된 데이터의 위치를 가리키는 포인터를 의미하며, 스택의 맨 꼭대기를 가리키는 포인터라고 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 스택 프레임의 생성과 해제는 위의 그림을 참고하여 이해할 수 있다. 함수 호출 시 현재 위치를 기록 후 새로운 함수 호출에 대한 값들을 저장하기 시작한다. 그 후 함수가 반환되면 함수를 호출하기 이전 위치로 스택 포인터를 되돌린다.

 

 

마치며

 글을 전체적으로 정리하자면 프로세스는 프로그램이 실행되어 메모리상에 올라와 있는 상태를 의미하며,  프로세스 실행을 위해 메모리에 할당을 받는 공간은 역할에 따라 구분이 된다. 프로세스 메모리에서 스택 프레임은 함수 호출시에 생성이 되며 함수 반환 시에 함수포인터를 되돌리며 스택 프레임에 할당된 공간을 해제한다. 이 정도로 정리할 수 있다.