RAM의 하드웨어적 특성과 종류에 대해 학습해보자. RAM 용량이 컴퓨터 성능에 어떤 영향을 미치는지 그리고 DRAM, SRAM, SDRAM, DDR SDRAM은 무엇이고 어떤 특징을 가지는지 살펴본다.
RAM에는 실행할 프로그램의 명령어와 데이터가 저장된다. 중요한 점은 전원을 끄면 저장된 명령어와 데이터가 모두 날아가는 휘발성 저장 장치라는 점이다.
반면, 전원이 꺼져도 저장된 내용이 유지되는 저장 장치는 비휘발성 저장장치라고 한다. 대표적으로 하드 디스크나 SSD, USB와 같은 보조기억장치가 대표적인 비휘발성 저장장치이다.
RAM의 용량은 컴퓨터 성능에 어떤 영향을 미칠까? 용량이 크면 어떤 점이 좋을까?
CPU가 실행하고 싶은 프로그램이 보조기억장치에 있다면 RAM으로 가져와야한다. RAM용량이 적다면 보조기억장치에서 실행할 프로그램을 가져오는 일이 잦아 실행시간이 길어진다.
하지만 RAM용량이 충분히 크다면 보조기억장치에서 많은 데이터를 가져와 미리 RAM에 저장할 수 있고, 많은 프로그램을 동시에 실행하는데 유리하다.
하지만 RAM 용량이 커지면 프로그램 실행 속도가 어느 정도 증가하는 것은 맞지만, 용량이 필요 이상으로 커졌을 때 속도가 그에 비례 증가하지는 않는다.
Dynamic RAM의 준말이다. 이는 저장된 데이터가 동적으로 변하는(사라지는) RAM을 의미한다. 시간이 지나면 저장된 데이터가 점차사라진다. 그렇기에 DRAM은 일정 주기로 데이터를 재활성화(다시 저장)해야한다.
이런 단점에도 일반적으로 사용하는 RAM이다. 소비전력이 비교적 낮고, 저렴하고, 집적도가 높기 때문에 대용량으로 설계가 용이하기 때문
'집적도가 높다'라는 말은 '더 작고 빽빽하게 만들수 있다!'
Static RAM의 준말이다. 이는 저장된 데이터가 변하지 않는 RAM을 의미한다. DRAM과 달리 SRAM은 시간이 지나도 저장된 데이터가 사라지지 않고, 주기적으로 데이터를 재활성화 하지 않아도 된다. SRAM은 일반적으로 DRAM보다 속도가 빠르다.
비휘발성 메모리인 것은 아니다. SRAM도 전원이 공급되지 않으면 저장된 내용이 날아간다 !
SRAM은 DRAM보다 집적도가 낮고, 소비 전력이 크고, 가격도 더 비싸서 일반적으로 사용되는 메모리가 아니다. SRAM은 메모리가 아닌 '대용량으로 만들어질 필요는 없지만 속도가 빨라야 하는 저장 장치' 가령 캐시 메모리에서 사용된다.
클럭신호와 동기화된, 발전된 형태의 DRAM이다. '클럭 신호화 동기화 되었다'는 말은 클럭 타이밍에 CPU와 정보를 주고 받을 수 있음을 의미한다. 클럭에 맞춰 동작하며 클럭마다 CPU와 정보를 주고받을 수 있는 DRAM이다.
DDR SDRAM은 최근 가장 흔히 사용되는 RAM이다. SDRAM의 대역폭을 넓혀 속도를 빠르게 만든 것이다. 여기서 대역폭이란 '데이터를 주고받는 길의 너비'를 의미한다.
대역폭은 흔히 자동차 도로에 비유되곤 한다. 한 클럭에 한 번씩 CPU와 데이터를 주고받을 수 있는 SDRAM에 비해 DDR SDRAM은 두 배의 대역폭으로 한 클럭당 두 번씩 CPU와 데이터를 주고 받을 수 있다. 이런 이유에서 한 클럭당 하나씩 데이터를 주고받을 수 있는 SDRAM을 SDR SDRAM이라고 부릭도 한다.
DDR2 SDRAM은 DDR SDRAM보다 대역폭이 두배 넓다. SDR SDRAM보다 너비가 네 배 넓은 도로와도 같다.
주소에는 물리주소와 논리 주소가 있다. 두 주소의 개념과 주소간의 변환방법을 학습하자.
물리주소는 메모리 하드웨어가 사용하는 주소, 논리주소는 CPU와 실행중인 프로그램이 사용하는 주소이다.
"CPU와 실행 중인 프로그램은 현재 메모리 몇번지에 무엇이 저장되어 있는지 다 알고 있을까요?" 라는 질문에 언뜻 생각하면 당연히 그럴 것 같지만, 실제로는 그렇지 않다. CPU와 메모리에 저장되어 실행중인 프로그램은 메모리 몇 번지에 무엇이 저장되어 있는지 다 알지 못한다.
그 이유는 메모리에 저장된 정보는 시시각각 변하기 때문이다.
메모리가 사용하는 물리 주소는 말 그대로 정보가 실제로 저장된 하드웨어상의 주소를 의미한다. 반면 CPU와 실행중인 프로그램이 사용하는 논리 주소는 실행중인 프로그램 각각에게 부여된 0번지 부터 시작되는 주소를 의미한다.
프로그램마다 같은 논리 주소가 얼마든지 있을 수 있고, CPU는 이 논리 주소를 받아들이고, 해석하고, 연산한다.
그런데 CPU가 메모리와 상혹작용하려면 논리 주소와 물리 주소간의 변환이 이루어져야 한다. 변환이 이루어지지 않으면 CPU와 메모리는 서로 이해할 수 없는 주소 체계를 가지고 각자 다른 이야기를 할뿐, 결코 상호작용할 수 없기 때문이다.
논리 주소와 물리 주소간의 변환은 CPU와 주소버스 사이에 위치한 메모리 관리 장치(MMU)라는 하드웨어에 의해 수행된다.
MMU는 CPU가 발생시킨 논리 주소에 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다. 예를 들어 베이스 레지스터에 15000이 저장되어 있고 CPU가 발생시긴 논리 주소가 100번지라면 이 논리 주소는 15100번지로 변환된다.
메모장 프로그램의 물리주소가 1000~1999번지, 인터넷 브라우저가 2000~2999, 게임 프로그램의 물리주소가 3000~3999라고 가정할 때, 만약 메모장 프로그램 명령어중 '(논리주소) 1500번지에 숫자 100을 저장하라'와 같은 명령어가 있다면 숫자100은 어떤 물리 주소에 저장될까? 이 명령어는 안전할까?
아니다. 이와 같은 명령어들은 실행되면 안된다. 프로그램의 논리 주소 영역을 벗어났기 때문이다. 만일 실행한다면 메모장 프로그램 명령어는 애꿎은 인터넷 브라우저 프로그램에 숫자 10을 저장할 것이다.
이렇게 다른 프로그램의 영역을 침범할 수 있는 명령어는 위험하기 때문에 논리 주소 범위를 벗어나는 명령어 실행을 방지하고 실행중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요하다. 이는 한계 레지스터라는 레지스터가 담당한다.
베이스 레지스터가 실행중인 프로그램의 가장작은 물리주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장한다. 즉, 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상, 베이스 레지스터 값 + 한계 레지스터 값 미만이 된다.
CPU는 메모리에 접근하기 전에 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사하고, 만약 CPU가 한계 레지스터보다 높은 논리 주소에 접근하려고 하면 인터럽트(트랩)을 발생 시켜 실행을 중단한다. 이러한 방식으로 실행중인 프로그램의 독립적인 실행 공간을 확보하고 다른 프로그램을 침범치 못하도록 보호할 수 있다.
저장 장치 계층 구조를 통해 저장 장치의 큰 그림을 그린다.
CPU는 프로그램을 실행하는 과정에서 메모리에 저장된 데이터를 빈번하게 사용한다. 하지만 CPU가 메모리에 접근하는 시간은 CPU의 연산 속도보다 느리다. CPU가 메모리에 접근 하는 시간과 빠른 연산 속도의 간극을 극복하기 위한 저장장치가 바로 캐시 메모리이다.
캐시메모리의 탄생 배경과 특징을 이해하려면 우선 저장 장치 계층 구조라는 개념을 이해해야 한다.
저장 장치는 아래와 같은 명제를 따른다
1. CPU와 가까운 저장장치는 빠르고, 멀리 있는 저장장치는 느리다.
2. 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다.
컴퓨터가 사용하는 저장장치들은 'CPU에 얼마나 가까운가'를 기준으로 계층적으로 나타낼 수 있다. 이를 저장 장치 계층 구조라고 한다.
CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 느리다. 그럼에도 불구하고 프로그램을 실행하는 과정에서 메모리에 번번히 접근해야한다. CPU의 연산 속도가 아무리 빨라도 메모리에 접근하는 속도가 그에 따라가지 못한다면 CPU의 발전은 아무 소용이 없다.
그래서 등장한 저장장치가 캐시메모리이다. 캐시 메모리는 CPU와 메모리 사이에 위치하고, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장장치이다.
캐시메모리는 CPU의 연산속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생했다. 마치 대형마트와 편의점의 차이 처럼 캐시메모리에 CPU가 필요로하는 데이터가 있다면 필요한 데이터로의 접근 시간을 줄일 수 있다.
우리들이 사용하는 컴퓨터 내부에는 여러개의 캐시 메모리가 있다. 그리고 이 캐시 메모리들은 CPU(코어)와 가까운 순서대로 계층을 구성하고, 가까운 것 부터 순서대로 L1(level 1) 캐시, L2 캐시, L3 캐시라고 한다.
저장 장치 계층 구조를 이해했다면 짐작할 수 있다시피 용량은 L1, L2, L3 순으로 커지고 속다는 L3, L2, L1순으로 빨라지고 가격도 마찬가지로 비싸진다.
멀티 코어 프로세서에서 L1-L2-L3 캐시는 일반적으로 다음과 같이 구현된다. L1, L2캐시는 코어마다 고유한 캐시메모리로 할당되고, L3캐시는 여러 코어가 공유하는 형태로 사용된다.
캐시 메모리는 메모리보다 용량이 작다. 메모리가 보조기억장치의 일부를 복사하여 저장한다면 캐시 메모리는 무엇을 저장할까?
캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장한다. 이때 자주 사용될 것으로 예측한 데이터가 실제로 들어맞아 캐시 메모리 내 데이터가 CPU에서 활용될 경우를 캐시 히트라고 한다.
반대로 자주 사용될것으로 예측하여 캐시 메모리에 저장했지만, 예측이 틀려 메모리에서 필요한 데이터를 직접 가져와야 하는 경우를 캐시 미스라고 한다. 캐시 미스가 발생하면 캐시 메모리의 이점을 활용 할 수없고, 성능이 떨어지게 될것이다.
캐시가 히트되는 비율을 캐시 적중률이라고 하고, 다음과 같이 계산한다
캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수
우리가 사용하는 컴퓨터의 캐시 적중률은 대략 85~95%이상이다. 캐시 메모리의 이점을 제대로 활용하려면 CPU가 사용할 법한 데이터를 제대로 예측해서 캐시 적중률을 높여야 한다. 그 데이터는 어떻게 알 수 있을까?
캐시 메모리는 한 가지 원칙에 따라 가져올 데이터를 결정한다. 바로 참조 지역성의 원리이다. CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리이다.
1. CPU는 최근에 접근해던 메모리 공간에 다시 접근하려는 경향이 있다.
2. CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다.
변수에 값을 저장하고 나면 언제든 변수에 다시 접근 할 수 있다. 이는 달리 말해 'CPU는 변수가 저장된 메모리 공간을 언제든 다시 참조할 수 있다'라는 것을 의미한다.
즉, CPU는 최근에 접근했던 메모리 공간(변수가 저장된)을 여러 번 다시 접근할 수 있다.
public static void main(String[] args) {
int num = 2;
for (int i=1; i<=9; i++) {
System.out.println(num + " * " + i + " = " + num * i);
}
}
위 코드에서 변수는 num, i이다. 구구단 2단을 출력하는 과정에서 이 변수들이 여러 번 사용되고 있다. 이렇게 '최근에 접근했던 메모리 공간에 다시 접근하려는 경향'을 시간지역성이라고 한다.
CPU가 워드프로세서 프로그램을 실행할 적에는 워드 프로세서 프로그램이 모여있는 공간 근처를 집중적으로 접근할 것이고, 사용자가 입력을 할 적에는 입력 기능이 모여있는 공간 근처를 집중적으로 접근할 것이다. 이렇게 '접근한 메모리 공간 근처를 접근하려는 경향'을 공간 지역성이라고 한다.
하드디스크와 플래시 메모리는 가장 대표적인 보조기억장치이다. 이 두장치에 대해 학습해보자
하드 디스크는 자기적인 방식으로 데이터를 저장하는 보조기억 장치이다. 이 때문에 자기디스크의 일종으로 지칭하기도 한다.
하드 디스크에서 실직적으로 데이터가 저장되는 곳은 아래 그림속 동그란 원판이고, 이를 플래터라고 한다. 이 플래터를 회전시키는 구성요소를 스핀들이라고 한다. 스핀들이 플래터를 돌리는 속도는 분당 회전수를 나타내는 RPM이라는 단위로 표현한다.
플래터를 대상으로 데이터를 읽고 쓰는 구성 요소는 헤드이다. 헤드는 원하는 위치로 헤드를 이동시키는 디스크 암에 부착되어 있다. 하드 디스크는 CD나 LP에 비해 훨씬 많은 양의 데이터를 저장해야 하므로 여러겹의 플래터로 이루어져 있고, 플래터 양면을 모두 사용할 수 있다.
플래터는 트랙과 섹터라는 단위로 데이터를 저장한다. 플래터를 여러 동심원으로 나누었을 때 그중 하나의 원을 트랙이라고 부른다. 그리고 트랙은 마치 피자처럼 여러 조각으로 나누어지는데, 이 한 조각을 섹터라고 부른다. 섹터는 하드 디스크의 가장 작은 전송단위이다. 일반적으로 512바이트 정도의 크기를 가지고 있지만, 정확한 크기는 하드 디스크에 따라 차이가 있다.
여러 겹의 플래터 상에서 같은 트랙이 위치한 곳을 모아 연결한 논리적 단위를 실린더라고 부른다. 연속된 정보는 보통 한 실린더에 기록된다. 연속된 정보를 하나의 실린더에 기록하는 이유는 디스크 암을 움직이지 않고도 바로 데이터에 접근할 수 있기 때문이다.
하드 디스크가 저장된 데이터에 접근하는 시간은 크게 탐색시간, 회전지연, 전송시간으로 나뉜다.
하드 디스크는 최근에 많이 사용하는 보조기억장치이지만, 플래시 메모리 기반의 보조기억 장치 또한 많이 사용한다. 우리가 흔히 사용하는 USB메모리, SD카드, SSD가 모두 플래시 메모리 기반의 보조기억장치이다.
플래시 메모리는 전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장장치이다. 보조기억장치 범주에만 속한다기보다는 다양한 곳에서 널리 사용하는 저장 장치로 보는것이 옳다.
두 종류의 플래시 메모리
플래시 메모리에는 크게 NAND 플래시 메모리와 NOR 플래시 메모리가 있다. 각각 NAND연산을 수행하는 회로와 NOR 연산을 수행하는 회로를 기반으로 만들어진 메모리를 뜻한다.
이 둘 중 대용량 저장장치로 많이 사용되는 플래시 메모리는 NAND플래시 메모리이다. 앞으로 학습할 플래시 메모리는 NAND 플래시 메모리를 지칭한다고 보면된다.
플래시 메모리에는 셀(cell)이라는 단위가 있다. 셀이란 메모리에서 데이터를 저장하는 가장 작은 단위이다. 한 셀에 1비트를 저장할 수 있는 플래시 메모리를 SLC타입, 한 셀에 2비트를 저장하는 플래시 메모리를 MLC타입, 한 셀에 3비트를 저장할 수 있는 플래시 멤모리를 TLC타입이라고 한다. 큰 차이가 아닌 것처럼 보여도 이는 플래시 메모리의 수명, 속도, 가격에 큰 영향을 끼친다.
SLC타입은 한 셀로 두 개의 정보를 표현할수 있다. MLC나 TLC타입에 비해 비트의 빠른 입출력이 가능하다.
SLC타입은 용량 대비 가격이 높다. 보통 기업에서 데이터를 읽고 쓰기가 매우 많이 반복되며 고성능의 빠른 저장장치가 필요한 경우에 SLC타입을 사용한다.
MLC타입은 한 셀로 네 개의 정보를 표현할 수 있습낟. SLC 타입보다 일반적으로 속도와 수명은 떨어지지만, 한 셀에 두 비트씩 저장할 수 있다는 점에서 MLC타입은 SLC타입보다 대용량화하기 유리하다. 또한 SLC 대비 용량 대비 가격이 저렴하다. 시중의 많은 플래시 메모리 저장장치는 MLC타입 혹은 TLC타입으로 만들어진다
한 셀당 3비트씩 저장할 수 있는 TLC타입은 한셀로 여덟개의 정보를 표현할 수 있기에 대용화 하기가 유리하다. 다른 타입보다 수명과 속도가 떨어지지만 용량대비 가격이 저렴하다.
셀들이 모여 만들어진 단위를 페이지, 그리고 페이지가 모여 만들어진 단위를 블록이라고 한다. 블록이 모여 플레인, 플레인이 모여 다이가 된다.
플래시 메모리에서 읽기와 쓰기는 페이지단위로 이루어지지만, 삭제는 블록단위로 이루어진다. 읽기/쓰기 단위와 삭제 단위가 다른것이 플래시 메모리의 가장 큰 특징이다.
이 때 페이지는 세 개의 상태를 가질 수 있다. Free 상태는 어떠한 데이터도 저장하고 있지 않아 새로운 데이터를 저장할 수 있는 상태를 의미한다.
Valid 상태는 이미 유효한 데이터를 저장하고 있는 상태를 의미한다.
InValid 상태는 쓰레기 값이라 부르는 유효하지 않은 데이터를 저장하고 있는 상태를 의미한다.
플래시 메모리는 하드디스크와는 달리 덮어쓰기가 불가능하여 Valid상태인 페이지에는 새 데이터를 저장 할 수 없다.
플래시 메모리에서 삭제는 블록단위로 수행되기 때문에 최근 SSD를 비롯한 플래시 메모리는 이런 쓰레기 값을 정리하기 위해 가비지 컬렉션 기능을 제공한다.
가비지 컬렉션은 1.유효한 페이지들 만을 새로운 블록으로 복사한뒤, 2. 기존의 블록을 삭제하는 기능이다.
여러 보조기억 장치를 더욱 안전하고 빠르게 활용하는 기법인 RAID에 대해 알아보자
아마존, 구글과 같은 글로벌 IT기업의 서버는 매일 수십, 수백 TB데이터가 서버로 쏟아지고 그 중 민감한 정보도 포함되어있다. 내가 관리자라면 어떻게 정보를 안전하게 관리할까?
이럴 때 사용할 수 있는 방법 중 한가 RAID이다. RAID(Redundant Array of Independent Disks)는 주로 하드 디스크와 SSD를 사용하는 기술로, 데이터의 안정성 혹은 높은 성능을 위해 여러 개의 물리적 보조기억장치를 마치 하나의 논리적 보조기억장치처럼 사용하는 기술을 의미한다.
RAID를 구성하는 방법은 여러 가지가 있다. RAID구성방법을 RAID 레벨이라 표현하는데, 대표적으로 RAID 0, RAID 1, RAID 2, RAID 3,RAID 4, RAID 5, RAID 6이 있고, 그로부터 파생된 RAID 10, RAID 50등이 있다.
RAID 0은 여러개의 보조기억장치에 데이터를 단순히 나누어 저장하는 구성방식이다. 가령 1TB 하드 디스크 네 개로 RAID 0를 구성했다고 가정하자.
이제 어떠한 데이터를 저장할 때 각 하드 디스크는 아래와 같이 번갈아가며 데이터를 저장한다. 저장되는 데이터가 하드디스크 개수만큼 나뉘어 저장되는 것이다.
이때 마치 줄무늬처럼 분산되어 저장된 데이터를 스트라입이라고 하고, 분산하여 저장하는 것을 스트라이핑이라고 한다. 스트라이핑 되면 저장된 데이터를 읽고 쓰는 속도가 빨라진다. 하나의 대용량 저장장치를 이용했다면 여러번에 걸쳐 읽고 썼을 데이터를 동시에 쓸 수 있기 때문이다.
하지만 단점이 있다. 저장된 정보가 안전하지 않다. RAID 0으로 구성된 하드디스크 중 하나에 문제가 생긴다면 다른 모든 하드디스크의 정보를 읽는데 문제가 생길 수 있다. 그래서 등장한게 RAID 1이다.
RAID 1은 복사본을 만드는 방식이다. 마치 거울처럼 완전한 복사본을 만드는 구성이기에 미러링이라고도 부른다. RAID 1에 어떠한 데이터를 쓸때는 원본과 복사본 두 군데에 씁니다. 그렇기에 쓰기 속도는 RAID 0보다 느리다.
RAID 1방식은 복구가 매우 간단하다는 장점이 있다. 하지만 디스크 개수가 한정되었을때 사용가능한 용량이 적어지는 단점이 있다. 즉 RAID 1에서는 복사본이 만들어지는 용량만큼 사용자가 사용하지 못하고, 많은 양의 하드 디스크가 필요하고, 비용이 증가하는 단점도 있다.
RAID 4는 RAID 1처럼 완전한 복사본을 만드는 대신 오류를 검출하고 복구하기 위한 정보를 두는 구성 방식이다. 이때 '오류를 검출하고 복구하기 위한 정보'를 패리티 비트라고 한다.
RAID 4에서는 패리티를 저장한 장치를 이용해 다른 장치들의 오류를 검출하고, 있다면 복구한다. 이로써 RAID 4는 RAID 1보다 적은 하드 디스크로도 데이터를 안전하게 보관할 수 있다.
RAID 4에서는 어떤 새로운 데이터가 저장될 때마다 패리티를 저장하는 디스크에도 데이터를 쓰게 되므로 패리티를 저장하는 장치에 병목 현상이 발생한다는 문제가 있다.
RAID 5는 아래 그림처럼 패리티 정보를 분산하여 저장하는 방식으로 RAID 4의 문제인 병목 현상을 해소한다.
RAID 6의 구성은 기본적으로 RAID 5와 같으나, 서로 다른 두 개의 패리티를 두는 방식이다. 이는 오류를 검출하고 복구할 수 있는 수단이 두 개가 생긴 셈이다. RAID 4나 RAID 5보다 안전한 구성이라 볼 수 있다.
다만 새로운 정보를 저장할 때마다 함께 저장할 패리티가 두 개이므로, 쓰기 속도는 RAID 5보다 느리다. RAID 6은 데이터 저장속도를 조금 희생하고 데이터를 더욱 안전하게 보관하고 싶을 때 사용한다.
여러 RAID 레벨을 혼합한 방식을 Nested RAID라고 한다.
입출력장치는 컴퓨터 외부에 연결되는 장치이다. 이것들은 컴퓨터 내부와 어떻게 연결되어 있을까?
장치 컨트롤러와 장치 드라이버라는 개념을 통해 다양한 외부장치가 컴퓨터 내부와 어떻게 연결되고 소통하는지를 알아볼것이다.
입출력장치는 앞서 학습한 CPU, 메모리보다 다루기가 더 까다롭다. 이유로는 크게 두가지가 있다.
지금 당장 떠올릴 수 있는 장치만 해도 키보드, 모니터, USB메모리, 마우스 등 매우 많다. 장치가 다양하다는 것은 장치마다 속도, 데이터 전송 형식 등도 다양하다는 것이다. 따라서 입출력 장치와 정보를 주고받는 방식을 규격화하기가 어렵다!
여기서 전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표이다.
전송률이 높은 CPU, 메모리와 달리 키보드나 마우스같은 경우 상대적으로 전송률이 낮아 같은 시간동안 데이터를 조금씩만 주고받을 수 있다. 전송률의 차이는 CPU와 메모리, 입출력장치간의 통신을 어렵게 한다.
이와 같은 이유로 입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결되고, 장치 컨트롤러는 입출력 제어기, 입출력 모듈 등으로 다양하게 불리기도 한다.
모든 입출력장치는 각자의 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받고, 장치 컨트롤러는 하나 이상의 입출력장치와 연결되어 있다.
장치 컨트롤러의 역할을 구체적으로 알아보면 다음과 같은 역할을 통해 앞에서 언급한 문제를 해결한다.
데이터 버퍼링은 무엇일까? 버퍼링이란 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장공간에 저장하여 전송률을 비슷하게 맞추는 방법이다.
장치 컨트롤러의 내부의 대표적인 세가지는 데이터 레지스터, 상태 레지스터, 제어 레지스터가 있다.
데이터 레지스터는 CPU와 입출력 장치 사이에 주고받을 데이터가 담기는 레지스터이다. 데이터 레지스터가 버퍼역할을 한다.
상태 레지스터에는 입출력장치가 입출력작업을 할 준비가 되었는지, 작업이 완료되었는지, 오류는 없는지 등의 상태 정보가 저장되고, 제어 레지스터는 입출력 장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
장치 드라이버란 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.
가장 보편적인 입출력 방법인 프로그램 입출력과 인터럽트 기반 입출력, DMA 입출력에 대해 알아보자.
장치 컨트롤러는 CPU와 크게 세가지 방법으로 정보를 주고받는다.
프로그램 입출력은 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법이다.
그런데 CPU는 장치 컨트롤러의 레지스터를 어떻게 알고 있을까? 어떻게 명령어로 표현되고, 메모리에 어떻게 저장되어 있을까? 크게 메모리 맵 입출력과 고립형 입출력이 있다.
메모리 맵 입출력은 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다.
고립형 입출력은 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리하는 방법이다.
메모리 맵 입출력 | 고립형 입출력 |
---|---|
메모리와 입출력 장치는 같은 주소 공간 사용 | 메모리와 입출력장치는 분리된 주소공간 사용 |
메모리 주소 공간 축소됨 | 메모리 주소 공간이 축소되지 않음 |
메모리와 입출력장치에 같은 명령어 사용 가능 | 입출력 전용명령어 사용 |
입출력장치에 의한 하드웨어 인터럽트는 정확히 말하자면 입출력 장치가 아닌 장치 컨트롤러에 의해 발생한다. CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력 장치를 제어하면 입출력을 수행하는 동안 CPU는 다른 일을 할 수 있다. 장치 컨트롤러가 입출력작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다.
이렇게 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력이라고 한다.
여러 입출력장치에서 인터럽트가 동시에 발생한 경우에는 인터럽트들을 어떻게 처리할까? 간단히 생각하면 발생한 순서대로 처리하는 방법이 있겠지만 현실적으로는 모든 인터럽트를 전부 순차적으로만 해결할 수 없다. 우선순위를 고려하여 우선순위가 높은 인터럽트 순으로 여러 인터럽트를 처리할 수 있다.
플래그 레지스터 속 인터럽트 비트가 활성화 되어 있는 경우, 혹은 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI가 발생한 경우 CPU는 우선순위가 높은 인터럽트부터 처리한다.
많은 컴퓨터에서는 프로그래머블 인터럽트 컨트롤러(PIC)라는 하드웨어를 사용한다. PIC는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 지금 처리해야할 하드웨어 인터럽트는 무엇인지 알려주는 장치이다.
앞에서의 프로그램 기반 입출력과 인터럽트 기반 입출력에 공통점이 있다면 입출력장치와 메모리간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 반드시 CPU를 거친다는 점이다.
하지만 입출력장치와 메모리 사이에 전송되는 모든 데이터가 반드시 CPU를 거쳐야 한다면 가뜩이나 바쁜 CPU는 입출력장치를 위한 연산 떄문에 시간을 뻇기게 된다.
그래서 입출력장치가 메모리와 CPU를 거치지 않고도 상호작용할 수 있는 입출력방식인 DMA(Direct Memory Access)가 등장하였다. 이름 그대로 집접 메모리에 접근할 수 있는 입출력 기능이다. DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다.
보기
SRAM, DRAM
보기
메모리, 보조기억장치, 캐시 메모리, 레지스터
답. 1 - 레지스터, 2 - 캐시메모리 3 - 메모리, 4 - 보조기억장치
위에서 아래로 내려갈수록 CPU와의 거리가 멀어지며, 용량이 커지고 비용이 낮아지고 속도가 느려진다.