넘치게 채우기

메모리 구조 본문

컴퓨터과학

메모리 구조

riveroverflow 2023. 10. 12. 18:47
728x90
반응형

프로그램이 실행되기 위해서는, 프로그램이 메모리에 로드가 되어야 합니다.

프로그램에서 쓰이는 변수들을 저장할 메모리도 필요합니다.

 

컴퓨터의 운영체제는 프로그램의 실행을 위한 다양한 메모리 공간을 제공합니다.

프로그램은 4가지의 메모리 공간을 제공받습니다.

 

1.코드(code)영역

2.데이터(data)영역

3.스택(stack)영역

4.힙(heap)영역

 

 

코드 영역(code)

실행될 프로그램의 코드가 저장되는 영역입니다.

텍스트(code)영역이라고도 불립니다.

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리합니다.

 

데이터 영역(data)

전역 변수, 정적 변수가 저장됩니다.

데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램의 종료와 함께 소멸됩니다.

데이터 영역은 세 가지로 나뉩니다:

.data : 

    초기값이 있는 변수가 저장됩니다.

.bss : 

    초기값이 없는 변수가 저장됩니다.초기값을 설정해주지 않으면,  .bss로 저장됩니다.

.rodata : 

    읽기전용의 (ro : readonly) 데이터가 들어갑니다. 주로 상수 데이터가 들어갑니다.

 

전역변수들은 main이 실행되기 전에 저장되며, bss영역에 있는 전역변수는 main이 실행되기 전, 전부 0으로 초기화되어 data에 들어갑니다.

 

스택 영역(stack)

함수의 호출과 관계있는 지역변수와 매개변수가 저장되는 영역입니다.

스택 영역은 함수의 호출과 함께되며, 함수의 호출이 끝나면 소멸됩니다.

스택 영역은 선입후출(FILO)방식으로, 가장 마지막에 저장된 데이터가 가장 먼저 인출됩니다.

스택 메모리는 높은 주소에서 낮은 주소로 할당됩니다.

main 함수에서 선언된 변수 역시 스택 영역에 저장됩니다.

 

재귀 함수에서 스택 오버플로우가 나오는 이유는 여기에 있습니다.

 

힙 영역(heap)

동적 메모리를 할당하는 영역입니다.(C/C++에서는 malloc, free 등으로 관리.)

컴파일러가 예측할 수 없고, 프로그래머가 관리해야 하는 영역입니다.

메모리의 낮은 주소에서 높은 주소로 할당되며, 직접 할당과 해제를 해줘야 합니다.

사실상 스택과 영역을 공유합니다.

힙 영역은 사용자가 데이터의 메모리를 관리해서, 딱히 순서가 고려되지 않습니다.

 

메모리 사용 후, 직접 해제해야 메모리의 누수를 막을 수 있습니다.

 

그러나, 자바, 파이썬, 자바스크립트, GO, 루비 등의 언어는 가비지 콜렉션을 통해서 자동으로 힙 메모리를 관리해줍니다.

 

 

 

 

728x90
반응형