
프로세스는 실행 중인 프로그램의 인스턴스로, 여러 메모리 영역으로 구성되어 있습니다. 이 영역들은 프로세스가 효율적으로 실행되도록 각기 다른 역할을 수행합니다.

메모리의 주소가 더 lower한 아래부터 정리하겠습니다.
코드 영역 (Code(or Text) Segment)
데이터 영역 (Data Segment)
데이터 영역은 프로그램의 전역 변수와 정적 변수를 저장하는 메모리 구역으로, 초기화된 데이터와 초기화되지 않은 데이터 영역으로 나뉩니다.
초기화된 데이터 영역 (.data)
- 정의: 소스 코드에서 초기값이 정의된 전역 변수와 정적 변수를 저장하는 영역입니다.
- 예시: int globalVar = 5; 와 같은 변수가 여기에 해당합니다.
- 특징: 프로그램 실행 파일에 변수의 초기 값이 포함되어 있으며, 프로그램 시작 시 해당 값이 메모리에 로드됩니다.
초기화되지 않은 데이터 영역 (BSS, Block Started by Symbol)
- 정의: 초기값이 명시적으로 주어지지 않은 전역 변수와 정적 변수를 위한 공간입니다.
- 예시: static int array[1000]; 또는 초기값이 지정되지 않은 int count; 같은 변수가 이 영역에 할당됩니다.
- 특징: 변수들은 프로그램 시작 시 0으로 초기화되며, 실행 파일에는 이 변수들의 공간만 예약되어 있어 실제 데이터는 포함되지 않습니다. 이는 파일 크기를 절약하는 효과가 있습니다.
이렇게 초기화된 녀석들과 안된 녀석들의 영역을 구분해놓음으로서 실행 파일의 크기를 최소화하고 메모리 할당을 최적화할 수 있게 됩니다.
이는 프로그램 로딩 시간을 단축하고 시스템 자원을 효율적으로 사용할 수 있도록 돕습니다.
동적 메모리 할당: 힙은 프로그램의 실행 도중 필요에 따라 메모리를 할당하거나 해제할 수 있는 영역입니다. 예를 들어, 사용자로부터 입력받은 데이터의 크기에 따라 메모리를 동적으로 할당하는 경우 힙 영역이 사용됩니다.
런타임 관리: 힙 영역의 메모리 관리는 운영 체제의 메모리 관리자에 의해 수행됩니다. 개발자는 malloc, free 등의 함수를 사용하여 직접 메모리를 할당하고 해제할 수 있습니다.
메모리 해제의 중요성: 힙 영역에서 할당된 메모리는 사용이 끝난 후에 개발자가 명시적으로 해제해야 합니다. 해제되지 않은 메모리는 메모리 누수를 일으켜 프로그램의 성능 저하 또는 시스템의 안정성 문제를 초래할 수 있습니다.
malloc과 free 는 c언어인데 JS에서는 가비지 컬렉션(garbage collection)이라는 자동 메모리 관리 시스템을 사용해서, 개발자가 메모리를 직접 관리할 필요가 없다.
가비지 컬렉션은 프로그램이 더 이상 사용하지 않는 메모리를 자동으로 해제해주는 방식으로 작동한다. 이 과정은 모두 런타임에서 자동으로 처리되므로, JavaScript 개발자는 메모리 관리에 대해 신경 쓸 필요가 적어서, 코드를 좀 더 직관적으로 작성할 수 있다고한다.
스택 영역은 프로그램 실행 중 함수 호출과 관련된 지역 변수, 매개변수, 리턴 주소 등을 저장하는 메모리 구역입니다.
LIFO 구조: 스택은 Last In, First Out (LIFO) 원칙에 따라 작동합니다. 가장 마지막에 삽입된 항목이 가장 먼저 제거됩니다. 이는 함수 호출과 반환 과정에서 매우 효율적으로 작동합니다.
함수 호출과 스택 프레임: 함수가 호출될 때마다 그 함수의 실행에 필요한 매개변수, 지역 변수, 리턴 주소가 스택에 저장되는 '스택 프레임'이 생성됩니다. 함수가 종료되면 해당 스택 프레임은 스택에서 제거되고, 제어는 호출한 함수로 돌아갑니다.
자동 메모리 관리: 스택 영역은 자동으로 관리되므로 개발자가 별도로 메모리를 할당하거나 해제할 필요가 없습니다. 함수가 끝나면 해당 함수에 할당된 스택 메모리가 자동으로 해제됩니다.
스택과 힙 사이의 빈 공간은 메모리 관리 전략의 일부로, 다음과 같은 이유로 중요합니다.
이 빈 공간은 프로그램의 유연성, 안정성 및 보안을 보장하는 데 필수적인 역할을 합니다.