학습 목표
•
장치 컨트롤러
•
장치 드라이버
•
프로그램 입출력 방식
•
인터럽트 기반의 입출력 방식
•
DMA 입출력 방식
장치 컨트롤러와 장치 드라이버
장치 컨트롤러
입출력 장치는 종류가 너무 많다
•
키보드, 모니터, USB 메모리, CD-ROM, SSD, 마우스, 프린터, 스피커, 마우스, ,,,
•
종류가 많으니 장치마다 속도, 데이터 전송 형식도 다르다
•
규격도 당연히 다르다
데이터 전송률이 낮다
•
일반적으로 CPU와 메모리의 데이터 전송률은 높지만
•
입출력 장치의 데이터 전송률은 낮다
◦
전송률, Transfer Rate → 데이터를 얼마나 빨리 교환할 수 있는 지 나타내는 지표
•
전송률이 차이나면 통신을 어렵게 한다
•
그래서 입출력장치는 컴퓨터에 직접 연결하지 않는다
•
대신 장치 컨트롤러(Device Controller)라는 하드웨어를 통해 연결
•
장치 컨트롤러 = 입출력 제어기 (IO controller) = 입출력 모듈 (IO module)
◦
장치 컨트롤러는 하나 이상의 입출력장치와 연결
◦
하드 디스크 또한 장치 컨트롤러가 있다
장치 컨트롤러의 역할
1.
CPU와 입출력장치 간의 통신 중계
2.
오류 검출
3.
데이터 버퍼링
a.
전송률이 높은 장치와 낮은 장치 사이에서 주고받는 데이터를
b.
버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
c.
버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나
d.
데이터를 한 번에 많이 받아 조금씩 내보내는 방법
→ 전송률 차이 완화
장치 컨트롤러 내부
1.
데이터 레지스터, Data Register
2.
상태 레지스터, Status Register
3.
33제어 레지스터, Control Register
장치 드라이버
Device Driver
•
장치 드라이버란 장치 컨트롤러의 동작을 감지하고 제어함으로써
•
장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램
•
프로그램 ⇒ 메모리에 저장
•
장치 컨트롤러: 입출력장치를 위한 하드웨어적인 통로
•
장치 드라이버: 입출력장치를 위한 소프트웨어적 통로
여기서는 왜 CPU가 아니라 운영체제에 초점이 맞춰져 있을까?
다양한 입출력 방법
프로그램 입출력, 메모리 맵 입출력, 고립형 입출력, 인터럽트 기반 입출력, DMA 입출력, 입출력 버스
장치 컨트롤러가 CPU와 통신하는 법
1.
프로그램 입출력
2.
인터럽트 기반 입출력
3.
DMA 입출력
프로그램 입출력
Programmed IO
•
프로그램 속 명령어로 입출력장치를 제어하는 방법
•
CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면
•
CPU는 입출력장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 수행
과정
1
2
3
•
작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 쓰면서 이루어짐
•
CPU는 입출력장치들의 주소를 어떻게 알까?
◦
⇒ 정확히 말해 CPU는 장치 컨트롤러의 레지스터들을 어떻게 알까?
◦
1) 메모리 맵 입출력
◦
2) 고립형 입출력
메모리 맵 입출력
Memory-Mapped IO
•
메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 주소 공간을 하나의 주소공간으로 간주
•
가령, 1024 주소 있다면 → 512개씩 나눠서 사용 (메모리 주소, 장치 컨트롤러 레지스터)
•
CPU는 둘을 구분할 필요가 없다
◦
CPU가 ‘517번지를 읽어라’라는 명령어를 실행했을 때
◦
517→메모리상의 주소: 메모리 517번의 값 읽는다
◦
517→프린트 컨트롤러의 상태 레지스터: 프린터의 상태 값을 읽는다
고립형 입출력
Isolated IO
•
메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리하는 방법
•
예시) 1024개의 주소공간을 갖는 컴퓨터
◦
메모리 읽기 쓰기 선 + 입출력장치 읽기 쓰기 선 따로 둔다 → 각각 1024 주소 공간 활용
◦
어떤 버스가 활성화되는 지 제어버스를 통해 특정
→ 서로 다른 입출력 명령어를 사용한다
인터럽트 기반 입출력
◦
입출력장치에 의한 하드웨어 인터럽트는
◦
입출력장치가 아니라 장치 컨트롤러에 의해 발생한다
◦
CPU → 장치컨트롤러에 IO 명령 후 자기 할 일 한다
◦
장치 컨트롤러가 일 끝내고 인터럽트 신호 → CPU는 하던 일 백업하고 인터럽트 서비스 루틴 실행
폴링 (Polling)
인터럽트와 자주 비교되는 개념. 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식. 당연 CPU 부담이 더 크다.
•
여러 입출력장치에서 인터럽트가 동시에 발생한 경우
•
CPU가 순차적으로 인터럽트를 해결하는 방법
◦
현실적으로 순차적으로 해결하는 건 어려울 수 있다
→ CPU 인터럽트 간에 우선순위를 고려하려 처리
→ 인터럽트 처리 중이더라도, 중요한 요청이 오면 먼저 처리하고 돌아온다
•
플래그 레지스터 속 인터럽트 비트가 활성화된 경우
•
혹은 인터럽트 비트를 비활성화해도 무시 불가능한 NMI(Non-Maskable Interrupt)가 발생한 경우
•
CPU는 이렇게 우선순위가 높은 인터럽트부터 처리한다
우선순위를 반영하여 다중 인터럽트를 처리하는 방법
•
프로그래머블 인터럽트 컨트롤러 (PIC, Programmable Interrupt Controller)라는 하드웨어 이용
•
PIC는 여러 장치 컨트롤러에 연결된다
•
장치 컨트롤러들이 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한다
•
CPU에 지금 처리해야 할 하드웨어 인터럽트를 알려준다
PIC의 다중 인터럽트 처리 과정
1.
PIC가 장치 컨트롤러에서 인터럽트 요청 신호들을 받아들인다
2.
PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 본낸다
3.
CPU는 PIC에 인터럽트 확인 신호를 보낸다
4.
PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보낸다
5.
CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고, 해당 장치의 인터럽트 서비스 루틴을 실행
•
보통 한 개 이상의 PIC 사용하여 계층적으로 구성
NMI
PIC는 NMI의 우선순위를 판별하지 않는다. 가장 높은 우선순위라서 판별할 필요가 없기 때문. PIC가 우선순위를 조정해 주는 인터럽트는 인터럽트 비트를 통해 막을 수 있는 하드웨어 인터럽트이다
DMA 입출력
•
프로그램 기반 입출력, 인터럽트 기반 입출력의 공통점
◦
입출력장치와 메모리 간의 데이터 이동은 CPU가 주도
◦
이동하는 데이터도 반드시 CPU를 거친다
•
ex) 입출력장치 데이터를 메모리에 저장하는 경우
1.
장치 컨트롤러에서 입출력 장치 데이터를 하나씩 읽어 레지스터에 적재한다
2.
적재한 데이터를 메모리에 저장한다
•
ex) 메모리 속 데이터를 입출력장치에 내보내는 경우
1.
메모리에서 데이터를 하나씩 읽어 레지스터에 적재
2.
적재한 데이터를 하나씩 입출력장치에 보냄
•
반드시 CPU를 거친다 → 안그래도 바쁜 CPU가 더 바빠진다
DMA
Direct Memory Access
•
입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 방식
•
이름 그대로 직접 메모리에 접근할 수 있는 입출력 기능
•
DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요
DMA 입출력 과정
1.
CPU는 DMA 컨트롤러에 입출력 작업을 명령
a.
CPU→DMA 입출력장치의 주소, 수행할 연산(읽기, 쓰기), 읽거나 쓸 메모리의 주소 등과 같은 정보 전달
2.
DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행
a.
DMA 컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 씀
3.
입출력 작업이 끝나면 DMA → CPU 인터럽트 걸어 작업이 끝났음을 알린다
메모리 → 하드디스크 백업 DMA 예시
1
2
3
•
문제가 있다 → DMA 컨트롤러는 시스템 버스로 메모리 접근
◦
시스템 버스는 공용 자원이라서 동시 사용이 불가
◦
CPU가 시스템 버스 사용할 때는 DMA 컨트롤러는 시스템 버스 사용 불가
◦
vice versa
•
해결
1.
DMA 컨트롤러가 CPU가 시스템 버스 안 쓸 때 조금씩 시스템 버스 사용
2.
CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스 집중적 이용
입출력 버스
•
CPU, 메모리, DMA 컨트롤러, 장치 컨트롤러 → 모두 같은 버스를 공유하는 경우
◦
DMA → 메모리 한 번 접근에 시스템 버스 두 번 사용하는 부작용
•
시스템 버스를 자주 사용할 수록 CPU가 시스템 버스를 못 쓴다
•
입출력 버스 (Input Output bus)
◦
DMA 컨트롤러와 장치 컨트롤러들을 입출력 버스라는 별로의 버스에 연결
◦
시스템버스 사용 빈도를 줄일 수 있다
입출력 버스 종류
1.
PCI 버스, Peripheral Component Interconnect 버스
2.
PIC Express (PICe) 버스
3.
등등
•
PCIe 슬롯: 입출력장치들을 PCIe 버스와 연결해주는 통로