컴퓨터 공학에서 말하는 Process
란 무엇일까?
간단하게나마 공부했던 내용을 정리해두려고한다.
- 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
(ex, Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역)
위에서 언급된 독립된 메모리 영역
이란 무엇일까?
(가장 간단해 보이는 그림으로 가져왔다!)
1) Code
2) Data
전역 변수
와 정적(static) 변수
가 저장되는 영역이다.(상위 그림에서는 표현되어있지 않지만,)
초기화 된 데이터는 Data 영역
에 저장되고,
초기화 되지 않은 데이터는 BSS(Block Stated Symbol)영역
에 저장된다.
왜 나눠서 저장하는지는 모르겠다.🤔
3) Stack
4) Heap
위에 정리한 설명을 보고 와닿지 않은 부분도 있고 추가로 궁금한게 있었다.
나는 동적으로 할당되고 해제된다.
라는 의미가 무엇인지 와닿지 않았다.
또 조금 더 이해하고 싶었던 점은 왜 참조형의 데이터는 Heap에 저장되는지 였다.
구글링을 좀 더 해보면 아래와 같은 내용을 확인할 수 있었다.
정적할당은 변수선언을 통해 필요한 메모리를 확보하는 것이고,
동적할당은 프로그램 실행 중 필요한 메모리를 확보하는 방법이다.
프로그램이 동작하면서 원하는 크기의 메모리를 사용해야 될 경우가 있다.
이러한 경우를 위해 일정한 크기를 선언해놓고
프로그램이 동작할 때 메모리를 할당해주는 영역을 힙 이라고 한다.
Heap은 프로그램에서 자유롭게 할당하고 해제할 수 있는 영역입니다.
공통적으로 하는 이야기는 Heap은 프로그램 실행 동안 사용하는 영역
이라는 점이다.
Number, String 처럼 크기가 정해진 원시형 데이터는 그 필요한 공간만큼만 메모리를 사용하면 된다.
그래서 컴파일 단계에서 얼마만큼의 메모리가 필요한지 예측된다.
즉, 원시형의 데이터는 Stack영역에 저장되므로, Stack 영역은 컴파일 단계에서 정해진다.
반면 크기가 정해져 있지 않은 참조형의 데이터는 필요한 메모리를 예측할 수 없다.
프로그램이 실행되는 동안 어떻게 사용하는지에 따라 필요한 메모리가 달라진다.
따라서 참조형의 데이터는 Heap에 저장해놓고,
프로그램을 사용하는 동안 필요한 메모리만큼 Heap의 영역을 사용하게 된다.
그래서 Heap이 동적으로 할당되고 해제되는 영역이라고 설명하는 것이었다.
메모리를 직접 컨트롤 하는 언어로 프로그래밍을 할 경우,
Heap 메모리영역을 사용했다면, 메모리 누수가 일어나지 않도록 해제하는 것도 중요하다.
자바스크립트는 메모리를 컨트롤 할 수 없는 언어이므로,
메모리를 할당하고 해제한다는 의미가 와닿지 않는게 어찌보면 당연했던 것 같다.ㅋㅋ
위의 그림처럼
Stack영역은 메모리의 주소값이 큰 값에서 작은 값으로 할당되고,
Heap은 메모리의 주소값이 작은 값에서 큰 값으로 할당된다.
이를 이해하기 위해
메모리 영역에 대한 또다른 그림을 보자.
Stack 영역의 오른쪽을 보면 Kernel(커널) 영역이 있다.
Kernel(커널) 영역
- 하나의 프로세스에 할당되는 총 메모리 공간 중 유저 영역을 제외한 나머지 영역이다.
- 운영체제라는 하나의 소프트웨어를 실행시키기 위해서 필요한 메모리 공간이다.
즉, 운영체제가 실행되기 위해서는 운영체제 역시 메모리에 올라가야 하고,
또 일반 프로그램처럼 실행되는 과정에서 변수 선언도 하고 메모리를 동적 할당하기도 한다.
이전에는 변수에 Stack 영역이 초과되는 크기의 데이터를 저장해서
커널영역을 침범해 데이터를 조작하는 방식으로 해킹했다고 한다.
이를 막기 위해 Stack은 큰 주소값에서 낮은 주소값으로 할당받는다.