컴퓨터 공학에서 말하는 Process란 무엇일까?
간단하게나마 공부했던 내용을 정리해두려고한다.

Process란?

  • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
    (ex, Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역)

위에서 언급된 독립된 메모리 영역 이란 무엇일까?
(가장 간단해 보이는 그림으로 가져왔다!)
메모리 영역

1) Code

  • 실행할 프로그램의 코드가 저장되는 영역 or 텍스트(code) 영역이다.

2) Data

  • 프로그램의 전역 변수정적(static) 변수가 저장되는 영역이다.
    즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

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

3) Stack

  • 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
  • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

4) Heap

  • 런타임에 크기가 결정되는 메모리 영역이다.
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
  • 참조형의 데이터의 값이 저장된다.
  • Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

위에 정리한 설명을 보고 와닿지 않은 부분도 있고 추가로 궁금한게 있었다.

👉 Heap은 동적으로 할당되고 해제되는 영역이다?

나는 동적으로 할당되고 해제된다.라는 의미가 무엇인지 와닿지 않았다.
또 조금 더 이해하고 싶었던 점은 왜 참조형의 데이터는 Heap에 저장되는지 였다.

구글링을 좀 더 해보면 아래와 같은 내용을 확인할 수 있었다.

정적할당은 변수선언을 통해 필요한 메모리를 확보하는 것이고,
동적할당은 프로그램 실행 중 필요한 메모리를 확보하는 방법이다.

프로그램이 동작하면서 원하는 크기의 메모리를 사용해야 될 경우가 있다.
이러한 경우를 위해 일정한 크기를 선언해놓고
프로그램이 동작할 때 메모리를 할당해주는 영역을 힙 이라고 한다.

Heap은 프로그램에서 자유롭게 할당하고 해제할 수 있는 영역입니다.

공통적으로 하는 이야기는 Heap은 프로그램 실행 동안 사용하는 영역이라는 점이다.

Number, String 처럼 크기가 정해진 원시형 데이터는 그 필요한 공간만큼만 메모리를 사용하면 된다.
그래서 컴파일 단계에서 얼마만큼의 메모리가 필요한지 예측된다.
즉, 원시형의 데이터는 Stack영역에 저장되므로, Stack 영역은 컴파일 단계에서 정해진다.

반면 크기가 정해져 있지 않은 참조형의 데이터는 필요한 메모리를 예측할 수 없다.
프로그램이 실행되는 동안 어떻게 사용하는지에 따라 필요한 메모리가 달라진다.
따라서 참조형의 데이터는 Heap에 저장해놓고,
프로그램을 사용하는 동안 필요한 메모리만큼 Heap의 영역을 사용하게 된다.

그래서 Heap이 동적으로 할당되고 해제되는 영역이라고 설명하는 것이었다.

메모리를 직접 컨트롤 하는 언어로 프로그래밍을 할 경우,
Heap 메모리영역을 사용했다면, 메모리 누수가 일어나지 않도록 해제하는 것도 중요하다.

자바스크립트는 메모리를 컨트롤 할 수 없는 언어이므로,
메모리를 할당하고 해제한다는 의미가 와닿지 않는게 어찌보면 당연했던 것 같다.ㅋㅋ

👉 Stack은 높은 → 낮은 주소, Heap은 낮은 → 높은 주소로 할당?

Stack, Heap

위의 그림처럼
Stack영역은 메모리의 주소값이 큰 값에서 작은 값으로 할당되고,
Heap은 메모리의 주소값이 작은 값에서 큰 값으로 할당된다.

이를 이해하기 위해
메모리 영역에 대한 또다른 그림을 보자.
메모리영역

Stack 영역의 오른쪽을 보면 Kernel(커널) 영역이 있다.

Kernel(커널) 영역

  • 하나의 프로세스에 할당되는 총 메모리 공간 중 유저 영역을 제외한 나머지 영역이다.
  • 운영체제라는 하나의 소프트웨어를 실행시키기 위해서 필요한 메모리 공간이다.

즉, 운영체제가 실행되기 위해서는 운영체제 역시 메모리에 올라가야 하고,
또 일반 프로그램처럼 실행되는 과정에서 변수 선언도 하고 메모리를 동적 할당하기도 한다.

이전에는 변수에 Stack 영역이 초과되는 크기의 데이터를 저장해서
커널영역을 침범해 데이터를 조작하는 방식으로 해킹했다고 한다.

이를 막기 위해 Stack은 큰 주소값에서 낮은 주소값으로 할당받는다.

#. 참고자료

profile
꾸준히, 끄적끄적 해볼게요 :)

0개의 댓글