본문 바로가기

C++

[TIL 6장] RAM 이론 (feat. 전역변수/지역변수)

오늘의 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'은 함수 종료 시 반납