메모리 맵 입출력 방식 (Memory-mapped Input Output)
CPU가 사용할 수 있는 전체 주소 공간의 일부를
메모리에 할당하고, 남은 구역을 주변 장치(HDD, 키보드 등)에 할당하는 방식
CPU의 시야: CPU는 STORE 0x8000, 1이라는 명령을 내릴 때,
이것이 RAM에 저장하는 것인지 HDD에 명령을 내리는 것인지 구분하지 않는다.
오직 "0x8000번지에 1을 보낸다"는 행위 자체에만 집중한다.
통합 관리: 메모리와 주변 장치를 별개로 보지 않고, 16비트 기준으로
65,536개()의 주소 안에 함께 배치한다.
레지스터 매핑: 주변 장치 안에는 상태를 보고하거나
명령을 받는 제어/데이터/상태 레지스터들이 있고,
메모리의 특정 주소(예: 0xA000, 0xA300 등)와 1:1로 대응시켜 관리한다.
레지스터 매핑 추가 설명
주변 장치: 키보드, 그래픽카드 같은 장치.
내부에는 설정을 바꾸거나 데이터를 주고받기 위한
아주 작은 메모리 칸(레지스터)들이 들어있다.
주소 버스: CPU가 "몇 번지로 가라!"라고 외치는 전선 뭉치.
CPU: 명령어를 실행할 때 오직 '주소'만 보고 데이터를 읽거나 쓴다.
동작 과정
CPU가 STORE 1, 0xA000 이라는 명령을 실행한다.
(주소 0xA000에 1을 저장해라)
주소 전선에 0xA000이라는 신호가 흐른다.
시스템 내부에 있는 '주소 해독기'가 이 신호를 보고
"이건 RAM이 아니라 프린터로 보내야 해"라고 판단하여
신호의 길을 주변 장치 쪽으로 틀어준다.
주변 장치 내부의 제어 레지스터에 1이라는 값이 기록된다.
기계는 이 1을 보고 "아, 작동을 시작하라는 뜻이구나"라고
판단하여 물리적으로 일을 시작한다.
매핑이 없다면?
주소 버스(A0~A15)의 정체 (16비트 기준)
CPU와 모든 부품은 "16가닥의 구리선(주소 버스)"로 연결되어 있다.
이 구리선들이 CPU가 몇 번지로 가라고, 신호하는 통로이다.
주소 0xA000을 이진수로 바꾸면 1010 0000 0000 0000이다.
CPU는 이 숫자에 맞춰 16개의 전선에 전기를 흘리거나(1) 끊는다(0).
A15: "메모리냐 장치냐"를 가르는 마스터 스위치
16가닥(A0~A15)중 가장 왼쪽 전선인 A15(마스터 스위치)는 가장 큰 주소 단위를 결정하고,
하드웨어 엔지니어는 이 전선 하나로 길을 반으로 나눈다.
가장 왼쪽인 A15가 마스터 스위치인 이유는 우리가 쓰는 십진수에서도
가장 왼쪽 숫자가 전체 크기를 결정한다.
예로 1234라는 숫자에서 가장 왼쪽의 숫자인 1이 천의 자리이고,
이 숫자가 0이면 전체 값은 0000 ~ 0999 사이
이 숫자가 1이면 전체 값은 1000 ~ 1999 사이이다.
이처럼 가장 왼쪽 숫자는 전체 범위를 두 덩어리로 크게 나누는 기준이 된다.
메모리 구역 (A15=0): 주소의 시작이 0인 모든 곳 (0x0000 ~ 0x7FFF).
주변 장치 구역 (A15=1): 주소의 시작이 1인 모든 곳 (0x8000 ~ 0xFFFF).
해독기(Decoder): "어떤 장치인가"를 고르는 문지기
동작 원리: 해독기는 와 전선의 전기 조합을 보고,
특정 장치의 버튼을 누른다.
A13=0, A14=0 이면? -> 키보드 버튼 클릭A13=1, A14=0 이면? -> HDD 버튼 클릭버튼(활성화 신호)이 눌린 장치만 CPU가 보내는 데이터를 받아들이고,
나머지 장치들은 자기 일이 아니겠거니 하고, 무시한다.
전체적인 흐름
STORE 1, 0xA000 명령을 내리는 순간 벌어지는 일
소프트웨어: "0xA000(HDD의 제어 레지스터 주소)에 1을 써라."
전기 신호: 전선에 전기 흐름(1), 전선 전기 흐름(1),
전선 전기 없음(0).
물리적 선택
가 1이라서 RAM은 가만히 있고, 장치 구역이 깨어난다.
해독기가 A13=1, A14=0 신호를 보고,
HDD 버튼을 누르며 문을 열어준다.
운영체제에서 HDD에서 클러스터 단위로 파일을 저장하면
왜 파일 입출력 성능이 높아지는 것인가?
컴퓨터 내부에서 HDD의 헤드(데이터를 읽는 바늘)가
아무래도 기계 장치이다 보니 전자가 이동하는 속도에 비해서는
물리적으로 움직이는 속도가 현저히 느리다.
탐색 시간(Seek Time): 헤드가 데이터가 있는 원판인
플래터의 위치로 이동하는 시간.
회전 지연(Rotational Latency): 플래터가 빙글빙글 돌아
데이터가 헤드 밑에 올 때까지 기다리는 시간.
섹터
클러스터
운영체제는 여러 개의 섹터를 하나로 묶어
클러스터라는 단위를 만들고, 이 단위로만 파일을 주고 받는다.
보통 4096바이트의 크기로
이렇게 하나로 묶으면 성능이 올라가는 이유는 아래와 같다.
데이터를 섹터 단위로 쪼개서 여기저기 저장하면,
헤드는 그 조그만하고, 잘 보이지도 않는 조각들을
찾으려 쉬지 않고, 움직여야 한다.
하지만 클러스터 단위로 묶어버리면, 헤드가 한 번만 이동해서
그 자리에 연속된 데이터를 한꺼번에 쭉 읽어버릴 수 있다.
(아무래도 영역이 넓기 때문에 그 영역을 한번에 읽을 수 있다.)
그리고 I/O 요청 횟수도 감소한다.
CPU가 HDD에 "데이터 좀 보내줘"라고, 요청하면
한 번의 명령으로 클러스터라는 큰 덩어리의 데이터를 한 번에
가져오기 때문에 왓다갔다 하는 횟수가 확연히 줄어든다.
SSD의 직접 접근 방식
HDD와 SSD의 가장 큰 차이는 데이터를 찾는 방식이
물리적이냐, 전기적이냐에 있다.
HDD (순차적/물리적 접근)
SSD (직접/전기적 접근)
직접 접근이란
중간 단계를 거치지 않고, 주소만 알면 목표 지점으로
즉시 점프한다는 뜻이다.
낸드 플래시 내부에는 데이터가 저장되는 아주 작은 방들이
가로세로 바둑판처럼 배열되어 있다.
각 방에는 고유한 행(Row) 번호와 열(Column) 번호가 붙어 있다.
주소 해독기(Decoder)의 역할
CPU가 "0x5000 주소의 데이터를 가져와!"라고 명령한다.
SSD 컨트롤러는 이 주소를 이진수로 분석해 해당 방으로
연결된 전선에 전기를 흘린다.
전기는 빛의 속도에 가깝게 이동하므로, 칩의 입구에 있는 데이터나
가장 구석에 있는 데이터나 도달하는 시간 차이가 거의 0이다.
탐색 시간의 소멸: 데이터를 찾기 위해 헤드를 옮기는 과정이 없다.
회전 지연의 소멸: 데이터가 올 때까지 원판이 돌기를 기다릴 필요가 없다.
일관된 전기적 경로: 어떤 주소를 넣든 주소 해독기를 거쳐
해당 셀(Cell)까지 도달하는 전기적 경로는 물리적으로
매우 짧고 일정하게 설계되어 있다.
랜덤 읽기 성능
직접 접근 특성 때문에 랜덤한 곳에 있는
데이터를 읽는 성능은 SSD가 압도적으로 유리하다.
HDD는 데이터가 여기저기 흩어져 있으면 헤드가 왔다 갔다 하느라
속도가 처참하게 느려진다. (데이터 파편화가 치명적)
SSD는 데이터가 어디에 흩어져 있든 주소만 알면
즉시 가져올 수 있으므로 성능 저하가 거의 없다.
