메모리의 구조

 

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다. 실행파일을 실행하면 OS에서 해당 실행파일을 주기억장치(RAM)으로 적재(Load)를 합니다.

이렇게 적재된 실행코드들(순차적으로 CPU 레지스터(Register)에 옮겨져 실행되는 것입니다.

 

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.프로그램이 운영체제로부터 할당 받는 대표적인 메모리 공간은 다음과 같습니다.

 

1. 코드(Code) 영역

 

2. 데이터(Data) 영역

 

3. 스택(Stack) 영역

 

4. (Heap) 영역

 

다음 그림은 운영체제가 제공하는 메모리 공간을 표현하고 있습니다.

메모리1.png

 

코드(Code) 영역

메모리의 코드(Code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(Code) 영역이라고도 부릅니다. 물론 컴파일 된 기계어가 들어갑니다. 코드영역에는 실제 프로그램 동작을 수행하는 명령어(Instruction)와 전역 상수가 저장됩니다.

명령어는 CPU에서 순차적으로 실행되는 함수와 연산 구문 등이 해당되고, 전역 상수는 “ “로 선언된 문자열 상수나 const 접두어가 붙은 변수 등이 해당됩니다. 이 영역은 Read only로 변경되지 않습니다. 프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있습니다.CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.

 

데이터(Data) 영역

 

메모리의 데이터(Data) 영역은 프로그램의 전역 변수와 정적(Static) 변수, 배열, 구조체 등이 저장되는 영역입니다. 프로그램이 실행될 때 할당 되고 종료될 때 해제됩니다.

 

스택(Stack) 영역

 

메모리의 스택(Stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.

 

이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 합니다. 프로그램이 자동으로 사용하는 임시 메모리 영역이다. 컴파일 시에 크기가 결정됩니다.

 

스택 영역은 푸시(push) 동작으로 데이터를 저장하고, (pop) 동작으로 데이터를 인출합니다.

이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

 

(Heap) 영역

 

메모리의 힙(Heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는메모리 영역입니다. 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.

 

힙 영역은 스택 영역에 비해 굉장히 큰 사이즈 또는 많은 양의 데이터도 적재가 가능합니다. 이를 활용해 대량의 데이터는 힙 영역에 할당하고 데이터를 가리키는 포인터 변수를 스택 영역에 지역변수로 할당해서 사용하는 것이 일반적입니다.

하지만 힙 영역에 메모리를 할당하고 해제하는 것을 잊어버린다면 메모리 누수(Memory Leak)라는 크나큰 재앙을 불러올 수 있습니다.

 

메모리 누수 문제는 여러분의 프로그램이 실행되는 동안 시스템의 메모리가 계속해서 잠식해나가 결국 시스템에 치명적인 문제를 일으킬 수 있습니다!

 

따라서 Malloc, Calloc, New, Create(델파이경우) 등의 할당 함수를 통해 힙 영역을 할당 받았다면 반드시 사용 후에 Free, Delete 등의 함수로 해제를 해 줘야 합니다. 바로 이러한 메모리 관리야말로 프로그래머에게 가장 중요한 덕목입니다

 

Java, C# 와 같은 고수준의 언어의 경우는 Garbage Collector(GC) 라는 녀석이 더 이상 참조되지 않는 메모리 영역을 자동으로 찾아서 해제 해주기 때문에 이런 부분에 크게 신경 쓰지 않아도 되지만 C C++, 델파이는 그렇지 않습니다. 반드시 할당한 메모리는 해제해야 합니다. 명심하세요!

* (델파이도 자동으로 해제되는 경우는 있으나 Create로 할당된 개체는 반드시 Free를 호출하여 메모리 해제 해야 합니다.)

 

스택 할당 속도 vs 힙 할당 속도

 

스택은 이미 할당 되어 있는 공간을 사용하는 것이고 힙은 따로 할당해서 사용하는 공간이기 때문에 스택이 훨씬 더 빠릅니다. 다만 스택은 공간이 매우 적기 때문에 모든 응용에서 스택을 사용할 수는 없습니다.

 

 

 

다운로드 : 5장 메모리의 구조.pdf

 

 


프로그래밍을 제대로 공부해보고 싶다면, 다음 순서로 진행하시는 것을 권장합니다.

 

  1. 프로그래밍 애피타이저 시리즈
  2. [동영상] 데브기어 델파이 기초 시리즈
  3. [오프라인 강의] 델파이/C++빌더 기초 강화
  4. [오프라인 강의] 델파이/C++빌더 윈도우 프로그래밍

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15551
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 14002
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16534
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22119
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23371
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18964
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39360
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174767
334 [프로그래밍 애피타이저] 7장 데이터베이스 개념과 용어정의 file 김원경 2020.04.09 756
333 [업데이트][핫픽스][10 시애틀] 모던테마(ModernTheme) 핫픽스 - 10 시애틀 업데이트 1 대상 험프리 2016.01.06 755
» [프로그래밍 애피타이저] 5장 메모리의 구조 file 김원경 2020.04.07 754
331 [고객사례-원격연동, 모바일, 윈도우] Alpemix - 모바일과 PC 원격 연동 프로그램 관리자 2017.08.24 750
330 이 달의 기술자료 - 2015년 11월 file 험프리 2015.10.30 745
329 이 달의 기술자료 - 2019년 04월 file 험프리 2019.03.28 739
328 3가지 API 이야기: VCL에서 WinAPI, COM&ShellAPI, WinRT 활용하기 관리자 2019.09.18 734
327 [10.2 도쿄][릴리즈2] 기타 10.2.2에서 추가 강화된 내용 file 험프리 2017.12.13 734
326 [10.2 도쿄] 개발환경 개선사항 file 김원경 2017.03.23 733
325 [10.4.1 패치] 델파이 컴파일러와 LSP 업데이트 관리자 2020.11.11 729
324 [고객 사례- 델파이, 게임] 체스 오프닝 위저드 - 60,000여명의 체스 플레이어가 실제로 사용하는 앱 관리자 2021.01.18 716
323 엠바카데로 오픈 소스 프로젝트 관리자 2020.05.25 712
322 델파이 개발자 관점에서 본 윈도우 개발 file 김원경 2020.03.13 712
321 MidaConverter로 VCL 프로젝트를 FMX 프로젝트로 변환할 수 있습니다. Humphery 2015.06.04 711
320 [10.3 리오] 윈도우 스토어 연동, 최신 윈도우 API 업데이트 등 윈도우 10 지원이 강화되었습니다. file 험프리 2018.12.05 710
319 [업데이트][패치][10.2.3] RAD스튜디오 10.2.3 패치와 새로운 기술 정보들 관리자 2018.04.24 707
318 [발표자료] 20200623 코로나19, 데이터와 RAD로 방역하다! file 관리자 2020.06.24 703
317 이 달의 기술자료 - 2017년 02월 file 험프리 2017.01.31 699
316 애플 개발자 프로그램 구독하지 않고 XCode8을 설정해 iOS앱을 배포하는 방법 험프리 2017.05.15 693
315 [시애틀] 안드로이드 서비스 앱을 만들 수 있습니다. Humphery 2015.09.07 691