TIL
프로그램 동작 원리
1. 프로그램 실행 요청
2. 디스크와 같으 저장공간으로부터 메모리의 프로그램 코드 영역으로 프로그램 업로드
3. CPU가 프로그램 코드를 읽어 호출규약(Calling Convention)에 근거해 메모리 관리 및 명령문 실행
4. 프로그램 실행을 위해 동적 메모리가 할당되면 Free Store 영역 사용
5. 시스템이 작동하기 위해 CPU가 임시 정보를 스택에 저장하게 되면 Free Store 영역을 사용.
Free Store가 부족하면 Heap에서는 메모리를 할당하지 않고, Stack에서는 Stack Overflow가 발생
메모리 구조
출처: https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/
Kernel 영역
- 하나의 프로세스에 할당되는 총 메모리 공간 중에 유저 영역을 제외한 나머지 영역이며, 운영체제라는 하나의 소프트웨어를 실행시키기 위해 필요한 메모리 영역
- 사용자 코드는 이 영역에서 읽거나 쓸 수 없음
- 단일 영역으로 커널 모드를 사용하는 모든 프로세스에 공유
- 시스템 운영에 필수적이기 때문에 페이지 파일보다 RAM에 존재
TEXT(Code) 영역
- 사용자가 작성한 코드가 기계어로 저장되는 영역
- Text영역에 저장된 명령어들을 CPU가 하나씩 가져가 처리
- Read-Only
- 라이프 타임 : 프로그램 시작 ~ 프로그램 종료
DATA 영역
- 초기화된 전역 변수와 정적 변수가 저장되는 영역
- 프로그램 실행 시, 전역 변수와 정적 변수는 메인 함수가 호출되기 전에 데이터 영역에 할당
- 라이프 타임 : 프로그램 시작 ~ 프로그램 종료
- 초기화된 Read-Only(ROM) 영역과 초기화된 Read-Write(RAM) 영역으로 세분화 가능
char str[]="hello world";
int num=1;
static in num2=10;
위 코드는 초기화된 Read-Write 영역에 저장
const char* str="hello world";
위 코드에서 str은 상수 문자열 리터럴 "hello world"의 첫 번째 문자를 가리키는 문자 포인터 변수이므로, 상수 문자열 리터럴 "hello world"는 초기화된 Read-Only 영역에 저장되고 포인터 변수 str은 초기화된 Read-Write영역에 저장된다.(런타임에 수정될 수 있기 때문에)
BSS 영역 (Data 영역의 하위 영역)
- 초기화되지 않은 전역 변수, 정적 변수가 저장되는 영역
- 초기화되지 않은 Data 영역을 나타내기도 하고, 'Block started by Symbol'을 의미하는 고대 어셈블러 연산자의 이름 따서 명명
- 이 영역의 데이터는 프로그램이 실행되기 전에 OS 커널에 의해 0으로 초기화
- 초기화를 안할 경우 문제가 생길 수 있기 때문에 존재
- Read-Write
Stack 영역
- 프로그램에서 함수 호출에 필요한 모든 데이터가 저장되는 영역
- 함수 호출을 위해 푸시된 값 세트는 'Stack Frame'이라고 명명, 모든 자동 변수(함수의 지역 변수와 매개 변수 포함)와 호출자의 변수로 구성
- LIFO(Last In First Out)구조
- 메모리의 높은 주소부터 낮은 주소로 할당 (아키텍처에 따라 상이할 수 있음)
- 컴파일 시점에 크기 결정
- MSVC의 글에 따르면 x86 및 x64의 경우 1MB
- 라이프 타임 : 필드 시작 ~ 필드 종료
Heap 영역
- 동적 메모리 할당이 발생하는 영역
- 런타임에만 크기를 알 수 있고 프로그램 실행 전에 컴파일러가 정적이지 않은 변수에 대해 프로그래머가 요청한 메모리를 동적으로 할당하는 영역
- BSS 영역의 끝에서 시작하여 높은 메모리 주소 쪽으로 증가
- 런타임에 크기 결정
- malloc / new, free / delete에 의해 관리
- 라이프 타임 : 프로그래머에 의해 생성 및 삭제
참고 자료
https://velog.io/@liz/C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
C++ - 메모리 구조
📒 메모리 구조 📌 프로그램 동작 원리 사용자가 운영체제를 통해 프로그램 실행을 요청한다. 하드디스크에 저장되어있던 프로그램을 작동시키기 위해 메모리의 프로그램 코드 영역에 올린다
velog.io
https://codingwell.tistory.com/189
[운영체제] 메모리 구조 (Heap vs Stack)
메모리 구조에 대해서 어렴풋이만 알고 있는 것 같아 제대로 정리해보려고 합니다. 주 메모리 메모리는 크게 커널(kernal) 영역과 유저(User) 영역으로 나뉘어지고, 커널 영역에는 운영체제가 적재
codingwell.tistory.com