"이것이 취업을 위한 컴퓨터 과학이다 with CS 기술면접" 책을 참고했습니다.
1. 메모리
이전 장에서 CPU에 대해서 설명할 때, 현재 실행 중인 프로그램은 메모리에 저장되어 있고, CPU가 실행할 명령어는 메모리에 저장되어 있어야 한다고 추가적으로 설명했었는데, 이번에 좀 더 알아보자.
1-1 RAM
메인 메모리 역할을 하는 하드웨어에는 크게 RAM과 ROM이 있다고 했었고, 대부분 메인 메모리의 경우에는 RAM을 지칭한다. RAM은 전원 종료시 데이터가 모두 날라가는 휘발성 저장장치이며, 위에서 설명했던 것처럼 CPU가 실행할 대상을 저장하는 부품이다. 보조기억장치에 있는 프로그램을 CPU가 바로 불러올 수 없기 때문에 메모리로 불러오는 과정을 거쳐야하는데, 이 과정에서 RAM의 크기가 성능에 많은 영향을 끼친다. 크기가 작다면 매번 불러올 수 있는 프로그램에 한계가 있기 때문에 그만큼 지연된다.
RAM의 뜻은 임의 접근 메모리(random access memory)의 약자로, 임의 접근이란 저장된 순서대로 가져오는게 아니라 임의의 위치에 곧장 접근 가능한 방식을 말하며, 직접 접근이라고 부르기도 한다. 임의 접근과 반대되는 개념으로는 순차 접근이 있으며, RAM은 각각의 특성에 따라 다양한 종류가 존재한다.
- DRAM : D는 Dynamic, 즉 데이터가 동적으로 변한다는 뜻으로 시간이 지나면 저장된 데이터가 점차 사라지는 RAM을 의미한다. 그래서 주기적으로 재활성화해줘야되지만, 소비 전력도 낮고 저렴하며 집적도가 높아 일반적으로 많이 사용하는 RAM이다.
- SRAM : DRAM과 달리 저장된 데이터가 변하지 않는 정적(Static)인 RAM을 의미하며, 시간이 지나도 저장된 데이터가 사라지지 않는다. 다만 켜진 상태일 때를 말하는거지, RAM인 이상 전원이 꺼지면 똑같이 데이터는 날아간다. SRAM은 속도가 빠르지만 전력 소비도 크고 비용도 비싸 캐시 메모리같이 대용량으로는 필요없지만 속도는 필요한 장치에 사용된다.
- SDRAM : 일반적인 DRAM에서 더 나아가 클럭 신호와 동기화(Synchronous)된 형태이다. 클럭 신호와 동기화됐다는 뜻은 클럭 타이밍에 맞춰 CPU와 데이터를 주고받을 수 있는 것을 의미한다.
- DDR SDRAM : 더나아가 대역폭(데이터를 주고받는 통로의 넓이)을 넓혀 속도를 빠르게 만든 SDRAM을 의미한다. DDR2 SDRAM은 DDR SDRAM보다 대역폭이 2배 넓으며, 같은 논리로 DDR3는 DDR2보다 2배 넓다. 현재 흔한 메모리는 DDR4 SDRAM을 사용하고 있다.
1-2 빅 엔디안, 리틀 엔디안
메모리에 바이트를 저장하는 방식은 연속해서 저장하는 바이트를 어떤 순서로 저장하는지에 따라 크게 빅 엔디안과 리틀 엔디안으로 나뉜다.
- 빅 엔디안 : 낮은 번지의 주소에 상위 바이트부터 저장하는 방식이며, 상위 바이트는 가장 큰 수로 해석해도 무방하다. 즉 큰 단위의 수부터 차례대로 저장하는 방식을 의미한다.(123 이라는 10진수면 1이 상위 바이트)
- 일상적으로 수를 세는 체계와 동일하기 때문에, 메모리 값을 읽거나 디버깅하는 등 사람이 가독하기에 편하다.
- 리틀 엔디안 : 낮은 번지의 주소에 하위 바이트부터 저장하는 방식이다.
- 읽기에는 불편하지만, 수치 계산에는 편리하다.(숫자를 더할 때 1부터 차례대로 더하는 것 같이)
1-3 캐시 메모리
CPU는 프로그램을 실행하기 위해서는 빈번히 메모리에 접근해야 한다. 하지만 아무리 빨라도 레지스터에 접근하는 속도보다 느리기 때문에 CPU의 연산 속도가 아무리 빨라도 메모리에 접근하는 속도가 느리면 의미가 없다. 이를 해결하기 위해 등장한게 바로 캐시 메모리(Cache Memory)다.
캐시 메모리는 위에서 말한 CPU의 연산 속도와 메모리 접근 속도의 갭을 줄이기 위해 등장한 저장장치로 CPU와 메모리 사이에 위치한 SRAM 기반의 저장장치이다. 매번 왔다갔다 할 수 없으니 미리 CPU가 사용할 일부 데이터를 캐시 메모리에 가져와 활용하는 것이다.
컴퓨터 내부에는 다양한 캐시 메모리가 있는데, CPU 코어와 가까운 정도에 따라 L1 캐시(Level1 Cache), L2 캐시, L3 캐시라고 부른다. L1,L2는 일반적으로 코어 내부에, L3는 외부에 위치해 있다.
또한 코어와 가장 가까운 L1 캐시 메모리의 경우, 명령어만 저장하는 L1 캐시인 L1I 캐시와 데이터만을 저장하는 L1D 캐시로 구분하기도 하며, 이런 유형의 캐시 메모리를 분리형 캐시(split cache)라고 한다.
아래는 메모리의 크기와 유형에 따른 메모리 계층 구조인데, 저장 장치에 대해 이해하는데 도움이 된다.
캐시 히트와 캐시 미스
캐시 메모리는 크기가 한계가 있기 때문에 모든 데이터를 가져올 수는 없다. 그렇다면 어떤 데이터를 저장해야할 지 정해야 할텐데, 메모리의 경우 실행 중인 것을 저장한다면 캐시는 CPU가 사용할 법한 것을 저장한다.
이렇게 캐시가 예측해서 저장한 데이터가 실제로 CPU가 바로 사용할 경우를 캐시 히트라고 하며, 반대로 예측했지만 틀려서 CPU가 추가적으로 데이터를 직접 메모리에서 가져와야 하는 경우를 캐시 미스라고 한다.
참고로 캐시가 히트되는 비율을 캐시 적중률(cache hit ratio)라고 하며 범용적인 컴퓨터의 적중률은 85 ~ 95% 정도이다.
참조 지역성의 원리
캐시 히트의 중요성을 위에서 잠깐 설명했듯이, 캐시 메모리가 유용하게 쓰일려면 캐시 적중률을 높이는게 중요하다. 캐시 메모리는 참조 지역성의 원리라는 원칙에 따라 메모리로부터 가져올 데이터를 정한다. 참조 지역성의 원리란 CPU가 메모리에 접근할 때 보이는 다음과 같은 경향을 의미한다.
- 시간 지역성 : CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.
- 공간 지역성 : CPU는 접근한 메모리 공간의 근처에 접근하려는 경향을 보인다.
시간 지역성을 잘 보이는 예는 프로그래밍 언어의 변수가 대표적이고, 공간 지역성의 대표적인 예는 배열이 대표적이다.
캐시 메모리의 쓰기 정책과 일관성
위에서는 캐시 메모리에서 데이터를 읽어오는 경우를 이야기했다면, 이번에는 캐시 메모리에 데이터를 쓰는 경우를 가정해보자. 캐시 메모리에 데이터를 쓸 때는 원래 메모리에 있었던 정보와 일관성을 유지해야만 한다. 이를 유지하기 위한 대표적인 방법으로는 크게 2가지가 있다.
- 즉시 쓰기(write-through) : 캐시 메모리와 메모리에 동시에 쓰는 방법이며, 일관성이 깨지는 문제는 방지할 수 있지만, 버스의 사용시간이나 쓰기 시간이 늘어난다는 문제가 있다.
- 지연 쓰기(write-back) : 캐시 메모리에만 적어 두었다가 추후 수정된 데이터를 한 번에 메모리에 반영하는 방식이다. 속도는 즉시 쓰기 방식보다 빠르지만 일관성이 깨질 수도 있는 문제를 안고 있다.
또 현재는 캐시 메모리와 메모리에 대해서만 고려했지만, 다른 코어가 사용하는 또다른 캐시 메모리도 고려한다면 문제는 더 복잡해질 수도 있다. 중요한 건 캐시 메모리를 사용, 즉 캐싱을 한다는 건 빠른 성능을 보일 수는 있지만 데이터의 일관성을 위한 책임이 따르는 방식임을 인지해야 한다.
2. 보조기억장치와 입출력장치
보조기억장치는 비휘발적이며, 메모리보다 큰 저장 공간을 제공한다. 보조기억장치가 어떻게 데이터를 저장하고 관리하는지에 대해서 알아보고 그에 따라 보조기억장치를 포함한 다양한 입출력장치가 어떻게 수행하는지에 대해서도 한 번 알아보자.
2-1 RAID
가장 대중적인 보조기억장치는 크게 2가지다. 하나는 하드디스크이고 다른 하나는 플래시 메모리 기반 저장장치를 의미한다. 이런 보조기억장치는 전원이 꺼져도 데이터를 안전하게 저장하는 것과 CPU가 필요로 하는 정보를 빠르게 메모리에 전달하는 것이 중요하다. 이를 위해 사용하는 기술이 바로 RAID(Radundant Array of Indepencent Disks)이다.
RAID는 데이터의 안전성과 성능을 확보하기 위해 여러 개의 독립적인 보조기억장치를 마치 하나의 보조기억장치처럼 사용하는 기술을 의미한다. RAID를 구성하는 방법에는 여러가지가 있으며 이를 RAID 레벨이라고 표현한다. 대표적인 것만 확인해보자.
- RAID0 : 단순하게 데이터를 여러 보조기억장치에 나누어 저장하는 방식이다. 이때 마치 줄무늬처럼 분산되어 저장된 데이터를 스트라입(stripe)이라고 하며 이런 분산 저장 방식을 스트라이핑이라고 한다.
- 빠른 입출력 속도가 장점이다.
- 저장된 정보가 안전하지 않다. 보조기억장치 하나에 문제가 생기면 불완전한 데이터가 되기 때문이다.
- RAID1 : 완전한 복사본을 만들어 저장하는 방식이다. 따라서 미러링이라고 부르기도 한다.
- 복구가 간단하고 안전성이 높다.
- 다만 데이터를 쓸 때 원본과 복사본에 적어야 하기 때문에 쓰기 속도가 느려지고, 복사본이 저장된 크기만큼 사용 가능한 용량이 줄어든다.
- RAID4 : 패리티 정보를 저장하는 디스크를 따로 두는 방식이다. 패리티(parity)란 오류를 적출할 수 있는 정보를 말한다.
- 오류 검출용 장치를 따로 두므로 적은 하드디스크로도 안전하게 데이터 보관이 가능하다.
- 패리티를 저장하는 장치에 병목 현상이 발생한다. 하드 디스크 4개에 정보를 저장하게 되면, 그 4개 분만큼 패리티를 저장하는 디스크에 작성해야한다.
- RAID5 : 패리티를 분산하여 저장하는 방식이다. RAID4의 단점인 병목 현상을 보완할 수 있다.
- RAID6 : 기본적인 구성은 RAID5와 같지만, 서로 다른 2개의 패리티를 두는 방식이다. RAID4, RAID5에 비해 안전성은 높으나 쓰기 속도는 약간 느리다.
2-2 입출력 기법
보조기억장치와 입출력장치는 별도의 장치가 아니다. 어떻게 보면 보조기억장치는 결국 메모리를 보조하는 임무를 수행하는 특별한 입출력장치로 볼 수 있다. 이번에는 보조기억장치를 포함한 입출력장치가 어떻게 정보를 주고받는지 확인해본다.
장치 컨트롤러와 장치 드라이버
다양한 외부 장치가 컴퓨터 내부와 소통하려면, 장치 컨트롤러라는 하드웨어를 통해 CPU와 연결되어 정보를 주고 받는다. 우리가 흔히 사용하는 마우스, 키보드 이런 장비들을 사용해서 활용하지 않는가? 그러나 CPU가 수행하는건 기계가 아니라 결국 프로그램이다. 여기서 이 프로그램이 바로 장치 드라이버다. 장치 드라이버란 장치 컨트롤러의 동작을 알고 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램을 의미한다.
입출력기법
구체적으로 CPU가 장치 컨트롤러와 정보를 주고 받는 방법, 즉 입출력 작업을 수행하는 방법은 크게 3가지가 있다.
- 프로그램 입출력 : 프로그램 속 명령어로 입출력 작업을 수행하는 방법을 의미한다. 특정 입출력 명령어를 실행함으로써 상호작용하고 작업을 수행한다.
- 인터럽트 기반 입출력 [다중 인터럽트] : 하드웨어 장치로부터 신호(하드웨어 인터럽트)가 여러 개일 때, 우선순위에 따라서 차례대로 인터럽트를 처리하게 된다. 흔히 다중 인터럽트를 처리할 때는 프로그래머블 인터럽트 컨트롤러(PIC)라는 하드웨어를 사용해서 처리한다.
- DMA 입출력 : 입출력장치와 메모리 간의 데이터 이동을 주도하고 그 데이터들도 CPU를 거치는 위 2가지 방식과 달리, 직접 메모리에 접근할 수 있는 입출력 기능(DMA)을 가진 DMA 컨트롤러를 통해 처리하는 방식이다. 크게 다음과 같은 순서를 거친다.
- CPU가 DMA 컨트롤러에게 입출력장치 주소, 연산 메모리 주소 등 다양한 정보와 함께 입출력 작업을 명령한다.
- CPU 대신 DMA 컨트롤러가 입출력장치와 상호작용해서 작업을 수행한다.
- 작업이 끝나면 DMA 컨트롤러는 CPU에게 인터럽트를 걸어 작업이 끝났음을 알린다.
DMA 입출력 시에 DMA 컨트롤러는 데이터 전송을 위해 시스템 버스에 연결이 되고, 입출력장치들의 장치 컨트롤러들은 입출력 버스라는 입출력장치 컨트롤러 전용의 버스와 연결이 된다.
대표적인 입출력 버스로는 PCIe가 있다. PCI의 발전된 형태로 가장 대중적으로 메인 보드에서 오늘날 확인 가능한 입출력 버스 중 하나이다. PCIe는 다음 2가지에 대해서 명확히 아는 것이 좋다.
- 지속적으로 발전하고 있어 버전이 존재하는데 각각 버전에 따라 지원하는 최대 속도가 다르다. 높은 버전일수록 속도가 빠른편이다.
- 레인(lane)이란 PCIe 버스를 통해 정보를 송수신하는 단위를 의미하는데, 일종의 선로와 같은 개념이므로 수가 많을수록 양도 늘어난다.
별도 참고
참고 : https://www.tcpschool.com/c/c_refer_endian
'Computer Science' 카테고리의 다른 글
[CS] 3-3. 운영체제 - 가상 메모리, 파일 시스템 (0) | 2024.10.09 |
---|---|
[CS] 3-2. 운영체제 - 동기화와 교착 상태, CPU 스케줄링 (4) | 2024.10.05 |
[CS] 3-1. 운영체제 - 전체 개요, 프로세스 & 스레드 (3) | 2024.10.04 |
[CS] 2-2. 컴퓨터 구조 - CPU, 레지스터, 인터럽트 (2) | 2024.09.25 |
[CS] 2-1. 컴퓨터 구조 - 개요, 정보 (0) | 2024.09.12 |