Chapter06. 메모리와 캐시 메모리
06-1 RAM의 특징과 종류
이번 절에서는 우리가 ‘메모리’라는 용어로 지칭했던 저장 장치인 RAM을 조금 더 자세히 알아보겠다. RAM 용량이 컴퓨터 성능에 어던 영향을 미치는지, 그리고 DRAM, SRAM, SDRAM, DDR SDRAM은 무엇이고 어떤 특징을 가지는지 가볍게 살펴보겠다.
RAM의 특징
RAM과 같이 전원을 끄면 저장된 내용이 사라지는 저장장치를 휘발성 저장장치라 부른다. 반면, 전원이 꺼져도 저장된 내용이 유지되는 저장장치를 비휘발성 저장 장치라 부른다. 보조기억 장치들이 비휘발성 저장 장치에 해당한다.
보조기억 장치들은 전원을 꺼도 내용을 유지하지만, CPU는 보조기억장치에 접근할 수없다. 그렇기에 보조기억 장치인 비휘발성 장치에는 ‘보관할 대상’을 저장하고, 휘발성 저장 장치에는 ‘실행할 대상’을 저장한다.
RAM의 용량과 성능
- RAM의 용량이 적을 경우 보조기억 장치에서 실행할 프로그램을 가져오는 일이 잦아 실행시간이 길어진다.
- RAM 용량이 충분히 클 경우 보조기억 장치에서 많은 데이터를 가져와 미리 RAM에 저장 가능하다. 많은 프로그램을 동시에 실행하는데 유리하다.
RAM 용량이 매우 클 경우 프로그램 실행 속도는 그에 비례해 빨라질까?
⇒ NO!! RAM 용량이 커지면 프로그램 실행 속도가 증가하는 것은 사실이지만, 용량이 필요 이상으로 커졌을 경우 속도가 비례하여 증가하진 않는다.
RAM의 종류
DRAM
: Dynamic RAM의 준말이다. 저장된 데이터가 동적으로 변하는(사라지는) RAM을 의미한다.
DRAM은 시간이 지나면 저장된 데이터가 점차 사라지기에 데이터의 소멸을 막기위해 주기적으로 재활성을 해주어야 한다.
이런 단점에도 일반적으로 메모리로서 사용되는 RAM은 DRAM이다. 소비 전력이 비교적 낮고, 저렴하며, 집적도가 높기때문에 대용량으로 설계하기 유리하다.
SRAM
: Static RAM의 준말. 저장된 데이터가 변하지 않는 RAM을 의미.
주기적으로 데이터를 재활성화할 필요가 없기에 DRAM보다 속도가 빠르다.
그러나 DRAM보다 집적도가 낮고, 소비 전력도 크며, 가격도 더 비싸기에 메모리로 주로 DRAM을 이용한다.
SDRAM
: 클럭신호와 동기화된, 발전된 형태의 DRAM이다.
클럭에 맞춰 동작하며, 클럭마다 CPU와 정보를 주고받을 수 있는 DRAM이다.
DDR SDRAM
: 대역폭을 넓혀 속도를 빠르게 만든 SDRAM이다.
(대역폭 : 데이터를 주고받는 길의 너비)
DDR SDRAM은 두배의 대역폭으로 전송속도가 SDRAM보다 2배 가량 빠르다.
06-2 메모리의 주소 공간
메모리 주소에는 물리 주소, 논리 주소 두 종류가 존재한다.
물리 주소는 매모리와 하드웨어가 사용하는 주소이고, 논리 주소는 CPU가 실행 중인 프로그램이 사용하는 주소이다.
물리 주소와 논리 주소
CPU는 실행 중인 프로그램이 메모리 몇 번지에 저장되어 있는지 알지 못한다. CPU가 이해하고 있는 주소는 실행 중인 프로그램 각각에게 부여된 0번지부터 시작하는 논리 주소이다. 메모리가 사용하는 주소는 물리 주소로 말 그대로 정보가 실제로 저장된 하드웨어 상의 주소를 의미한다.
메모장, 브라우저, 게임과 같은 프로그램은 모두 물리주소가 아닌 0번지 부터 시작하는 자신만의 논리주소를 가지고 있다. 프로그램 마다 같은 논리 주소가 얼마든지 있을 수 있단 의미이다. 그리고 CPU는 이 논리주소를 받아들이고 해석하고 연산한다.
이때 CPU가 이해하는 주소가 논리 주소이고 CPU가 메모리와 상호작용하기 위해선, 논리 주소를 물리 주소로 변환하는 과정이 필요하다.
논리주소를 물리 주소로 변환하는 과정은 CPU와 주소 버스 사이에 위치한 메모리 관리 장치(MMU)라는 하드웨어에 의해 수행된다.
MMU는 CPU가 발생시킨 논리주소에 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다.
여기서 베이스 레지스터는 프로그램의 가장 작은 물리주소 → 프로그램의 첫 물리주소를 저장하데 되고, 논리 주소는 프로그램의 시작점으로부터 떨어진 거리가 된다.
메모리 보호 기법
프로그램의 논리 주소 영역을 벗어난 명령어들이 실행된다면 현재 실행 중인 프로그램은 다른 프로그램의 데이터에 간섭할 수 있게 된다.
이를 방지하기 위해, 한계 레지스터가 존재한다.
한계 레지스터는 논리 주소의 최대 크기를 저장한다.
- 베이스 레지스터 값 ≤ 프로그램 물리 주소 ≤ 베이스 레지스터 값 + 한계레지스터 값
CPU는 메모리에 접근하기 전에 접근하고자 하는 논리 주소가 한계 레지스터 보다 작은지 항상 검사한다.
만약, 한계 레지스터 보다 높은 논리주소에 접근하고자 할 경우, 인터럽트를 발생시켜 실행을 중단한다.
06-3 캐시 메모리
CPU는 프로그램 실행과정 중 메모리에 저장된 데이터를 빈번하게 이용한다. 하지만 CPU가 메모리에 접근하는 시간은 CPU연산 속도보다 훨씬 느리다. 이러한 점을 극복하기 위해 만들어 진 것이 캐시 메모리이다.
캐시 메모리를 이해하기 위해선 저장 장치 계층 구조를 먼저 이해하여햐 한다.
저장 장치 계층 구조
저장 장치는 일반적으로 아래와 같은 명제를 따른다.
- CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.
- 속도가 빠른 저장 장치는 저장 용량이 적고, 가격이 비싸다.
컴퓨터가 사용하는 저장 장치들은 ‘CPU에 얼마나 가까운가’를 기준으로 계층적으로 나뉜다. 이를 저장 장치 계층 구조라 한다.
캐시 메모리
캐시 메모리는 CPU와 메모리 사이에 위치하고, 레지스터 보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장장치이다.
컴퓨터 내부에는 여러개의 캐시 메모리가 존재하는 데, 코어와 가까운 메모리 순으로 L1, L2, L3 캐시라 부른다.
(일반적으로 L1, L2는 코어 내부에 L3는 코어 외부에 위치한다.)
L1, L2 캐시는 코어마다 고유한 캐시로 할당되고, L3 캐시는 여러 코어가 공유하는 형태로 사용된다.
참조 지역성 원리
보조 기억 장치는 전원이 꺼져도 기억할 대상을 저장하고, 메모리는 실행할 대상을 저장한다면, 캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장한다.
이때 CPU가 자주 사용할 것으로 예측한 데이터가 실제로 들어맞아 캐시 메모리 내 데이터가 CPU에서 활용되는 경우를 캐시 히트라 부른다.
반대로, 예측이 틀려, 메모리에서 필요한 데이터를 가져와야 하는 경우를 캐시 미스라 부른다.
캐시가 히트되는 비율을 캐시 적중률이라 부르며 아래와 같이 계산한다.
- 캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)
CPU가 사용할 데이터를 어떻게 예측할 수 있을까? 이때 사용되는 방법이 참조 지역성의 원리이다.
- 참조 지역성의 원리
- CPU는 최근에 접하였던 메모리 공간에 다시 접근하는 경향이 있다.
- CPU는 접근한 메모리 공간 근처를 다시 접근하는 경향이 있다.
→ 접근한 메모리 공간 근처를 다시 접근하려는 경향을 공간 지역성이라 부른다.
Chapter07. 보조기억장치
07-1 다양한 보조기억장치
하드 디스크
: 자기적인 방식으로 데이터를 저장하는 저장장치
하드 디스크에서 실절적으로 데이터가 저장되는 곳은 동그란 원판 부분이다. 이를 플래터라고 부른다.
그 플래터를 회전 시키는 구성 요소를 스핀들이라 부른다. 스핀들이 플래터를 돌리는 속도는 분당 회전 수를 나타내는 RPM 단위로 표현된다.
플래터를 대상으로 데이터를 읽고 쓰는 구성 요소는 헤드이다. 헤드는 플래터 위에서 미세하게 떠있어 데이터를 읽고 쓰는 마치 바늘같이 생긴 부품이다.
그리고 헤드는 원하는 위치로 헤드를 이동시키는 디스크 암에 부착되어 있다.
일반적으로 하드 디스크는 한 플래터 당 두개의 헤드가 붙어있는 양면 플래터를 이용한다.
이제 플래터의 저장 방식을 알아보자. 플래터는 트랙과 섹터 단위로 데이터를 저장한다.
여러겹의 플래터 상에서 같은 트랙이 위치한 곳을 모아 연결한 논리적 단위를 실린더라 부른다.
연속된 정보는 보통 한 실린더에 기록되는데, 그 이유는 디스크 암을 움직이지 않고도 바로 데이터에 접근할 수 있기 때문이다.
이제 하드 디스크가 데이터에 접근하는 과정을 생각해보자. 하드디스크가 데이터에 접근하는 시간은 탐색시간, 회전 지연, 전송 시간으로 나뉜다.
- 탐색 시간 : 접근하려는 데이터가 저장 된 트랙까지 헤드를 이동시키는 시간.
- 회전 지연 : 헤드가 있는 곳으로 플래터를 회전 시키는 시간.
- 전송 시간 : 하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간을 의미
플래시 메모리
: 전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장 장치.
플래시 메모리에는 셀이라는 단위가 있다. 이는 플래시 메모리에서 데이터를 저장하는 가장 작은 단위이다.
한 셀에 1비트를 저장할 수 있는 메모리를 SLC, 2비트를 저장할 수 있는 메모리를 MLC, 3비트를 저장할 수 있는 메모리를 TLC 타입이라 한다.
셀들이 모여 만들어진 단위를 페이지, 페이지가 모인 단위를 블록, 블록이 모인 단위를 플레인, 플레인이 모인 단위를 다이라 부른다.
플레시 메모리에서 읽기, 쓰기는 페이지 단위로 이루어 진다. 그러나 삭제는 블록 단위로 이루어진다.
이때 페이지는 3개의 상태를 가질 수 있다. Free, Valid, InValid 상태이다.
- Free : 어떤 데이터도 저장하고 있지 않아 새로운 데이터를 저장할 수 있는 상태
- Valid : 이미 유효한 데이터를 저장하고 있는 상태
- InValid : 쓰레기 값이라 부르는 유효하지 않은 데이터를 저장하고 있는 상태
여기서 문제가 발생하는데 하나의 블록에 InValid한 데이터를 가지고 있는 페이지가 존재할 경우 이 페이지는 사용되지 않을 공간인데도 용량을 차지하게 된다. 이러한 용량 낭비를 줄이기 위해 가비지 컬렉션이 존재한다.
가비지 컬렉션은 유효한 페이지들만을 새로운 블록으로 복사한 뒤, 기존의 블록을 삭제하는 기능이다.
07-2 RAID의 정의와 종류
RAID의 정의
: 하드 디스크와 SSD를 사용하는 기술로, 데이터의 안전성 혹은 높은 성능을 위해 여러 개의 물리적 보조기억장치를 마치 하나의 논리적 보조기억 장치처럼 사용하는 기술을 의미한다.
RAID의 종류
RAID의 구성 방법을 RAID 레벨이라 표현하는데, RAID 0, RAID 1, RAID 4, RAID 5, RAID 6에 대해 알아보겠습니다.
RAID 0
RAID 1
RAID 4
RAID 5
RAID 6
Chapter08
08-1 장치 컨트롤러와 장치 드라이버
장치 컨트롤러
장치 컨트롤러는 입출력 장치와 연결되어 CPU와 입출력 장치간의 통신을 중개하는 역할을 한다. 그 과정 중 장치 컨트롤러는 자신과 연결된 입출력 장치에 문제가 없는 지 오류를 검출한다.
또한 데이터 버퍼링 기능도 존재하는데, 버퍼링이란 전송률이 높은 장치와 낮은 장치 사이 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다. 즉, 데이터를 조금씩 모았다가 한꺼번에 내보내는 방법이다.
장치 컨트롤러의 내부구조를 살펴보면, 데이터 레지스터와 상태 레지스터 제어 레지스터가 존재한다.
데이터 레지스터는 CPU와 입출력 장치 사이에 주고받을 데이터가 담기는 레지스터 이다. 장치 컨트롤러는 데이터 버퍼링으로 전송률 차이를 완화하는데, 데이터 레지스터가 그 버퍼 역할을 한다.
상채 레지스터는 입출력 장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료 되었는지, 입출력 장치에 오류는 없는지 등의 상태 정보를 저장하고, 제어 레지스터는 입출력 장치가 수행할 명령어에 대한 제어 정보와 명령어 등을 저장 한다.
이 레지스터들에 담긴 값들은 버스를 타고 CPU나 다른 입출력 장치로 전달되기도 하고, 장치 컨트롤러에 연결된 입출력 장치로 전달된다.
장치 드라이버
장치 드라이버란 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게하는 프로그램이다.
프로그램이기에 당연히 실행 과정에서 메모리에 저장된다. 장치 컨트롤러가 입출력 장치를 연결하기 위한 하드웨어적 통로라면 장치
드라이버는 입출력 장치를 연결하기 위한 소프트웨어적인 통로이다.
08-2 다양한 입출력 방법
장치 컨트롤러는 어떻게 CPU와 정보를 주고받을 수 있을까?
여기에는 크게 3가지 방법이 존재한다. 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출이다.
프로그램 입출력
기본적으로 프로그램 속 명령어로 입출력 장치를 제어하는 방법이다.
CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 입출력 장치에 연결된 장치 컨트롤러와 상호작용 하며 입출력 작업을 수행한다.
프로그램 입출력 방식에서의 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로서 이루어진다. 그런데 CPU는 입출력 장치들의 주소를어떻게 알고 있는 것일까?
여기에는 크게 두가지 방식이 존재하는데, 메모리 맵 입출력과 고립형 입출력이다.
메모리 맵 입출력
: 메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다.
가령 1024개의 주소를 표현할 수 있는 공간이 있을 때 512개는 메모리 주소를, 나머지 512개는 장치 컨트롤러의 레지스터를 표현하기 위해 사용된다.
이때 중요한 점은 메모리 맵 입출력 방식에서는 CPU의 메모리 주소들이나 장치 컨트롤러의 레지스터들이나 모두 똑같이 메모리 주소를 대하듯 하면 되다는 것 이다.
그렇기에 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어는 굳이 다를 필요가 없다.
고립형 입출력
메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법이다.
이때 고립형 입출력 방식에선 CPU는 메모리에 접근하기 위한 명령어와 입출력 장치에 접근하느 명령어는 서로 다른 명령어를 사용한다.
인터럽트 기반 입출력
장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에 인터럽트 요청 신호를 보내면, CPU는 하던 일을 멈추고 인터럽트 서비스 루틴을 실행한다.
이렇게 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력이라 부른다.
만약, 여러 입출력 장치에서 인터럽트가 동시에 발생하는 경우는 인터럽트들을 어떻게 처리해야할까?
간단하게 보았을때 순차적으로 인터럽트를 처리하는 방법이 있다.
하지만 현실적으로 모든 인터럽트를 순차적으로 해결할 수는 없다. 우선순위가 더 높은 인터럽트가 올 경우 우선순위가 더 높은 인터럽트를 먼저 처리해야 한다.
예를 들어, 인터럽트 A를 처리하던 중 우선 순위가 더 높은 인터럽트 B가 들어오면, CPU는 인터럽트 A의 실행을 잠시 멈추고 인터럽트 B를 실행한뒤 다시 A를 처리한다.
우선순위를 반영하여 다중 인터럽트를 처리하는 방법에는 여러가지가 있지만 많은 컴퓨터에서는 프로그래머블 인터럽트 컨트롤러(PIC)라는 하드웨어를 사용한다.
PIC에서는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 알려준다.
DMA 입출력
입출력 장치와 메모리 사이에 전송되는 모든 데이터가 반드시 CPU를 거치게 된다면 CPU는 입출력 장치를 위한 연산 때문에 시간이 뺏기게 된다. 그렇기에 입출력 장치와 메모리가 CPU를 거치지 않고 상호작용할 수 있는 DMA가 등장하였다.
DMA 입출력을 위해선 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다.
이를 이용하면, 입출력 장치와 메모리 사이 주고 받을 데이터는 CPU를 거치지 않는다. 그렇기에 CPU는 DMA 컨트롤러에게 작업 명령을 내리고 인터럽트만 받으면 되기 때문에 작업 부담을 훨씬 줄일 수 있다.
그러나 문제가 존재한다. DMA 컨트롤러는 시스템 버스로 메모리에 직접 접근이 가능하지만 시스템 버스는 동시 사용할 수 없다. CPU가 시스템 버스를 사용할 때는 DMA컨트롤러는 시스템 버스를 사용할 수 없고, DAM 컨트롤러가 이용할 때는 CPU가 사용할 수 없다.
그렇기에 DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을 때 조금씩 이용하거나, CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락받고 시스템 버스를 집중적으로 이용한다.
입출력 버스
DMA를 위해 시스템 버스를 너무 자주 사용하면 그만큼 CPU가 시스템 버스를 이용하지 못한다
이 문제는 DMA 컨트롤러와 장치 컨트롤러들을 입출력 버스라는 별도의 버스의 연결하여 해결할 수 있다.
'책 > 혼공컴운' 카테고리의 다른 글
[혼공컴운] 6주차 - Chapter 14 ~ 15 (0) | 2025.02.27 |
---|---|
[혼공컴운] 5주차 - Chapter 12 ~ 13 (0) | 2025.02.18 |
[혼공컴운] 2주차 - Chapter04~05 (0) | 2025.01.19 |
[혼공컴운]13기_1주차(Chapter01 ~ 03) (0) | 2025.01.13 |