프로그램이 실행되기 위해선 OS가 프로그램을 메모리에 로드 해야한다.
이 때 메모리에 프로그램의 코드와 변수들이 로드 된다.
따라서 메모리 공간을 다음과 같이 나눠 구분한다.
프로그램에 있는 함수 코드, 제어문, 상수들이 저장되는 영역이다.
실행할 코드는 프로그래머가 작성한 코드를 의미하고, 프로그램이 종료될 때 까지 메모리에 계속 남아있는다.
CPU는 이 영역에 저장된 명령어를 하나씩 가져와 처리한다.
GVAR/BSS 섹션
함수를 호출할 때마다 지역 변수, 매개 변수가 저장되는 영역이다.
함수의 호출과 함께 할당 되며 리턴 시 소멸한다.
예시
function main() {
func1();
}
function func1() {
func2();
}
function func2() {
return;
}
main();
Step1. main()에서 func1()이 실행되면 관련 값들이 스택에 적재된다.
Step2. func2(), ... 함수들이 차례로 적재된다.
Step3. func2()가 종료되면 리턴 시 관련 변수(매개변수, 반환 주소, 지역변수)들이 스택에서 삭제 된다.
Step4. func2()가 종료됨에 따라 func1(), main() 또한 스택에서 제거 된다.
출처: http://tcpschool.com/c/c_memory_stackframe
스택에 동적 할당된 Heap의 주소 값이 저장 되며, 참조할 수 있다.
자바스크립트를 실행할 수 있는 Node.js의 기반인 V8엔진 메모리 구조를 살펴보자. 먼저 힙과 스택으로 크게 구분되어 있는 것을 볼 수 있다.
V8 엔진이 힙 메모리를 어떻게 관리하는지 알아보자.
메모리 관리 기법의 하나로, 실제 자원을 추상화 하여 사용자에게 마치 메모리를 전부? 사용하는 듯한 느낌을 주는 방식이다.
즉, 실제로 존재하지는 않지만 가상의 메모리 주소를 부여해 사용자에게 있어 메모리 역할을 하는 가상의 자원이다. 그러나 가상메모리에 수용된 프로그램이 실행될 때는 실제 메모리를 사용해야한다.
앞서 말한 가상메모리를 이용하기 위해 Paging이란 기법이 사용된다.
따라서 Paging 기법을 이용한 가상메모리는 실제 메모리에 연속적으로 적재되지 않아도 마치 연속적으로 적재된 것 처럼 이용할 수 있다.
프로그램을 실행 했을 때 만들어지는 프로세스 정보를 다루는 객체
console.log(process.env); // 컴퓨터 환경과 관련된 정보를 가진 객체
console.log(process.version); // node.js의 버전
console.log(process.versions); // node.js와 연관된 프로그램들의 버전을 가진 객체
console.log(process.arch); // 프로세서의 아키텍처(arm/ia32/x64)
console.log(process.platform); // 플랫폼(win32/linux/sunos/freebsd/darwin)
console.log(process.memoryUsage()); // 메모리 사용 정보를 가진 객체
console.log(process.uptime()); // 현재 프로그램이 실행된 시간
예제
process.argv.forEach(function (val, index, array) {
console.log(index + ': ' + val);
});
실행
$ node processArgv.js one two three
0: node
1: /(path)/processArgv.js
2: one
3: two
4: three
$ node
> console.log("REPL을 실행한 화면입니다.");
REPL을 실행한 화면입니다.
undefined
> process.exit();
$
exit()에 매개변수를 넘겨 줄 수 있고, 0은 정상 종료, 1은 비정상 종료를 의미한다.