중요한 부품 중 하나
다시 컴퓨터 구조와 운영체제를 공부하고 있다. 공부하던 내용을 전부 기록해두면 좋겠지만 사정상 몇 가지만 간추려서 기록할 생각이다.
이번에 다룰 내용은 우리가 자주 보는 컴퓨터 부품 중 하나인 메모리이다! 자주 본다기 보다는 이 부품이 달려있는 컴퓨터를 자주 다룬다고 하는 게 맞겠다.
우리는 자주 메모리라고 하지만 주기억장치에는 RAM과 ROM이 있다. 보통 '메모리'라고 할 때는 RAM을 지칭하는 경우가 많다. 우리가 컴퓨터(PC)에서 실행하는 모든 프로그램은 RAM에 적재된다. 그만큼 프로그래머 입장에서도 성능에 영향을 미치는 아주 중요한 부품이다.
RAM
RAM의 가장 중요한 특징은 작동 중간에 전원이 공급되지 않으면 RAM에 저장된 명령어와 데이터가 모두 사라진다. 이러한 특징을 휘발성 Volatile이라고 한다. 즉, RAM은 휘발성 메모리이다. 이와 반대되는 개념은 비휘발성 Non-Volatile이다. SSD 같은 보조기억장치가 이에 속한다. 이러한 특성에 따라서 보관대상은 보조기억장치에, 실행대상은 주기억장치에 저장한다. 실행할 프로그램을 보조기억장치에서 꺼내와서 RAM에 적재한 다음, CPU가 이 정보를 가져와 프로그램을 실행하도록 한다.
RAM의 용량은 성능 면에서도 중요하다.
다양한 프로그램을 실행하고 싶다고 하자. 3개 정도 실행한다고 했을 때, 보조기억장치에서 이를 가져와야 한다. 그런데 RAM은 2개의 프로그램을 실행할 수 있는 용량이 장착돼 있다. 이렇게 용량이 적다면 보조기억장치에서 실행할 프로그램을 가져오는 일이 잦아진다. 이는 즉슨 시간이 길어진다는 것이고, 이에 따라 성능 저하로 이어진다. 그렇다면 어마어마한 용량의 RAM을 장착한다면 성능도 이에 따라 상승하는가? 그렇지 않다! 일정수준에 따라 프로그램의 실행속도가 빨라지긴 한다. 그러나 필요 이상으로 커졌을 때는 속도가 그만큼 빨라지지 않는다. 요리사로 비유해보면 다음과 같다. 생선 3마리를 한 번에 손질할 수 있는 요리사가 있다. 도마를 3마리만큼 길고 넓은 것을 쓴다면 한 번에 생선을 손질할 수 있다. 그러나 12마리의 생선을 올려둘 수 있는 도마를 가져다놓는다고 해서 생선을 손질하는 속도도, 생선을 잡아서 가져오는 속도도 전혀 달라지지 않는다.
RAM의 종류
RAM의 종류는 여러가지가 있다. 간단히 살펴보자.
- DRAM : Dynamic RAM의 준말로, 이는 저장된 데이터나 명령어가 동적으로 변하는(데이터가 왔다갔다 하는 이미지) RAM이다. 시간이 지나면 점차 저장된 데이터가 사라지기 때문에 데이터 소멸을 막기 위해 일정주기로 데이터를 다시 저장한다. 그러나 이런 단점이 있음에도 시장에서 일반적으로 사용되는데, 소비 전력이 낮고, 가격이 저렴하기 때문이다. 그리고 집적도가 높아 대용량 설계가 용이하다.
- SRAM : Static RAM의 준말이다. 이는 저장된 데이터가 변하지 않는 RAM이다. DRAM과 달리 데이터를 재활성화할 필요도 없다. 그리고 일반적으로 DRAM보다 속도가 더 빠르다. 그러나 집적도가 낮고, 소비 전력도 크며, 가격도 비싸다. 따라서 '대용량으로 만들어질 필요가 없는 고속 저장 장치(캐시 메모리)를 만들 때' 사용한다. 참고로 SRAM은 비휘발성이 아니다. 전원이 공급되지 않으면 데이터는 사라진다.
- SDRAM : Synchronous Dynamic RAM의 준말이다. 클럭신호에 맞춰 동작하여 클럭마다 CPU와 정보를 주고 받을 수 있는 DRAM이다.
- DDR SDRAM : Double Data Rate SDRAM의 준말이다. 대역폭을 넓혀 속도를 높인 SDRAM이다. 기존 SDRAM보다 대역폭이 2배라 한 클럭당 두 번씩 CPU와 데이터 교환이 가능하다.
개인적인 경험으로 컴퓨터 부품을 사서 조립하려 했을 때 가장 눈에 띄었던 것이 DDR4 램이었다. 여기서 DDR4의 DDR이 그 의미다. DDR2는 DDR보다 대역폭이 두 배 넓고, DDR3는 DDR2보다 두 배 더 넓다. 여기까지 보았을 때 최근까지 사용중인 DDR4 램은 DDR3의 두 배라는 것을 알 수 있다. (SDR SDRAM보다 16배다.)
메모리 주소 공간
메모리에 저장된 정보의 위치는 주소로 알 수 있다. 여기서 주소는 두 가지로 나뉘는데, 바로 물리주소와 논리주소다!
물리주소 : 메모리 하드웨어가 사용하는 주소
논리주소 : CPU와 실행 중인 프로그램이 사용하는 주소
CPU와 메모리에 저장돼 실행 중인 프로그램은 메모리의 어느 부분에 무엇이 저장돼 있는지 다 알 수 없다. 당연하게도 메모리에 저장된 정보는 시시각각 바뀌기 때문이다! 실행이 끝난 프로그램은 메모리에서 삭제되고, 다음 프로그램이 실행될 수 있고, 이전에 실행했던 프로그램도 다시 시작할 때마다 적재된 메모리의 주소가 달라질 수 있다. 따라서 이런 상황에서 CPU와 실행 중인 프로그램이 현재 메모리에 저장된 데이터의 위치를 전부 알고 있을 수는 없다.
메모리에 브라우저, 게임, 노션이 적재돼 있다고 하자. 각 프로그램은 물리 주소가 아닌 0번지부터 시작하는 자신만의 논리주소를 갖고 있다. 똑같은 3번지의 논리 주소가 각 프로그램에서도 동일하게 있을 수 있다. CPU는 이 논리주소를 가지고 해석과 연산을 진행한다.
그런데 CPU가 논리 주소를 이해한다 해도 CPU가 메모리와 상호작용하려면 논리 주소와 물리 주소 간의 변환이 있어야 한다. 이 변환은 CPU와 주소 버스 사이에 있는 메모리 관리 장치 MMU Memory management Unit이라는 하드웨어에 의해서 수행된다.
MMU는 CPU가 보낸 논리 주소에 베이스 레지스터 값을 더해서 논리 주소를 물리 주소로 변환한다. 예를 들어, 현재 베이스 레이터에 20000만이 저장돼 있고 CPU가 보낸 논리 주소가 100번지라면 이 논리 주소는 물리 주소 20100번지로 변환된다. 참고로 베이스 레지스터는 프로그램의 가장 첫 물리 주소를 저장하며, 논리 주소는 프로그램의 시작점으로부터 떨어진 거리가 되는 셈이다.
한계 레지스터 Limit Register
위의 사진을 보자. 프로그램 1번이 메모장이고, 물리 주소는 0~100번지를 사용한다고 하자. 아래 프로그램 2번은 브라우저이며 물리 주소는 101~200번지를 사용한다. 만약 메모장 프로그램 명령어 중 하나가 '논리 주소 120번지의 데이터를 삭제하라'라는 명령어가 실행되면 어떻게 될까? 메모장과 전혀 상관 없는 브라우저 프로그램의 정보를 삭제하는 꼴이 된다.
이렇듯 다른 프로그램의 영역을 침범하면 위험하다. 따라서 문제가 되는 명령어의 실행을 방지하고 다른 프로그램의 영향을 받지 않도록 보호하는 일을 한계 레지스터가 담당한다.
베이스 레지스터 Base Register가 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터 Limit Register는 프로그램의 논리 주소의 최대 크기를 저장한다. 다시 말해, 실행 중인 모든 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상, 베이스 레지스터 + 한계 레지스터 값 미만이 된다.
따라서 CPU는 메모리에 접근하기전 해당 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다. 만약 한계 레지스터보다 높은 논리 주소에 접근하려 하면 인터럽트를 발생시켜 실행을 중단한다.
캐시 메모리 Cache Memory
프로그래밍을 해본 사람이라면 어디서든 이 캐시에 대해서 들었을 것이다. 캐시라는 개념은 CPU, 서버의 로직, 가상 메모리 등에서 곧잘 쓰인다. 참조 지역성에 그 원리를 두고 있는데, 이는 나중에 다루고 지금은 '캐시 메모리'에 대해 다루도록 하겠다.
CPU의 연산이 아무리 빨라도 CPU가 메모리에 접근하는 시간은 이보다 느리다. 그러면 CPU가 아무리 빨리 연산해도 의미가 없다. 이 속도의 차이를 극복하기 위한 것이 캐시 메모리이다.
저장 장치 계층 구조 (메모리 계층 구조) Memory Hierarchy
캐시 메모리를 다루기 전에 한 가지 짚고 넘어가야 할 것이 있다. 모든 저장 장치는 일반적으로 두 가지 명제를 따른다.
- CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.
- 속도가 빠른 저장 장치는 저장 용량이 작고 가격이 비싸다.
CPU와 가까이 있는 순으로, 레지스터, RAM, SSD를 기준으로 보면, 레지스터는 RAM보다 용량이 작지만 접근 시간이 압도적으로 빠르고, RAM은 SSD보다 용량이 작지만 이보다 빠르다. 그리고 더 비싸다.
따라서 저장 장치는 CPU에 얼마나 가까운가를 기준으로 계층적으로 나타낼 수 있는데, 이를 책에서는 저장 장치 계층 구조라고 한다. 영문으로는 Memory hierarchy이나 여기서 메모리는 저장 장치를 의미한다!
CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 느리다. 그래도 CPU는 프로그램을 실행할 때 메모리에 빈번히 접근해야만 한다. 그래서 필요한 것이 캐시 메모리 Cache Memory이다. 이름에서 알 수 있다시피 CPU와 메모리 사이에 위치해 있으며, 저장 장치 계층 구조에 따라 레지스터보다 용량이 크고 메모리 보다 빠른 SRAM 기반의 저장 장치이다.
CPU의 연산 속도와 메모리의 접근 속도 차이를 조금이라도 메꾸기 위해 도입됐으며, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가져와서 활용하는 용도다. 이는 편의점과 대형 마트를 예로 들 수 있다. 내가 필요한 물품이 편의점에 있는데 굳이 멀리 있는 대형 마트까지 갈 필요가 없다. 편의점에서 원하는 물품을 잽싸게 사서 올 수 있기 때문이다.
우리가 사용하는 컴퓨터에는 여러 개의 캐시 메모리가 있는데, 이는 CPU(코어)와 가까운 순서대로 계층을 구성한다. CPU(코어)와 가장 가까운 캐시 메모리를 L1 캐시(level 1), 다음 순서별로 L2 캐시, L3 캐시가 있다. 당연히 속도도 이 순서대로 가장 빠르고 갈수록 느려진다. 용량도 똑같다.
CPU가 메모리 내에 데이터가 필요하다고 판단하면 L1 캐시를 우선적으로 탐색하고, 없다면 L2, L3 순으로 데이터를 검색한다.
멀티 코어 프로세서에서는, 각 코어마다 L1, L2 캐시가 할당되고, L3는 여러 코어가 공유하는 형태로 사용된다.
생각
요즘 경험이 조금씩 쌓이면서 드는 생각이 하나 있다.
"만약 내가 내 자본으로 웹 서비스를 구축한다고 했을 때 어떻게 될까?"
성능 최적화를 신경쓰지 않고 기능만 돌아가게 만들어서 서버에 올려두었는데 트래픽이 조금만 생겨도 하루에 2~5천 원 이상의 비용이 발생했었다. 여러 가지 요인을 제외하더라도 날마다 쌓여가는 비용을 보면 싫어도 짠돌이가 되지 않을까 싶다... 그래서 DB의 트랜잭션 처리 등과 같이 손볼 수 있는 부분을 반드시 처리하고, 성능 최적화와 비용 최소화를 달성할 수 있어야 한다고 본다. 그러니 자체적으로 서비스를 운영한다고 했을 때 이는 개발자에게 필수적인 역량이 아닐까 한다.
'기록 > Computer Structure' 카테고리의 다른 글
전기 Electric (2) | 2024.10.08 |
---|