Chapter 08 입출력장치
1. 장치 컨트롤러와 장치 드라이버
장치 컨트롤러/ 장치 드라이버
CPU와 메모리의 데이터 전송률 ↑, 입출력장치의 데이터 전송률 ↓
전송률(transfer rate): 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표
=> 컴퓨터에 직접 연결 X, 장치 컨트롤러 ~> 컴퓨터 내부와 정보 주고받음
장치 컨트롤러(device controller) = 입출력 제어기(I/O controller) = 입출력 모듈(I/O module)
- CPU와 입출력장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링(buffering)
전송률이 높은 장치와 낮은 장치 사이에 주고 받는 데이터 -> 버퍼(buffer)라는 임시 공간에 저장
=> 전송률 비슷하게 맞추는 방법
/ 버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 내보는 방법- 전송률 ↑ CPU와 전송률 ↓ 입출력장치와의 전송률 차이 -> 데이터 버퍼링으로 완화
내부 구조
- 데이터 레지스터(data register): CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터/ 버퍼 역할
- 상태 레지스터(state register): 입출력 작업 준비 됐는지, 완료 됐는지, 오류 없는지 등 상태 정보 저장
- 제어 레지스터(control register): 입출력장치가 수행할 내용에 대한 제어 정보와 명령 저장
장치 드라이버(device driver)
- 장치 컨트롤러의 동작 감지하고 제어하는 프로그램
- 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램 => 실행 과정에서 메모리에 저장
- 장치 컨트롤러: 입출력장치 연결을 위한 하드웨어적 통로
- 장치 드라이버: 입출력장치 연결을 위한 소프트웨어적 통로
- 장치 드라이버를 인식하고 실행하는 주체: 운영체제
- 운영체제) 장치 드라이버 인식하고 실행 O -> 장치는 컴퓨터 내부와 정보 주고 받을 수 O
- 장치 드라이버 설치 X -> 입출력장치 사용 X
2. 다양한 입출력 방법
프로그램 입출력/ 메모리 맵 입출력/ 고립형 입출력/ 인터럽트 기반 입출력/ DMA 입출력/ 입출력 버스
입출력 작업 수행 -> CPU와 장치 컨트롤러 정보 주고 받아야 함
ㄴ프로그램 입출력/ 인터럽트 기반 입출력/ DMA 입출력
프로그램 입출력(programmed I/O)
프로그램 속 명령어로 입출력장치를 제어하는 방법
-> CPU가 상태 확인
메모리에 저장된 정보 -> 하드 디스크에 백업
= 하드 디스크에 새로운 정보를 쓴다
1. CPU) 쓰기 명령 -> 하드 디스크 컨트롤러의 제어 레지스터
2. 하드 디스크 컨트롤러) 하드 디스크 상태 확인, 준비 O -> 상태 레지스터에 준비됐다고 표시
3-1. CPU) 상태 레지스터 주기적으로 읽어보며 하드 디스크 준비 여부 확인
3-2. CPU) 하드 디스크 준비 O -> 백업할 메모리 정보 -> 데이터 레지스터에 씀
=> 입출력 작업: CPU가 장치 컨트롤러의 레지스터 값 읽고 씀으로써 이뤄짐
-> CPU가 입출력장치 주소 어떻게 아는 걸까? = 장치 컨트롤러의 레지스터 어떻게 알까?
- 메모리 맵 입출력(memory-mapped I/O)
- 메모리에 접근하기 위한 주소 공간 + 입출력장치에 접근하기 위한 주소 공간
=> 하나의 주소 공간으로 간주하는 입출력 방식 - ex. 1,024개 주소 표현 O 컴퓨터 -> 512개: 메모리 주소/ 512개: 입출력장치 주소
- CPU) 모두 똑같이 메모리 주소 대하듯 하면 됨 = 명령어 같음
- 메모리에 접근하기 위한 주소 공간 + 입출력장치에 접근하기 위한 주소 공간
- 고립형 입출력(isolated I/O)
- 메모리 위한 주소 공간, 입출력 장치 위한 주소 공간 분리하는 방법
- ex. 1024개 주소 공간 가진 컴퓨터
-> 제어 버스) 메모리 읽기/쓰기, 입출력장치 읽기/쓰기 -> 각각 1,024개 주소 공간 활용 - CPU) 메모리 읽기/쓰기 선 활성화 -> 메모리 접근, 입출력장치 읽기/쓰기 선 활성화 -> 장치 컨트롤러
- CPU) 메모리 읽기/쓰기 명령어 != 입출력 읽기/쓰기 명령어
메모리 맵 입출력 | 고립형 입출력 |
메모리 = 입출력장치 주소 공간 | 메모리 != 입출력장치 주소 공간 |
메모리 주소 공간 축소 | 메모리 주소 공간 축소 X |
메모리 = 입출력 장치 명령어 | 메모리 = 입출력 장치 명령어 |
인터럽트 기반 입출력(Interrupt-Driven I/O)
04장
- CPU) 입출력장치에 처리할 내용을 명령 -> 입출력장치가 명령어 수행하는 동안 CPU 다른 일 할 수 있음
- 플래그 레지스터 속 인터럽트 비트
- 입출력장치) 인터럽트 요청 신호
-> CPU) 하던 일 멈추고 인터럽트 서비스 루틴(: 해당 인터럽트 처리하는 프로그램) 실행한 뒤 다시 하던 일로 되돌아옴
입출력장치에 의한 하드웨어 인터럽트
= 입출력장치 X 장치 컨트롤러 O
CPU) 입출력 작업 명령 -> 장치 컨트롤러) 입출력장치 제어, 입출력 수행하는 동안 CPU 다른 일
장치 컨트롤러) 입출력 작업 끝낸 뒤 인터럽트 요청 신호 -> CPU) 하던 일 백업, 인터럽트 서비스 루틴 실행
=> CPU -입출력 명령-> 장치 컨트롤러 -> 입출력장치
/ CPU <-인터럽트 요청-장치 컨트롤러 <- 입출력장치
인터럽트 기반 입출력
- 인터럽트 기반으로 하는 입출력
- 인터럽트로써 입출력을 수행하는 방법
*폴링(polling)
입출력장치의 상태 어떤지, 처리할 데이터 있는지 주기적으로 확인하는 방식
인터럽트 방식보다 CPU의 부담 큼
여러 입출력장치에서 인터럽트 동시에 발생한 경우, 인터럽트 어떻게 처리?
=> 인터럽트가 발생한 순서대로 처리? (X)
CPU) 인터럽트 간 우선순위 고려해서 처리하는 경우
- 플래그 레지스터 속 인터럽트 비트 활성화 O
- 비활성화해도 무시 X 인터럽트인 NMI(Non-Maskable Interrupt) 발생
프로그래머블 인터럽트 컨트롤러(PIC; Programmable Interrupt Controller)
- 여러 장치 컨트롤러에 연결돼 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위 판별
- -> CPU에 지금 처리해야 할 하드웨어 인터럽트 무엇인지 알려주는 장치
- 여러 핀으로 구성, 각 핀마다 CPU에 하드웨어 인터럽트 요청을 보낼 수 있는 약속된 하드웨어가 연결 돼 있음
- 다중 인터럽트 처리 과정
- PIC) 장치 컨트롤러에서 인터럽트 요청 신호(들) 받아들임
- PIC) 인터럽트 우선순위 판단 -> CPU에서 처리해야 할 인터럽트 요청 신호 보냄
- CPU) 인터럽트 확인 신호 -> PIC
- PIC) 인터럽트 벡터 ~데이터 버스~> CPU
- CPU) 인터럽트 벡터 ~> 인터럽트 요청 주제 알게 됨, 해당 장치의 인터럽트 서비스 루틴 실행
=> PIC에 연결된 장치 컨트롤러) 동시에 하드웨어 인터럽트 요청
-> PIC) 우선순위 판단해 가장 먼저 처리할 인터럽트 알려줌
2개 이상 계층적으로 PIC 구성 -> 훨씬 더 많은 하드웨어 인터럽트 관리할 수 있음
DMA(Direct Memory Access) 입출력
프로그램 기반 입출력, 인터럽트 기반 입출력
=> 공통점: 입출력장치와 메모리 간의 데이터 이동, 이동하는 데이터 CPU 거침
- 입출력장치 데이터 -> 메모리에 저장하는 경우 CPU
- 장치 컨트롤러에서 입출력 데이터 읽어 -> 레지스터에 적재
(장치 컨트롤러 -> CPU) - 적재한 데이터 -> 메모리에 저장
(CPU -> 메모리)
- 장치 컨트롤러에서 입출력 데이터 읽어 -> 레지스터에 적재
- 메모리 속 데이터 -> 입출력장치에 내보내는 경우 CPU
- 메모리에서 데이터 읽어 -> 레지스터에 적재
(메모리 -> CPU) - 적재한 데이터 -> 입출력장치에 내보냄
(CPU -> 장치 컨트롤러)
- 메모리에서 데이터 읽어 -> 레지스터에 적재
=> (-) 모든 데이터 반드시 CPU 거침 -> CPU 부담 ↑
=> (해결) DMA
- 입출력장치와 메모리가 CPU 거치치 X 상호작용할 수 있는 입출력 방식
- 직접 메모리에 접근할 수 있는 입출력 기능
- 시스템 버스에 연결된 DMA 컨트롤러(하드웨어) 필요
입출력 과정
- CPU) 입출력 작업 명령(입출력장치의 주소, 수행할 연산(읽기/쓰기), 읽거나 쓸 메모리의 주소 등) -> DMA 컨트롤러
- DMA 컨트롤러) CPU 대신 장치 컨트롤러와 상호작용, 입출력 작업 수행
/ 필요한 경우 메모리에 직접 접근하여 정보 읽거나 씀 - DMA 컨트롤러) 입출력 작업 끝나면 인터럽트 걸어 작업 끝났음 알림 -> CPU
메모리 내의 정보 -> 하드 디스크에 백업하는 작업
1. CPU) 정보(하드 디스크 주소, 수행할 연산(쓰기), 백업할 내용 저장된 메모리 주소)
+ 입출력 작업 명령 -(시스템 버스(1번))-> DMA 컨트롤러
2. DMA 컨트롤러) CPU 거치치 X 메모리와 직접 상호작용
-> 백업할 정보 읽어옴-(시스템 버스(2번))-> 하드 디스크의 장치 컨트롤러
3. DMA 컨트롤러) 백업 끝나면 인터럽트 걸어 작업 끝났음 알림 -> CPU
=> 입출력장치와 메모리 사이에 주고받을 데이터 CPU 거치지 X
DMA 컨트롤러는 시스템 버스로 메모리에 직접 접근 O But, 시스템 버스(공용 자원) 동시 사용 X
= CPU) 시스템 버스 사용 O -> DMA 컨트롤러) 시스템 버스 사용 X
/ CPU) 시스템 버스 사용 X -> DMA 컨트롤러) 시스템 버스 사용 O
CPU 입장에서는 버스에 접근하는 주기 도둑 맞는 것 -> DMA 시스템 버스 이용: 사이클 스틸링(cycle stealing)
CPU, 메모리, DMA 컨트롤러, 장치 컨트롤러 모두 같은 버스 공유
-> (-) DMA 위해 1번 메모리 접근 시 시스템 버스 2번 사용
DMA 위해 시스템 버스 사용 ↑ -> CPU 시스템 버스 사용 ↓
=> (해결) 입출력 버스(input/output bus)
- 입출력장치와 컴퓨터 내부 연결 짓는 통로
- 입출력 작업 과정에서 시스템 버스 사용 횟수 ↓
- 슬롯 -> 입출력 버스 -> 시스템 버스
- PCI(Peripheral Component Interconnect) 버스, PCI Express(PCIe) 버스 등
- PCIe 슬롯: 여러 입출력장치들 PCIe 버스와 연결해주는 통로
입출력 프로세서(IOP; Input/Output Processor) = 입출력 채널(Input/Output Channel)
: 메모리에 직접 접근, 입출력 명령어 직접 인출/해석/실행 하는 일종의 입출력 전용 CPU
출처
'Computer Science > 컴퓨터구조 | 운영체제' 카테고리의 다른 글
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 10 프로세스와 스레드 (0) | 2024.07.09 |
---|---|
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 09 운영체제 시작하기 (0) | 2024.07.09 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 07 보조기억장치 (0) | 2024.01.08 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 06 메모리와 캐시 메모리 (0) | 2024.01.08 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 05 CPU 성능 향상 기법 (0) | 2024.01.08 |