Memory structure
Code segment
실행할 프로그램의 코드와 명령어가 디스크에서 로드되어 저장되는 영역입니다.
이 영역에 저장된 명령어를 CPU가 처리합니다.
아래 두 region을
Data segment
local and static data
컴파일 시간 동안 프로그램의 전역 변수와 정적 변수의 주소가 설정되어 저장됩니다.
프로세스 수명 동안 살아있으며, 프로그램 종료 시 사라집니다.
global / static 영역은 엄밀히 말해 아래의 영역입니다.
Initialized data segment(초기화된 데이터 세그먼트)
기본값으로 선언된 변수가 저장됩니다.
bss
아직 값이 할당되지 않은 정적으로 할당된 변수가 포함된 object file, excecutable, assembly language codes의 일부.
global 영역
main() 함수 외부에 선언된 전역 변수.
static 접두사를 사용하여 선언된 로컬 변수도 이곳에 저장됩니다. 단, 정적 변수는 함수 블록 내에서만 사용됩니다.
Stack
컴파일 시간 동안 함수가 호출될 때 생성됩니다.
함수 내부에서 선언된 지역 변수와 매개 변수와 같은 함수의 호출 정보(스택 프레임)이 저장됩니다.
높은 메모리 주소에서 낮은 메모리 주소로 할당되며 채워집니다.
stack자료구조의 속성을 따라 후입선출 방식을 따라 동작합니다.
메모리 크기에 제약이 있으나 컴파일 시점에 할당되므로 속도가 빠릅니다.
Stack pointer
stack pointer는 마지막으로 채워진 반환될 주소를 추적하는 레지스터입니다.
정적 접두사 없이 선언된 로컬 변수도 이곳에 저장됩니다.
함수/블록을 종료하면 스택 프레임은 사라집니다.
Heap
런타임 시, 즉 프로그램이 실행되고 있을 동안 사용자가 동적으로 할당한 데이터들이 저장됩니다.
낮은 메모리 주소에서 높은 메모리 주소로 할당됩니다.
선입선출 방식을 따라 동작합니다.
운영체제는 heap pointer를 활용해 메모리 블록을 할당하고 해제합니다.
메모리 크기에 제약이 없어 동적으로 데이터를 할당할 때 적합합니다.
Stack / Heap overflow
heap pointer와 stack pointer가 만나면 메모리 부족 오류가 발생합니다.
Garbage Collect
메모리 관리 기법으로, 프로그램이 동적으로 할당했던 메모리 영역 중 더이상 사용하지 않는 영역을 해제하는 기능입니다. 가비지 컬랙션이 지원되는 환경에서 프로그래머는 메모리 동적 할당을 관리하지 않아도 되므로 편의성이 증가하며, 해제된 메모리 접근, 이중 해제, 메모리 누수와 같은 메모리와 관련한 버그를 피할 수 있습니다. 그러나 메모리 해제에 필요한 비용이 소모되며, 오버헤드가 발생할 수 있습니다. 점유 시간이나 해제 타이밍을 정확히 예측할 수 없기에 실시간 시스템에서는 부적합합니다.
방식
참조 횟수 계산 방식은 각 객체에서 참조 횟수를 저장하고, 0이 된 순간 객체를 해제합니다. 객체가 접근 불가능해지는 시점에서 메모리를 해제하므로 예측 가능하고, 빠르게 이루어진다는 장점이 있습니다.반대로 두 개 이상의 객체가 서로를 가리키는 순환 참조 시에는 참조 횟수가 0이 되지 않습니다.
그 외에 포인터 추적 방식이 있습니다. (향후 추가)
Reference
Memory Map
https://en.wikipedia.org/wiki/Computer_program#C
https://en.wikipedia.org/wiki/.bss
garbage collection
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
'공부기록 > CS' 카테고리의 다른 글
[TIL][CS 기초] CPU vs GPU | SSD, HDD (0) | 2024.03.11 |
---|---|
[TIL][CS 기초] 32 Bit vs 64 Bit | 2's complement, 1's complement | 실수 표현법 (0) | 2024.03.07 |
[TIL][Fri][CSAPP] ch 6. The memory hierachy (0) | 2023.11.10 |
[TIL][CS기초] Compile | Compiler, Interpreter | Type System | Typing :: Static & Dynamic (0) | 2023.11.01 |
[TIL][Tue] [CSAPP/CH.3] Machine Programming 1: Basics (0) | 2023.10.31 |