이번 주차는
▶Chapter 6 메모리와 캐시 메모리
▶ Chapter 7 보조기억장치
▶ Chapter 8 입출력장치 에 대해 알아보자.
Chapter 6 메모리와 캐시 메모리 부터 정리해 볼 것 이다.
우리가 흔히 메모리라고 부르는 것은 저장 장치인 RAM이다.
RAM은 휘발성 저장 장치로 실행할 대상을 저장한다.
따라서 전원이 꺼져도 저장한 내용을 유지하는 장치가 따로 필요한데 이곳이 바로 보조기억장치 이다. 보조기억 장치는 비휘발성으로 보관할 대상을 저장한다.
If, CPU가 실행하고 싶은 프로그램이 보조기억장치에 있으면, RAM으로 복사하여 저장한 뒤 실행한다.
그렇다면 RAM의 종류를 알아보자.
- DRAM
저장된 데이터가 동적으로 변하는(사라지는) RAM, 데이터의 소멸을 막기 위해 일정 주기로 데이터를 재활성화(다시 저장)해야 함.
=> 일반적으로 메모리로써 사용하는 RAM - SRAM
데이터가 정적으로 저장되어 변하지 않는 RAM, 주기적으로 재활성화 안해도 돼서 DRAM보다 빠름
=> 캐시 메모리로 사용 - SDRAM
클럭에 맞춰 동작, 클럭마다 CPU와 정보를 주고받을 수 있는 DRAM - DDR SDRAM
대역폭을 넓혀 속도를 빠르게 만든 SDRAM
* 대역폭: 데이터를 주고받는 길의 너비
메모리의 주소 체계에 대해 알아보자.
- 물리 주소 - 메모리가 사용
정보가 실제로 저장된 하드웨어상의 주소 - 논리 주소 - CPU & 실행 중인 프로그램이 사용
실행 중인 프로그램 각각에 부여된 0번지부터 시작되는 주소
If, CPU가 메모리와 상호작용하려면, 메모리 관리 장치(MMU) 톻한 논리 주소와 물리 주소 간의 변환 필요하다.
이는 CPU와 주소 버스 사이에 위치하여
논리 주소 => (CPU가 발생시킨 논리 주소 + 베이스 레지스터 값) => 물리 주소 로 변환한다.
MMU |
베이스 레지스터 ( ) |
* 베이스 레지스터: 프로그램의 가장 작은 물리 주소 == 프로그램의 첫 물리 주소
* 논리 주소: 프로그램의 시작점으로부터 떨어진 거리
If, 논리 주소 범위를 벗어나는 명령어를 실행하려고 하면, 한계 레지스터를 통해 다른 프로그램에 영향 받지 않도록 보호한다.
한계 레지스터 == 논리 주소의 최대 크기 저장
* 프로그램의 물리 주소 범위 => 베이스 레지스터 값 <= 범위 < 베이스 레지스터 값 + 한계 레지스터 값
=> CPU가 한계 레스터보다 높은 논리 주소에 접근하려고 하면 인터럽트를 발생시켜 실행 중단시킨다.
먼저, 저장 장치의 명제를 살펴보자.
- CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.
- 속도가 빠른 저장 장치는 저장 용량이 작고. 가격이 비싸다.
저장 장치들을 CPU에서 얼마나 가까운가? 를 기준으로 계층을 나눈다.
이를 저장 장치 계층 구조라고 한다.
=> CPU에 가까운 저장 장치일수록 빠르고 / 용량이 작고 / 비싸다.
그렇다면 캐시 메모리를 알아보자.
CPU의 연산 속도와 메모리 접근 속도의 차이를 !조금이나마! 줄이기 위해! 개발되었다.
캐시 메모리는 CPU와 메모리 사이에 위치하여 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 활용한다.
그렇다면 가져올 데이터는 어떻게 선별할까?
CPU가 사용할 법한 대상을 예측하여 저장한다. 실제로 들어맞을 경우, 캐시 히트 / 예측이 틀려 메모리에서 직접 가져와야 하는 경우, 캐시 미스 라고 한다.
캐시가 히트되는 비율 => 캐시 적중률
캐시 적중률 |
캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수) |
캐시 히트를 위해서 CPU는 참조 지역성의 원리에 따라 메모리에서 가져올 데이터를 결정한다.
- 시간 지역성
변수 같이 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다. - 공간 지역성
관련 데이터들이 한데 모여 있기 때문에 접근한 메모리 공간 근처를 접근하려는 경향이 있다.
우리 컴퓨터는 여러 개의 캐시 메모리를 가지고 있다.
따라서 캐시 메모리들은 CPU(코어)와 가까운 순서대로 계층을 구성한다.
CPU(코어) | L3캐시 | 메모리 |
L1캐시 / L2캐시 |
L1캐시, L2캐시, L3캐시 순으로 CPU에 가까우며 L3캐시는 CPU 외부에 있다.
* 멀티 코어 프로세서에선, 코어마다 L1캐시와 L2캐시가 할당되어 있으며 L3캐시는 여러 코어가 공유한다.
다음은 Chapter 7 보조기억장치이다.
- 하드 디스크: 자기적인 방식으로 데이터 저장
- 플래터: 실질적으로 데이터가 저장되는 곳, 자기 물질로 덮여 있다. N극과 S극은 0과 1의 역할을 한다.
- 스핀들: 플래터를 회전시키는 구성 요소
- RPM: 돌리는 속도로 분당 회전수를 나타냄
- 헤드: 데이터를 읽고 쓰는 구성 요소
- 디스크 암: 헤더를 원하는 위치로 이동시키는 팔
-트랙: 플래터를 여러 동심원으로 나누었을 때 그 중 하나의 원
- 셀터: 원을 n등분한 조각
- 실린더: 여러 겹의 플래터 상에서 같은 트랙이 위치한 곳을 모아 연결한 논리적 단위
[ 저장된 데이터에 접근하는데 영향받는 시간 ]
- 탐색 시간: 접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간
- 회전 지연: 헤드가 있는 곳으로 플래터를 회전시키는 시간
- 전송 시간: 하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간 - 플래시 메모리: 전기적으로 데이터 읽고 쓰는 반도체 기반의 저장 장치
(일반적으로 접하는 거의 모든 전자제품에 있음)
- 셀: 데이터를 저장하는 가장 작은 단위
[ 하나의 셀에 저장할 수 있는 비트에 따라 구분 ]
- SLC 타입: 한 셀로 2개의 정보를 표현, 빠른 입출력 가능
- MLC 타입: 한 셀로 4개의 정보 표현, 대용량화 유리
- TLC 타입: 한 셀당 3비트씩 저장, 대용화 유리
* 플래시 메모리는 하드 디스크와 다르게 덮어쓰기가 불가능하다!
=> Invalid한 쓰레기 값 발생 -> 해결 위해 가비지 컬렉션 기능 제공함
* 가비지 컬렉션
1. 유효한 페이지(셀들이 모여져 만들어진 단위)들만을 새로운 블록(페이지 모인 단위)으로 복사
2. 기존의 블록 삭제
데이터의 안전성 or 높은 성능을 위해
n개의 물리적 보조기억장치를 마치 하나의 논리적 보조기억장치처럼 사용할 수 있다.
이를 RAID(Redundant Array of Independent Disks)라고 한다.
RAID의 구성 방법을 RAID 레벨이라고 하는데 이를 알아보자.
- RAID 0
여러 개의 보조기억장치에 데이터를 단순히 나누어 저장, 저장되는 데이터가 하드 디스크 개수만큼 나뉘어 저장됨.
* 스트라입: 줄무늬처럼 분산돼 저장된 데이터
* 스트라이핑: 분산하여 저장하는 것
=> 읽고 쓰는 속도가 빠름
=> 하나에 문제가 생기면 다른 모든 HDD의 정보를 읽는 데 문제가 생겨 저장된 정보가 안전하지 않음 - RAID 1
복사본을 만드는 방식. 미러링이라고도함
=> 복구가 매우 간단
=> 사용 가능한 용량이 적어짐 - RAID 4
HDD 하나를 오류를 검출하고 복구하기 위한 정보 저장하는 패리티 비트로 구성
* 패리티 비티: 원래 오류 검출용 정보지만 RAID에선 오류 복구도 가능
=> 패리티를 저장하는 장치에 병목 현상 발생 - RAID 5
패리티 정보를 분산하여 저장하는 방식으로 RAID 4의 패리티 병목 현상 해소 - RAID 6
기본적으로 RAID 5와 같으나 서로 다른 두 개의 패리티를 두는 방식으로 복구할 수 있는 수단이 2개
=> 새로운 정보를 저장할 때마다 함께 저장할 패리티가 두 개이므로 RAID 5보다 느림
마지막으로 Chapter 8 입출력장치에 대해 알아보자.
저장 장치 계층 구조에 따라 CPU와 입출력장치의 직접적인 정보 교환은 어렵다.
따라서 장치 컨트롤러라는 하드웨어를 통해 연결된다. 입출력장치의 정보 규격화를 해결하고 아래의 기능을 제공한다.
- CPU와 입출력장치 간의 통신중개
- 오류 검출
- 데이터 버퍼링
장치 컨트롤러는 다음과 같이 구성된다.
- 데이터 레지스터
CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터이며 전송률 차이를 완화하기 위한 버퍼 역할을 함 - 상태 레지스터
입출력장치의 상태 정보 저장 - 제어 레지스터
수행할 내용에 대한 제어 정보와 명령 저장
새로운 장치를 컴퓨터에 연결하려면 장치 드라이버가 필요하다.
장치 드라이버는 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.
장치 컨트롤러는 CPU와 어떻게 정보를 주고받을까?
- 프로그램 입출력
프로그램 속 명령어로 입출력 장치 제어
[ CPU가 장치 컨트롤러의 레지스터를 아는 방법 ]
* 메모리 맵 입출력
메모리에 접근하기 위한 주소 공간 / 입출력장치에 접근하기 위한 주소 공간 을 => 하나의 주소 공간으로 간주
=> 메모리 주소 공간 축소됨
=> 메모리와 입출력장치에 같은 명령어 사용
*고립형 입출력
메모리를 위한 주소 공간 / 입출력장치를 위한 주소 공간 을 => 분리하는 방법
=> 메모리 주소 공간이 축소되지 않음
=> 입출력 전용 명령어 및 제어 버스에 입출력 읽기/쓰기 선 필요 - 인터럽트 기반 입출력
장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보냄,
CPU는 하던 일을 백업하고 인터럽트 서비스 루틴 실행
* 프로그래머블 인터럽트 컨트롤러(PIC): 우선순위를 판별한 뒤, CPU에게 지금 처리해야 할 하드웨어 인터럽트를 알려줌 - DMA 입출력
입출력 장치와 메모리가 CPU를 거치지 않고 상호작용하는 입출력 방식으로, CPU가 할 일을 DMA에 위임함.
* DMA 컨트롤러: 직접 메모리에 접근 위해 시스템 버스에 연결된 컨트롤러
=> CPU는 DMA 컨트롤러에게 입출력 작업 명령 내림, 인터럽트만 받으면 됨. 시작과 끝만 관여.
* 입출력 버스: DMA 컨트롤러와 장치 컨트롤러들을 별도의 입출력 버스에 연결하여 해결
=> 시스템 버스가 공용이기 때문에 동시에 사용이 불가함, DMA가 쓰는만큼 CPU가 이용못하므로 DMA 컨트롤러와 장치 컨트롤러를 입출력 버스로 따로 연결