오늘의 TIL 목차 (22.08. 01)
- RAM ( 메인 메모리 & 가상 메모리 )
- RAM의 계층 ( Code, Data, Heap, Stack )
RAM
1. 메인 메모리 & 가상 메모리 (ft. 페이지테이블) 2. RAM의 계층
[ RAM ]
: 메모리 장치 중 cpu와 가장 가까운 메모리 중 하나, 단기 메모리로 메인 메모리와 가상 메모리로 구성되어 있다.
드라이브 → 메모리 -> cpu(중앙처리장치) // 프로그램 실행 시 전달 순서
→ RAM은 저장 장치와 cpu의 중간 다리 역할로 cpu(속도 빠름)에 필요한 정보를 저장 장치(속도 느림)로부터 일부 미리 가져와 저장했다가 cpu에 빠르게 전달해주는 기능
→ 컴퓨터는 무조건 저장해야지 실행 가능하므로 프로그램을 실행시켰을 때 발생하는 기계 명령어를 저장했다가 cpu에 전송
■ '어떤 기능' / '언제' 사용 용도
- 휘발성 메모리 ( 전원 OFF 시 모든 기계명령어가 초기화됨 )
- 우리가 작성하는 모든 코드는 RAM에 저장됨
- RAM은 SDR - DDR2 - DDR3/DDR4 - DDR5 로 발전되는 중 (한 번에 주고 받을 수 있는 데이터 수, 속도 증가)
[ 가상 메모리 ]
: 프로그램 실행 시 필요한 부분만 메모리에 올리고 나머지는 디스크에 저장하여 메인 메모리의 용량보다 체감상 훨씬 많이 사용할 수 있도록 해주는 메모리
- 32bit 컴퓨터 기준 RAM이 4GB라고 했을 때 여러 프로그램을 동시에 실행하기 위해선 각 메모리를 부여해야 하는데 ( A : 2GB, B : 3 GB ) 이면 금방 메인 메모리를 초과함, 이 문제를 해결하기 위해 프로그램 실행 시 필요한 부분만 '페이지'에 적재( 필요한 부분만 저장 ) 하여 실제 메인 메모리보다 훨씬 많은 메모리를 할당하는 것처럼 보이게 함
■ '어떤 기능' / '언제' 사용 용도
- 메인메모리는 4byte가 한 칸으로 1byte당 고정 주소가 있음 (0, 1, 2, 3)
- int iA; 경우 4byte이므로 주소 4개, 대표 주소는 시작 주소로 맨 앞의 주소이다.
- 가상 메모리는 고정 주소 앞에 ox를 붙임 (ox0, ox1, ox2)
- 가상 메모리는 실제 메인 메모리와 각각 매핑되어 있음
- 메인 메모리의 실제 주소는 쓸 수 없고 가상 메모리를 통해 실제 메인 메모리를 빌려 씀으로 가상 메모리만 사용 가능
페이지
: 읽어들이는 단위, 어떤 프로세스를 일정 크기로 나누는데 그 정해진 일정 크기 (4KB)

■ 예시
- 프로그램 실행 시 필요한 부분의 페이지만 RAM에 적재
- Page IN : 메모리의 페이지를 RAM에 넣는 과정
- Page Out : RAM의 페이지가 메모리로 반납되는 과정
- SWAP : 페이지가 RAM에 Page In 됨과 동시에 Page Out 되는 과정
- FIFO(First In First Out) 기법 사용 : 앞번지의 메모리 순서대로 Page Out 되며 동시에 Page In 됨

[ 페이지 테이블 ]
: SWAPPING 과정을 기록해놓는 테이블
■ '어떤 기능' / '언제' 사용 용도
- RAM이 cpu한테 보낼 때, cpu는 다음에 실행하고 싶은 프로세스가 어디에 위치해있는지 모름. -> 페이지 테이블을 이용하여 매핑 / 기록 해줌
ex) <테런> 마이룸 실행 이후 <테런> 탈진을 실행하고 싶은데 RAM의 몇 번지에 있지 ? -> 페이지 테이블 이용
RAM의 계층
1. Code 2. Data 3. Heap 4. Stack
- 최상위 계층 Code를 순서대로 Data Heap Stack
- 기계 명령어를 효율적으로 저장하기 위해서 크게 4가지로 분류
- 계층에 따라서 '언제 저장' , '언제 반납'을 정하기 쉽게 하기 위함
( 메모리는 무조건 반납해야 함 - 메인 메모리 부족하니까 )
전역 변수 & 지역 변수
- 전역 변수 : .cpp라는 파일 안에서 어디든지 사용 가능한 변수 (중괄호 밖에서 선언)
- 지역 변수 : 변수를 선언한 해당 중괄호 {} 안에서만 사용 가능한 함수 (중괄호 안에서 선언)
[ Code ]
: 프로그래머가 사용할 수 없고 컴파일러가 함수의 주소값, 함수의 명령어 같은 것을 저장하는 계층
- 함수 생성 시 함수는 Code 계층에 저장된다.
- 함수는 프로그램 종료 시까지 존재하지만 코드 영역에 저장되어 있다가 불러와 사용된다.
[ Data ]
: 전역 변수와 static (정적 변수)가 저장되있는 계층
'언제 메모리를 돌려주는가'
- 프로그램 종료 시 반납
[ Stack ]
: 지역 변수, 함수의 매개 변수 ( 매개변수는 함수 인자값 _iA)가 저장되어 있는 계층
'언제 메모리를 돌려주는가'
- 함수 종료 시 반납
※ Data 영역과 Stack 메모리의 공통점과 차이점
공통점 : 메모리를 빌려오는 시점은 둘 다 컴파일 시점(빌드)에 할당
차이점 : 메모리를 돌려주는 시점은 'Data'는 프로그램 종료 시, 'Stack'은 함수 종료 시 반납
'C++' 카테고리의 다른 글
| [TIL 8장] 포인터, 상수 포인터 (0) | 2022.08.03 |
|---|---|
| [TIL 7장] 함수(return, default 매개변수), 함수 오버로딩, 재귀함수, namespace, 정적변수 (0) | 2022.08.02 |
| [TIL 5장] 3항 연산자, for문(이중 for문) (0) | 2022.08.01 |
| [TIL 4장] 반복문(feat. break, continue), 난수, time(), typedef (0) | 2022.07.29 |
| [TIL 3장] 형 변환, 증감/시프트 연산자, 분기문 (0) | 2022.07.27 |