※ 본 카테고리의 내용은 부스트캠프 챌린지 기간동안 학습한 내용을 바탕으로 정리한 내용입니다.
목차
0. 프로세스 메모리 구조 모델
이번 주제도 운영체제와 관련된 내용입니다.
우리가 아무 생각 없이 사용하는 변수와 함수들은 다 메모리의 특정 공간에 저장됩니다.
그리고 그 메모리 중에서도 사용처에 따라 이름이 나뉘는데, 크게 TEXT, GVAR, BSS, HEAP, STACK으로 나눌 수 있습니다. (미사용 메모리까지 합하면 총 6공간으로 나눌 수 있습니다.)
TEXT는 함수 코드와 제어문, 상수 부분이 들어가고, GVAR은 초기화한 전역변수가 들어가는 부분이고, BSS는 초기화를 하지 않은 전역변수가 들어가는 구간입니다.
진짜 중요한 부분은 HEAP과 STACK의 차이입니다.
HEAP은 동적으로 할당되는 메모리 공간으로 C의 경우 malloc, C++의 경우 new 명령어를 통해 할당될 수 있습니다.
C와 C++이 아니더라도 다른 언어들도 직접 혹은 간접적으로 동적으로 할당되는 HEAP영역을 사용할 수 있도록 운영체제 차원에서 지원을 하고 있습니다.
STACK은 함수를 호출할 때마다 지역변수, 매개변수, 리턴값이 쌓이는 공간입니다. 특징으로는 한쪽 방향으로 쌓여서 가장 늦게 쌓인 친구부터 나가는 LIFO(Last In First Out)의 특성을 띠고 있습니다.
1. Stack Overflow, Out of Memory
컴퓨터에 관심이 있는 사람이라면 한 번쯤은 들어봤을 Stack Overflow는 원래 오류의 이름입니다.
위에서 배운 Stack의 용량을 초과하는 경우에 발생하는데, Stackoverflow 홈페이지의 로고가 그 모습을 잘 보여주고 있습니다.
일반적으로 Stack Overflow는 함수를 너무 과도하게 사용하거나, 재귀함수가 무한히 도는 경우에 자주 발생합니다.
반대로 Out of Memory는 Heap의 용량을 초과하는 경우에 발생합니다.
변수를 너무 과도하게 사용하게 되는 경우에 자주 발생합니다.
둘은 서로 다른 것 같으면서도 뗄레야 뗄 수 없는 관계이기 때문에 두 오류가 발생한다면 코드에 잘못된 부분이 있는지 확인하거나 리팩토링을 할 필요가 있습니다.
Node와 리눅스에서의 메모리 관리, 프로세스 노드 모듈, JS의 Class객체에 대해서 추가로 연재될 예정입니다.
최근댓글