메모리 구조

deli-ght·2022년 1월 6일
3

CS

목록 보기
5/9
post-thumbnail

프로세스 메모리 구조

Unix 시스템은 실행 중인 프로세스에게 4GB의 가상 메모리 공간을 할당

상위 1GB는 커널이 하위 3GB는 사용자 프로그램이 차지

stack 영역

프로그램이 자동으로 사용하는 임시 메모리 영역 - 함수 호출과 관계되는 지역변수와 매개변수가 잠시 사용되었다가 사라지는 데이터를 저장하는 영역

함수 호출 시 생성, 함수가 끝나면 반환

stack 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될 때 stack사이즈가 고정되어 있어 런타임 시 stack 사이즈를 바꿀 수 없다. 명령 실행시 자동으로 증가 또는 감소 - 메모리의 마지막 번지 지정

LIFO 방식 (push, pop)

스택 프레임

: 스택 영역에 차례대로 저장되는 함수의 호출정보

함수가 실행되면서 생겼다가 함수가 끝나면서 사라짐

크기는 runtime에 정해짐

heap 영역

필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역 (동적 메모리 영역)

c에서 malloc() calloc() 등의 함수를 사용하여 메모리크기를 할당할 수 있으며, 메모리 주소값에 의해서만 참조되고 사용되는 영역. - 런타임에 사용자가 메모리값 직접 결정

위의 stack과 heap 영역은 같은 공간을 공유

heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당. 그래서 각 영역이 상대 공간을 침범하는 일이 발생하는데 이걸 stack overflow, heap overflow라고 함.

malloc()

프로그램이 실행 중일때 사용자가 직접 힙 영역에 메모리를 할당할 수 있도록 해줌. (C언어 공부할때 이쯤에서 포기했던 기억이...) 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받음. 전달 받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾아 첫번째 바이트를 가리키는 주소값 반환

힙 영역에 할당할 수 있는 적당한 블록이 없을 때는 널 포인터를 반환.

주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용

free()

free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수

  • stack이 아니라 heap에서만 제거

데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어 프로그램이 실행되는 내내 고정되지만, 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화한다.

따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, 메모리가 부족해지는 현상이 발생 - 메모리 누수(memory leak)

free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달

Data 영역 (BSS, GVAR)

프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환되며, 전역변수, 정적변수, 배열, 구조체 등이 저장된다. Data 영역은 다시 BSS 영역과 Data(GVAR) 영역으로 나누어지는데, 초기화된 데이터는 Data 영역에 저장되고, 초기화되지 않은 데이터는 BSS 영역에 저장된다.

  • BSS영역, Data영역을 구분하는 이유?
    • 초기화 된 데이터는 초기 값을 저장해야 하므로 Data 영역에 저장되어 rom에 저장된다. 하지만 초기화 되지 않은 데이터 까지 rom에 저장되면 큰 size의 rom이 필요하므로 구분한다. ( 초기화 되지 않은 데이터는 ram에 저장)

Text (Code) 영역

텍스트 영역은 실행 명령을 포함하는 코드들이 들어가는 부분(hex파일이나 bin 파일 메모리)

프로그램을 시작 할 때 컴파일한 프로그램(기계어)이 저장되어 있고, 읽기 전용 영역이기에 프로세스가 함부로 변경 할 수 없고 변경 시 오류를 발생시킨다.

text, data, stack은 애플리케이션이 실행되는 동안 증가 X

출처
http://tcpschool.com/c/c_memory_structure
https://kyu9341.github.io/운영체제/2020/10/04/OS_Process_Structure/#Data-영역-BSS-GVAR
https://curryyou.tistory.com/275

profile
PRE-FE에서 PRO-FE로🚀🪐!

0개의 댓글