낮은 전송률과 장치 컨트롤러
전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표입니다. 전송률이 낮은 입출력 장치는 같은 시간동안 전송률이 높은 CPU, 메모리에 비해 적은 양의 데이터를 주고 받을 수 있어서 서로 간의 통신이 수월하지가 않겠죠.
이와 같은 이유로 입출력 장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(입출력 제어기, 입출력 모듈)라는 하드웨어를 통해 연결되어 컴퓨터 내부와 통신합니다. (장치 컨트롤러는 하나 이상의 입출력 장치와 연결)
1. 장치 컨트롤러의 역할
① CPU와 입출력 장치 간 통신 중개
② 오류 검출
③ 데이터 버퍼링
: 버퍼라는 임시 저장 공간에 데이터를 조금씩 모았다가 한번에 전송 혹은 한번에 많이 받아 놓았다가 조금씩 전송하는 방법. 이를 통해 CPU와 I/O Device 간 전송률 차이 극뽁
2. 장치 컨트롤러의 구조
① 데이터 레지스터
: CPU와 I/O Device 간 주고 받을 데이터가 담기는 레지스터. 위 데이터 버퍼링의 '버퍼' 역할. (RAM을 사용하기도 한다)
② 상태 레지스터
: I/O Device가 입출력 작업 준비 되었는지, 작업 완료 되었는지 등 상태 정보 저장
③ 제어 레지스터
: I/O Device가 수행할 내용에 대한 제어 정보와 명령 전달
장치 드라이버
장치 드라이버란 장치 컨트롤러의 동작을 감지, 제어하여 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램입니다. 프로그램이니 실행되었을 때 메모리에 저장됩니다. (I/O Device의 연결을 위한 소프트웨어적인 통로)
이 장치 드라이버를 인식하고 실행하는 주체는 정확히 말하자면 OS입니다. OS가 장치 드라이벌르 인식하고 실행할 수 있다면 그 장치는 컴퓨터 내부와 정보를 주고받을 수 있습니다.
다양한 입출력 방법
그렇다면 장치 컨트롤러는 어떻게 CPU와 정보를 주고 받을까요?
1. 프로그램 입출력
프로그램 속 명령어로 I/O Device를 제어하는 방법.
e.g. 메모리에 저장된 정보를 하드 디스크에 백업하는 상황
하드 디스크 컨트롤러에 CPU가 제어 레지스터에 쓰기 명령 → 하드 디스크 컨트롤러는 하드 디스크 상태를 확인 후 상태 레지스터에 준비 표시 → 준비 여부를 확인 후 CPU가 백업할 메모리 정보를 데이터 레지스터에 저장.
프로그램 입출력 방식은 결국 CPU와 장치 컨트롤러의 내부 레지스터와의 상호작용을 통해 이루어집니다. 그럼 CPU는 장치 컨트롤러의 레지스터를 어떻게 아는 걸까요?
① 메모리 맵 입출력
메모리에 접근하기 위한 주소 공간과 I/O Device에 접근하기 위한 주소 공간, 이 두 공간을 하나의 주소 공간으로 간주하는 방법. CPU는 메모리의 주소들이나 장치 컨트롤러의 레지스터들이나 동일한 방식으로 메모리 주소에 접근합니다.
예를 들어 1024개의 주소를 표현할 수 있는 컴퓨터가 있을 때 512개는 메모리 주소, 512개는 장치 컨트롤러의 레지스터 등으로 표현하게 됩니다.
516번지: 프린터 컨트롤러의 상태 레지스터
CPU가 516번지를 읽어라 라는 명령 실행 시 똑같이 메모리 접근하는 방식으로 516번지를 통해 프린터 컨트롤러의 상태를 확인.
② 고립형 입출력
메모리에 접근하기 위한 주소 공간과 I/O Device에 접근하기 위한 주소 공간, 이 두 공간을 분리하는 방법. 그러므로 CPU가 I/O Device에 접근하기 위한 명령어는 메모리에 접근하는 명령어와 다르게 됩니다. (입출력 전용 명령어 사용)
예를 들어 1024개의 주소를 표현할 수 있는 컴퓨터가 있을 때, 메모리에도 1024개의 주소 공간을 활용하고, I/O Device에도 1024개의 주소 공간을 활용.
2. 인터럽트 기반 입출력
I/O Device에 대한 하드웨어 인터럽트는 정확히 말하면 장치 컨트롤러에 의해 발생합니다. CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 I/O Device를 제어하며 입출력 작업 동안 CPU는 다른 일을 할 수 있습니다.
그러다가 I/O Device가 작업이 끝나면 CPU에게 입터럽트 요청 신호를 보내고, CPU는 하던 일을 백업하고 인터럽트 서비스 루틴을 실행하는 것이죠.
cf) 폴링
I/O Device의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식. 인터럽트 방식보다 CPU의 부담이 더 크다.
그렇다면 여러 I/O Device에서 인터럽트가 동시에 발생했을 때 어떻게 처리할까?
① 발생 순서대로 처리
② 우선순위가 높은 순서대로 처리
플래그 레지스터 속 인터럽트 비트가 활성화 되어 있는 경우, 혹은 인터럽트 비트를 활성화해도 무시할 수 없는 인터럽트인 NMI가 발생한 경우 CPU는 이렇게 우선순위가 높은 인터럽트부터 처리합니다.
CPU에게 그 많은 인터럽트 중에 이거 먼저 실행해야 돼 라고 말해주는 친구가 바로 PIC(Programmable Interrupt Controller)입니다. 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에게 전달합니다.
참고로 아무리 PIC가 CPU에게 우선순위가 높은 인터럽트를 전달하여도 NMI는 못이깁니다..
3. DMA 입출력
프로그램 입출력 방식과 인터럽트 기반 입출력 방식의 공통점은 I/O Device와 메모리 간 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 반드시 CPU를 거친다는 점입니다.
가뜩이나 바쁜 CPU의 휴무 보장을 위해, I/O Device가 CPU를 거치지 않고 직접적으로 메모리에 접근하는 입출력 방식이 DMA(Direct Memory Access)입니다. 이를 위해 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요합니다.
1) DMA 입출력 과정
① CPU가 DMA 컨트롤러에 입출력 작업 명령
② DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업 수행. 필요한 경우 메모리 접근하여 READ/WRITE
③ 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트 걸어 작업 종료 알림
즉, CPU는 입출력 과정에서 시작과 끝에만 관여. DMA 컨트롤러는 시스템 버스로 메모리에 직접 접근이 가능하지만, 시스템 버스는 공용 자원이므로 동시 사용이 불가능합니다. CPU가 사용할 때는 DMA 컨트롤러가 사용하지 못하는 것이죠. 그래서 DMA 컨트롤러는 CPU가 시스템 버스를 사용하지 않을 때마다 조금씩 시스템 버스를 사용하거나, CPU에게 허락을 구하고 집중적으로 이용합니다.
이러한 DMA의 시스템 버스 이용을 사이클 스틸링(cycle stealing)이라고 합니다.
2) 입출력 버스
DMA를 위해 시스템 버스를 너무 자주 사용하면 그만큼 CPU가 시스템 버스를 사용하지 못하기 때문에, 별도의 버스인 입출력 버스를 DMA 컨트롤러와 장치 컨트롤러에 연결하여 문제를 해결합니다. DMA 컨트롤러와 장치 컨트롤러 간 통신 시 발생하는 시스템 버스의 사용을 입출력 버스로 돌리는 것이죠.
최근에는 입출력 작업 명령조차 CPU가 아닌 I/O Device가 해내는 장치가 나온다고 합니다!
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
RAID (0) | 2023.03.27 |
---|---|
CPU - 명령어 사이클과 인터럽트 (0) | 2023.03.20 |
CPU - 구성 요소와 기능 (0) | 2023.03.18 |
명령어와 주소 지정 방식 (0) | 2023.03.13 |
컴퓨터의 기본 구조 (0) | 2023.03.13 |