컴퓨터 하드웨어는 크게 중앙처리장치(CPU), 메인 메모리(기억 장치), 입출력 장치로 나뉘며 이들은 모두 버스(Bus)로 연결되어 있습니다. 이번 포스팅에서는 기억 장치에 대해서 알아보겠습니다.
기억 장치
기억 장치는 CPU에서 계산한 결과를 저장하는 공간입니다. 다음의 그림은 기억 장치를 성능에 따라 계층적으로 분류한 기억 장치의 계층 구조입니다.
기억 장치의 특성을 결정하는 요소는 다음과 같습니다.
- 기억 용량: 동일한 비용에서의 기억 장치의 용량
- 접근 시간: 기억 장치에 읽기/쓰기 요청을 한 후, 요청한 정보를 꺼내서 사용한 가능할 때까의 시간
- 사이클 시간: 기억 장치에 읽기/쓰기 요청을 한 후, 다시 요청할 수 있을 때까지 기다려야 하는 시간
- 대역폭: 기억 장치가 단위 시간에 처리할 수 있는 정보
저장 장치는 크게 주기억 장치와 보조기억 장치로 나눌 수 있습니다.
주기억 장치
주기억 장치(메인 메모리)는 외부에서 들여온 데이터를 보관할 공간을 말합니다. CPU에 의해 수행될 프로그램과 데이터가 저장되는 곳입니다. 주기억 장치는 RAM과 ROM으로 분류됩니다.
RAM과 ROM
RAM(Random Access Memory)은 공급되던 전원이 꺼지면 저장된 내용이 사라지는 휘발성 메모리입니다. Random Access라는 뜻에 걸맞게 메인 메모리의 어느 주소이든지 동일한 접근 속도로 접근 가능합니다. RAM은 "정적 RAM"과 "동적 RAM"으로 분류됩니다.
- 정적 RAM(Static): SRAM은 플립플랍으로 구성되며, 전원이 공급되는 동안 기억 내용이 유지됩니다. SRAM은 캐시 메모리로 사용됩니다.
- 동적 RAM(Dynamic): DRAM은 콘덴서로 구성되며 전원이 공급되어도 일정 시간이 지나면 전하가 방전되어 주기적인 재충전이 필요합니다. DRAM은 일반적인 주기억 장치에 사용됩니다.
ROM(Read Only Memory): 전원이 제거되어도 저장된 내용이 지워지지 않는 비휘발성 메모리입니다. ROM도 Random Access 특성을 가지고 있습니다. 전원이 제거되어도 내용이 지워지지 않는 특성으로 인해 ROM 내의 데이터는 오직 읽기만 가능하며 보통의 방법으로는 변경할 수 없습니다. 또한 "기본 입출력 시스템(BIOS)"와 컴퓨터를 부팅할 때 수행되어야 하는 "자가진단 프로그램"과 "부트스트랩 로더"를 저장합니다. ROM은 저장 방식에 따라 다음과 같은 세부 종류들이 있습니다.
- PROM: 단 한 번만 프로그래밍할 수 있으며, 각 메모리 셀에 많은 전류를 흘릴 경우, 한 번에 끊어질 수 있다.
- EPROM: 프로그래밍할 수 있으며 별도의 장치를 통해 자외선으로 프로그래밍할 수 있다.
- EEPROM: EPROM과 유사하나 별도의 프로그램 장치 없이 PCB에서 직접 재프로그래밍할 수 있다.
- 플래시 메모리: EEPROM에 기반하여 전원이 꺼진 상태에서도 데이터가 지워지지 않는다. 데이터를 읽는 속도가 빠르고 하드디스크보다 충격에 강해 휴대용 기기에 주로 사용된다.
주기억 장치의 특징
주기억 장치는 다음과 같은 특성을 가진다.
- 컴퓨터가 프로그램을 수행하기 위해 프로그램은 주기억 장치에 있어야 한다.
- 프로세서가 직접 접근할 수 있는 유일한 대량 저장 장치이다.
- 수십만~수억의 크기를 가진 바이트 혹은 워드의 배열로 구성되어있고 각 워드는 자신의 주소를 가진다.
- CPU와의 상호 작용은 특정 기억 장치 주소에 일련의 load(read)나 store(wirte)명령을 통하여 수행된다.
load: 주기억 장치로부터 CPU 내부의 레지스터로 워드를 이동시킨다.
store: 레지스터의 내용을 주기억 장치로 이동시킨다.
보조기억 장치
보조기억 장치는 주기억 장치에 비해 속도는 느리지만 전원이 차단되어도 내용이 유지됩니다.
자기 테이프
초기의 보조기억 장치로 주로 사용되었으며, 거의 영구적이며 많은 양의 자료를 보관할 수 있습니다. 그러나 위치에 따라 접근 시간 차이가 심하고 순차적 접근만 가능하여 속도가 느립니다. 예비용이나 자주 사용하지 않는 정보의 백업에 사용되거나 시스템 간의 정보 전송을 위한 매체로 사용됩니다. 현재는 많이 사용하지 않는 장치입니다.
자기 디스크
주기억 장치의 확장용으로 매우 큰 프로그램과 자료를 장기간 저장하는 용도로 사용됩니다.
디스크 방식의 기억 장치는 디스크 헤드를 원하는 트랙에 직접 위치시킬 수 있습니다. 이를 "직접 접근 방식(Direct Access)"입니다. 디스크의 직접 접근 방식과 달리 기계적인 장비가 포함되지 않는 반도체 기반 기억 장치들은 "임의 접근 방식(Random Access)"이라고 합니다.
디스크와 같은 직접 접근 저장 장치는 데이터를 저장하거나 재생하기 위해서는 다음의 3단계가 진행됩니다.
- 디스크 헤드를 적당한 트랙으로 옮긴다. (Seek Time)
- 디스크를 회전시켜 섹터를 찾는다. (Rotation Latency 또는 Rotation Delay)
- 디스크 헤드를 통해서 데이터를 전송한다. (Transfer Time)
디스크를 사용하기 위해 필요한 총 수행 시간은 다음의 합입니다.
$$ \text{디스크 접근 시간} = \text{seek time} + \text{rotation latency} + \text{transfer time} $$
SSD(Solid State Disk)
기계식 하드 디스크는 디스크 헤드의 물리적 조작으로 인해 속도가 저하되고, 충격에 의한 기기 손상 가능성으로 인해 최근에는 플래시 메모리를 이용한 SSD(Solid State Disk)의 사용이 보편화되고 있습니다. SSD는 내구성이 강하고 전력 소모가 적다. 다만, 재생 속도에 비해 기록 속도가 느리고, 기록과 삭제 횟수가 한정되어 기대 사용 수명이 미리 정해집니다.
SSD는 순차적인 읽기와 쓰기는 비슷한 성능을 가지고 랜던 순서로 접근할 때는 읽기가 쓰기보다 빠릅니다. 플래시 메모리의 근본적인 특성 때문에 이러한 차이가 생깁니다.
RAID(Redundant Array of Inexpensive Disks)
RAID는 중요한 데이터를 가지고 있는 서버에 주로 사용됩니다. RAID는 여러 대의 하드 디스크가 있을 때 동일한 데이터를 다른 위치에 중복해서 저장하는 방법입니다. 한 개의 대형 디스크를 사용하는 것보다 크기가 작은 여러 개의 디스크들을 서로 연결하여 하나의 큰 용량을 가진 디스크 배열을 구성하면 더 저렴하지만 더 큰 용량을 가진 디스크 시스템을 구성할 수 있습니다. 이러한 구조는 다음의 장점들이 있습니다.
- 데이터 분산 저장에 의한 동시 엑세스 가능
- 병렬 데이터 채널에 의한 데이터 전송 속도 향상
RAID는 운영체제에게 논리적으로 하나의 하드 디스크로 인식됩니다. RAID는 스트라이핑(Striping)을 통해 각 드라이브의 저장 공간을 다양한 범위로 파티션할 수 있습니다. RAID의 실제 구현 방법은 여러가지가 있습니다.
- RAID-0: 스트라이프를 가지고 있지만 데이터를 중복해서 기록하지 않는다. 가장 높은 성능을 가지지만, 고장 대비 능력이 없다.
- RAID-1: 중복 저장된 데이터를 가진 두 개 이상의 드라이브로 구성된다. 각 드라이브를 동시에 읽을 수 있기에 읽기 성능은 향상 되고 쓰기 성능은 단일 디스크 드라이브의 경우와 같다. 거의 완전한 결함 허용도를 제공하지만, 가격이 비싸다.
- RAID-2: 비트-단위 인터리빙 방식을 사용하여 데이터를 각 디스크에 비트 단위로 분산 저장한다. 필요한 검사 디스크의 수가 많아 가격이 비싸다. 그렇기에 오류가 많은 환경에서 사용한다.
캐시 메모리
캐시 메모리는 CPU(속도 빠름)와 메인 메모리(속도 느림) 사이에 위치하여 데이터 접근 효율성을 향상시키기 위한 메모리입니다.
메인 메모리로부터 CPU로 로드되어 사용된 데이터를 캐시 메모리에 보관합니다. 데이터를 사용할 때에는 캐시 메모리 내의 데이터를 먼저 사용하여 메인 메모리로의 접근 횟수를 줄여 속도를 향상시킬 수 있습니다.
캐시 메모리는 지역성의 원칙을 활용합니다. 컴퓨터 프로그램은 일반적으로 시간적 지역성과 공간적 지역성의 특징을 가집니다.
- 시간적 지역성: 한 번 사용한 정보는 시간적으로 곧 다시 사용될 가능성이 높다는 것이다.
- 공간적 지역성: 한 번 사용된 정보의 근처 영역이 다시 사용될 가능성이 높다는 것이다.
캐시 메모리의 동작 방식은 다음과 같습니다.
- 데이터를 주기억 장치로부터 캐시로 복사한다.
- 캐시에서 데이터를 꺼내어 처리한다.
- 다음 번 데이터 요구 시 캐시를 검사하여 원하는 데이터가 있으면 꺼내온다.
- 만일 캐시에 원하는 데이터가 없으면 주기억 장치에서 꺼내온다.
- 다시 사용하는 메모리 부분을 캐시에 복사한다.
CPU가 캐시 메모리에서 원하는 데이터를 찾을 경우를 "적중(Hit)"하였다고 합니다. 원하는 정보가 캐시 메모리에 존재할 확률인 "캐시 적중률"은 다음과 같습니다.
- 캐시 적중률(H): 캐시 적중 횟수 / 전체 기억 장치 참조 횟수
- 평균 기억장치 엑세스 시간($T_{\text{access}}$): $T_{\text{access}} = H \times T_{\text{cache}} + (1 - H) \times (T_{\text{memory}} + T_{\text{cache}}) $, 이때 $T_{\text{cache}}$는 캐시 엑세스 시간, $T_{\text{memory}}$은 주기억 장치 액세스 시간을 의미한다.
캐시 메모리는 상대적으로 용량이 적어 캐시 메모리의 내용은 필요할 때마다 교체되어야 합니다. 그렇기에 캐시 메모리의 교체 알고리즘은 캐시 적중률에 많은 영향을 끼칩니다.
- 최소 최근 사용(LRU) 알고리즘: 사용되지 않은 채로 가장 오래 있었던 블록을 교체하는 방식
- FIFO(First In First Out) 알고리즘: 캐시에 적재된 오래된 블록을 교체하는 방식
- 최소 사용 빈도(LFU) 알고리즘: 참조되었던 횟수가 가장 적은 블록을 교체하는 방식
캐시 메모리를 사용하며 캐시의 내용이 변경되었을 때, 그 내용을 주기억 장치에 갱신하는 시기와 방법을 결정해야 합니다.
- Write-Through: 모든 쓰기 동작들이 캐시로 뿐만 아니라 주기억 장치로도 동시에 수행되는 방식
- Write-Back: 캐시에서 데이터가 변경되어도 주기억 장치에는 갱신되지 않는 방식