티스토리 뷰

계층구조의 개념

"CPU 혼자 모든 것을 다 하기엔 비용이 너무 크니, 각자 용도에 맞게 저장장치들을 함께 효율적으로 사용하자."

 

 

CPU컴퓨터의 속도를 결정하기에 가장 중요한 요소로 선정되기도 한다.

하지만 CPU가 아무리 빠르더라도 기억장치가 느리다면, CPU는 명령어나 데이터를 액세스하는 과정에서 많은 시간을 기다려야한다.

 

이렇게 속도로 CPU를 따라올 수 없는 보조저장장치들은 거대한 용량과 영구저장 능력이라는 아주 큰 메디트가 있지만 그로인해 대부분 각 장치가 개별 기계장치를 포함하기에 액세스 속도가 CPU에 비해 현저히 떨어진다.

 

이처럼 기억장치들은 유형에 따라 기능, 속도, 용량, 가격이 천차만별로 차이가 나고 각자 서로 용도가 다르기에 필요에 따라 적절한 시간, 위치에 사용되어야한다.

 

메모리 계층 구조는 이러한 컴퓨터 시스템의 기억장치들을 계층적으로 구성하여 평균 기억장치 액세스 속도를 높이고 가격대성능비를 유지하는 역할을하는 개념이다.

 

 


계층의 필요성

CPU가 코드나 데이터를 인출을 하려고 한다. 이때 다음과 같은 상황들이 발생할 수 있다.

 

  1. 주기억장치가 존재하지 않는다면, 보조기억장치에서 데이터를 이동시키고 인출을 할 수 있게 된다.
  2. 주기억장치 용량이 적다면, 프로그램이나 데이터를 조금씩 읽어 액세스 빈도가 증가한다.

 

일반적으로 보조기억장치인 디스크는 주기억장치보다 10만 배 정도 느리다. 따라서 CPU가 데이터를 읽고 싶어도 평소보다 10만 배를 더 기다려야 읽을 수 있는 것이다.

 

즉, 주기억장치의 용량이 클 수록 CPU가 데이터를 더욱 가까이 위치시키며 액세스 시간을 단축시킬 수 있다. 단, CPU와 가까운 기억장치일 수록 가격이 높아진다. 따라서 가격과 용량 및 속도 간 적절한 조정(tradeoff)를 생각해야한다.

 

결국 계층 구조는 컴퓨터의 속도를 좌우하기 위한 결정을 도와주는 개념이고 계층 구조로 나누어 바라볼 줄 알아야 컴퓨터를 좀더 효율적으로 사용할 수 있는 것이다.

 

 

메모리 계층의 특성

메모리 계층은 크게 용량, 접근 속도, 가격이라는 3가지의 특성이 있다.

상위로 올라갈 수록 하위로 내려갈 수록
비트당 가격이 높아진다.
용량이 감소한다.
액세스 시간이 짧아진다.
CPU의 액세스 빈도가 높아진다.
비트당 가격이 낮아진다.
용량이 증가한다.
액세스 시간이 늘어난다.
CPU의 액세스 빈도가 낮아지거나 불가능해진다.

 

 

 

속도 차이

대부분의 CPU는 데이터를 레지스터에 쓰거나 읽는 것에 한 주기의 클럭 신호가 걸린다. (예로 1GHz 클록 동작으로 CPU가 내부 레지스터에 읽기/쓰기 동작을 하는데 1ns (1s = 1000000000ns) 이하로 걸린다.)

 

클럭 속도(clock speed)란?
클럭은 컴퓨터가 일련의 작업을 처리하는 속도를 말한다. 즉, 64비트 환경에서 1초에 1클럭 속도를 낸다고 가정한다면, 1초에 8byte의 데이터를 처리할 수 있다는 소리다.

 

레지스터로 부터 두 계층 아래에 있는 주기억장치는 레지스터에 비해 수십에서 수백 ns 정도 액세스 시간의 차이가 난다. 따라서 주기억장체에만 있는 데이터를 읽는 것은 상당히 긴 시간이 소요되며 CPU와 주기억장치가 다른 보드에 있다면 더욱 전송 시간이 느려질 것이다.

 

 

평균 액세스 시간 계산법

앞선 글에서는 계층의 필요성과 속도의 차이를 대략적 설명했고, 이번에는 숫자를 통해 시각적으로 알아보자.

CPU가 다음 두 계층의 기억장치를 사용한다 가정하자.

 

  • 첫 번째 계층의 기억장치 액세스 시간 10ns
  • 두 번째 계층의 기억장치 액세스 시간 100ns, 대신 용량이 더 크다.

 

위와 같은 경우, 만약 액세스할 데이터가 첫 번째 계층에 있다면, CPU가 읽는 속도는 빠를 것이다.

그러나 데이터가 두 번째 계층에 있다면 CPU는 기억장치로부터 데이터를 먼저 읽어와야한다.

 

그러면 만약, 데이터가 첫 계층과 두 번째 계층에 절반씩 나누어 있다면 엑세스 시간은 어떻게 될까?

이는 다음과 같이 쉽게 계산 된다.

 

$$(계층1 데이트 점유율 * 계층1 속도) + (계층1 데이터 점유율 * 계층2 속도) = 평균 액세스 시간$$

$$(0.5 * 10ns) + (0.5 * 100ns) = 55ns$$

 

우리는 위와 같이 평균 액세스 시간이 되고 이렇게 점유율을 나누는 퍼센트에 따라 액세스 시간이 바뀐다.

 

계층 1 점유율 계층 2 점유율 평균 액세스 시간
20% 100% 82ns
40% 80% 64ns
60% 60% 46ns
80% 40% 28ns
100% 20% 10ns

 

위 표와 같은 표를 통해 우리는 자신이 부담할 수 있는 가격 선에서 자신이 사용할 용도에 맞게 최소/최대  평균 액세스 시간을 계산하여 기기를 구매할 수 있다.

 

 


내부 기억장치 & 외부 기억장치 (Internal & External Memory)

내부 기억장치 (Internal Memory)

내부 기억장치는 CPU가 직접 액세스할 수 있는 기억장치들레지스터, 캐시, 주기억장치가 이에 포함된다.

 

이 장치들은 CPU가 직접 주소를 발생시키고 주소를 가진 기억장치로부터 데이터가 인출되면 받아들이는 등, 모든 액세스 동작을 CPU가 직접 수행하도록 한다.

 

내부 기억장치의 데이터들은 모두 휘발성 데이터로 전원이 꺼지고 다시 켜질때 BIOS/UEFI에 의해 초기화된다.

 

외부 기억장치 (External Memory)

반면 외부 기억장치는 CPU가 직접 액세스하지 못하고 반드시 장치 제어기(Device Controller)를 통해 액세스하는 장치들로 자기 디스크, CD-ROM, DVD, 키보드 입력 등이 포함된다.

제어기 혹은 I/O 프로세서로 저장 및 검색이 가능한 것을 2차 기억장치 또는 보조저장장치라 부르며, 외부 기억장치라고도 부른다.

 

이러한 저장장치는 바이트나 단어가 아닌 블록(block)과 레코드(record) 단위로 액세스가 가능하다.

더보기

블록과 레코드는 디스크 구조에서 물리적 저장하는 섹터에 내부 값으로 실제 데이터가 저장되는 크기이다.

기본적으로 블록의 최소 단위는  512byte로 섹터는 블록을 묶은 모음이다.

 

 

 


CPU Register

CPU는 ALU(산술논리연산자)와 레지스터 세트(Register set) 및 제어 유닛(Control Unit)으로 구성된다.

이번 장에서 우리는 기억장치만 다루니 레지스터에 대해서 말해보자.

 

레지스터 (Register)

레지스터는 CPU 재부 기억장치로 액세스 속도가 컴퓨터 기억장치 중 가장 빠르다.

하지만, 레지스터의 내부 회로는 복잡하여 비교적 큰 공간을 차지하기에 그 용량이 작고 특수 목적 레지스터와 일반 목적 레지스터로 이루어져 있다.

 

CPU는 기억장치에 저장된 명령어들을 인출하여 실행하는 작업을 수행한다. 이러한 작업을 위해 CPU 내부에는 다양한 레지스터가 포함된다.

 

명칭 설명
프로그램 카운터
(Program Counter: PC)
다음 인출될 명령어 주소를 가지는 레지스터 (연속된 명령어는 1만큼 증가하며 주소를 읽음, 분기(branch) 명령어는 다음 분기 주소를 갱신)
누산기 (Accumulator: AC) 데이터를 일시적으로 저장하는 레지스터, 단어 길이만큼 비트 수를 저장한다.
명령어 레지스터
(Instruction Register: IR)
가장 최근 인출된 명령어를 저장하는 레지스터
기억장치 주소 레지스터
(Memory Address Register: MAR)
프로그램 카운터에 저장된 명령어 주소시스템 주소 버스로 출력되기 전 일시적 저장되는 주소 레지스터
기억장치 버퍼 레지스터
(Memory Buffer Register: MBR)
기억장치에 저장될 데이터 혹은 기억장치에서 읽은 데이터가 일시 저장되는 버퍼 레지스터 (데이터 버스 선과 직접 연결)

 

※ 더 자세한 내용은 여기서 다루지 않겠다.

 


RAM (Random Access Memory)

RAM은 읽기와 쓰기가 모두 가능한 반도체 기억장치로 저장된 각 단어들을 CPU가 전송하는 주소에 의해 직접 액세스가 가능한 기능을 제공한다. 이로써 선형적 접근이 아니기에 모든 위치에 동일한 시간으로 액세스가 가능하다. 하여 RWM(Read Write Memory)라고 불릴 수도 있다.

 

RAM의 큰 특징 중 하나는 휘발성(volatile)이라는 것이다. 즉, 전원 공급이 중단되면 데이터를 잃어버린다. 따라서 영구 저장장치로 사용될 수 없다.

 

RAM은 제조 기술에 따라 DRAM과 SRAM으로 분류된다.

 

DRAM (Dynamic RAM)

DRAM은 커패시터(capaciter)에 전하(charge)를 충전하는 방식으로 비트값을 저장하는 기억 셀들로 이루어졌다. 기억 셀에 전하가 저장되면 1, 저장되지 않으면 0으로 데이터를 저장한다.

 

안타깝게도 현대 기술로는 전기 에너지를 영구 저장하는 기술이 없다. 즉, 전하를 충전하여 데이터를 구분하는 DRAM의 방식은 점차적 방전(discharge) 성질 때문에 재충전(refresh)을 주기적으로 해주어야 한다.

 

단, 단순하게 전하를 저장하는 공간만 필요하기에 기억 셀의 크기가 작고 밀도가 높아 용량이 크고 가격이 싼편이다.

📌 커패시터 (capaciter)
전기 회로에서 전기 용량을 전기적 퍼텐셜 에너지로 저장하는 장치

 

 

SRAM (Static RAM)

SRAM은 기억 셀을 플립-플롭(flip-flop) 방식으로 저장한다. 플립-플롭 방식은 한곳에 전하를 가두는 것이 아닌, 전기를 무한 순환하여 데이터를 안정된 상태로 저장할 수 있고 재충전할 필요가 없으며 속도가 빠르다. 하지만 무한 순환 추가적 회로 공간이 필요하고 가격이 비싸진다.

 

 

 

위 두 분류의 RAM은 각각의 장단점에 의해 서로 다른 목적으로 많이 사용된다.

DRAM은 높은 용량을 통해 반도체 메모리카드 제작에 많이 사용되며 SRAM은 캐시 메모리에 많이 사용된다.

 

 


ROM (Read Only Memory) * 번외

ROM은 이름 그대로 읽기 전용 메모리를 의미한다.

보통 읽기 전용이라면 변경될 수 없는 중요한 데이터들이 저장되는데, ROM은 딱 이렇게 중요한 데이터들이 저장된다.

 

  1. 시스템 초기화 및 진단 프로그램
  2. 빈번히 사용되는 함수들과 서브루틴들
  3. 제어 유닛과 마이크로프로그램

ROM은 비휘발성 기억장치로 전원 공급이 중단되어도 영구 저장하는 반도체 기억장치이다. ROM은 대부분 RAM과 함께 주기억장치의 일부분으로 사용된다.

 

ROM의 내용은 제조 과정에서 밀 ㅣ결정되고 추후 수정이 불가능하게 된다. 이러한 제한을 완화하기 위해 다양한 추가 개발된 ROM이 존재한다.

 

PROM 단 한번 수정 가능한 ROM (내부 데이터 내용이 비어있어서 삽입 가능)
EPROM 자외선으로 모든 데이터를 초기화하여 수만번 수정 가능 (20분정도의 초기화 시간과 전체 포맷이 필수)
EEPROM 전기적 에너지로 데이터 갱신(update) 가능, 바이트 단위로 갱신, 비휘발성으로 읽기/쓰기 가능
플래시 메모리 전기로 빠른 속도로 2K~4K 블록 단위로 데이터 삭제가 가능, 갱신 횟수는 제한되지만 가장 많이 갱신 가능

 

 


캐시 메모리 (Cache Memory)

위 문단에서 우리는 속도 차이로 인해 CPU가 대기할 수 있는 경우를 알아보았다. 이 문제를 해결하려 대부분의 컴퓨터는 CPU와 주기억장치 사이에 캐시 메모리(cache memory)를 설치하여 사용한다. (캐시는 기본적으로 프로그램을 통해 직접 읽거나 쓸 수 없고 프로그래머에게 보이지 않는다.)

 

캐시는 CPU와 주기억장치 간 속도 차이를 보완하기 위해 데이터를 일시 저장해주는 중간 버퍼 기능을 수행한다. (대략 2ns~10ns)

 

캐시는 CPU 칩과 인접한 곳이나 내부에 있기도하며, 여러 레벨의 계층적 캐시로 구성되기도 한다.

 

 

CPU 데이터 인출

CPU가 기억장치에서 데이터를 읽으려 할 때, 가정 먼저 캐시를 확인한다. 만약 데이터가 캐시에 있다면 바로 사용할 수 있기 때문이다.

 

하지만 데이터가 없다면 캐시 미스(cache miss)가 일어나 다른 기억장치에서 데이터를 가져온다.

 

 

 

위 그림은 데이터가 이동되는 경로를 보여준다. 여기서 캐시 메모리가 저장되고 사용되는 순서를 보자.

 

캐시 미스(Cache Miss)
  1. CPU가 캐시에서 데이터를 찾는다.
  2. 캐시에 데이터가 존재하지 않아 캐시 미스가 발생한다.
  3. CPU가  주기억장치에서 데이터를 찾는다.
    • CPU가 주기억 장치에서 데이터를 찾았다.
      • CPU가 메인메모리에 해당 데이터 블록을 가져와 캐시에 저장한다.
      • CPU가 캐시 테이블에서 데이터를 가져와 사용한다.
    • CPU가 주기억 장치에서 데이터를 찾지 못했다. 
      • 보조기억장치로 내려가 디스크 캐시에서 데이터를 찾는다.
        • 디스크 캐시에 데이터가 없다.
          • 보조기억장치 내부로 들어가 데이터를 찾는다.
          • RAM이 디스크 캐시에 사용한 데이터를 저장한다.
          • CPU가 보조기억장치에서 해당 데이터 블록을 캐시에 저장한다.
          • CPU가  캐시 테이블에서 데이터를 가져와 사용한다.
        • 디스크 캐시에 데이터가 있다.
          • CPU가 보조기억장치에서 해당 데이터 블록을 캐시에 저장한다.
          • CPU가  캐시 테이블에서 데이터를 가져와 사용한다.

 

CPU에서 원하는 데이터가 캐시에 적제되어 있는 상태를 캐시 적중(Cache Hit)라고 하고 적제되지 않은 상태를 캐시 미스(Cache Miss)라고 한다. 그리고 매번 데이터를 인출할 때, 캐시 적중이 발생하는 비율을 캐시 적중률(Cache Hit Ratio)라고 한다.

 

$$캐시 적중률(CHR) = \frac{캐시에 적중되는 횟수}{전체기억장치 액세스 횟수}$$

 

캐시 적중 캐시 미스 캐시 적중률 캐시 미스율
캐시를 찾는 횟수 캐시를 찾지 못하는 횟수 H = 적중 횟수 / 액세스 수 1-H

 

 

캐시의 지역성 (Locality)

캐시의 적중률은 프로그램과 데이터의 지역성에 크게 의존한다. 지역성이란 CPU가 주기억장치의 특정 부분에 위치한 코드나 데이터를 빈번히, 집중적 액세스하는 현상으로 3가지 분류로 나뉠수 있다.

 

시간적 지역성 (Temporal locality)

 

최근 액세스된 코드나 데이터가 가까운 미래에 다시 액세스될 가능성이 높다는 특성이다.

반복 루프 프로그램이나 서브루틴을 반복적 호출하여 공통 변수도 빈번히 액세스 된다.

 

for, while과 같은 반복자에 의해 같은 메모리 액세스가 빈번할 수 있다는 소리이다.

 

 

공간적 지역성 (Spatial locality)

 

서로 인접하게 저장된 데이터들이 연속적으로 액세스될 가능성이 높다는 특성이다.

표나 배열 데이터가 연산 중 서로 인접한 데이터에 액세스될 가능성이 높은 것을 고려한 지역성이다.

 

배열, 벡터와 같은 데이터가 서로 인접한 데이터로 액세스가 전환될 가능성이 높다는 소리다.

 

 

순차적 지역성 (Sequential locality)

 

분기(branch)가 발생하지 않는 이상 기억장치에 순서대로 인출 될 가능성이 높다는 특성이다.

표나 배열 데이터가 연산 중 서로 인접한 데이터에 액세스될 가능성이 높은 것을 고려한 지역성이다.

 

데이터가 메모리에 저장된 순서로 출력될 가능성이 높다는 의미이다. 클래스 객체나 구조체, 멤버 함수들과 같은 데이터 호출에 사용될 수 있다.

 

 

이러한 지역성들은 CPU의 캐시 적중률을 높여주기 위해 설계되는 과정 또한 존재한다.

 

 

캐시 적중률 향상

위 특성들을 통해 캐시의 적중률을 상향 시키기 위해서는 캐시 설계에 있어 다음 공통 목표가 설정된다.

 

캐시 적중률 극대화 CPU가 원하는 정보가 캐시에 있을 확률을 높여야 한다.
캐시 액세스 시간 최소화 캐시 적중 시 캐시로부터 CPU로 정보를 인출하는 시간을 단축시켜야 한다.
캐시 미스의 지연시간 최소화 캐시 미스 발생 시, 주기억장치의 캐시 정보를 읽는 시간을 최소화 시킨다.
주기억장치와 캐시간 데이터 일관성 유지 및 오버헤드 최소화 CPU가 캐시 내용을 변경할 때, 읽어오는 내용 갱싱 절차로 발생하는 지연시간을 최소화

 

이외에도 물리적으로 캐시의 용량이 크다면 캐시 적중률은 당연히 향상된다.

캐시가 저장되는 공간이 크기에 더 갱신하거나 공간이 부족할 때, 제거해야하는 수고를 덜기 때문이다.

 

 

캐시 메모리 계층

캐시 메모리는 내부적으로 계층이 나누어져 있다. 

레벨 1 캐시 (L1 캐시) L1 캐시는 CPU 코어와 직접 연결, 가장 빠른 액세스 시간을 가지며 작은 용량을 가진다.
레벨 2 캐시 (L2 캐시) L2 캐시는 L1 캐시보다 크고 약간 느리다, 여러 코어가 공유할 수 있고, 여러 코어 간의 데이터 교환을 허용하는 경우가 많다.
레벨 3 캐시 (L3 캐시) L3 캐시는 여러 CPU 코어 간에 공유되는 고용량 캐시 사용, 여러 코어 간의 데이터 공유를 위해 사용되며, 주로 멀티코어 프로세서에서 사용

 

 


 

디스크 캐시 (Disk Cache)

외부 기억장치는 거의 ms의 액세스 시간이 소요되어 ns로 작업하는 내부 기억장치에 비해 현저히 느리다.

하여 속도 차이를 줄이기 위해 주기억 장치와 디스크 사이에는 디스크 캐시(disk cache)라는 반도체 기억장치가 설치되기도 한다.

 

 

디스크 캐시는 디스크에서 읽혀질(swap-out) 데이터를 일시적으로 저장하는 버퍼 역할을 하며, CPU가 동일한 정보를 액세스할 때 바로 버퍼의 내용을 전달한다.

 

디스크 캐시는 디스크 쓰기 동작을 묶음별로 처리하여 적은 수의 데이터를 여러번 걸치지 않고 큰 단위로 한 번에 디스크에 저장한다. 그렇게 하면 디스크를 액세스하는 횟수가 줄어들고, 프로세스의 전송 개입이 최소화 된다.

 

디스크 캐시는 CPU와 장치 제어기 모두 직접 액세스가 가능하여, 내부 기억장치와 외부 기억장치 사이에 속한다고 볼 수 있다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함