1. I/O Hardware
1.1 I/O 장치의 다양성과 공통 개념
다양한 I/O 장치가 존재하지만, 공통적인 개념으로 분류할 수 있다:
| 개념 | 설명 | 예시 |
|---|---|---|
| Port | 장치와의 연결 지점 | Serial port |
| Bus | 여러 장치를 연결하는 통신 경로 | Daisy chain 방식 또는 Shared direct access 방식 |
| Controller | 장치를 제어하는 전자 회로 | 단순 칩 또는 별도 회로 기판 (Host adapter) |
1.2 I/O 명령과 Device Controller
- I/O instructions이 장치를 제어
- Controller는 데이터 및 제어 신호를 위한 하나 이상의 Register를 보유
- Processor가 Controller에 명령과 데이터를 전달하는 두 가지 방식:
| 방식 | 설명 |
|---|---|
| Special I/O instructions | 전용 I/O 명령어를 사용하여 I/O port address에 접근 |
| Memory-mapped I/O | Device control register가 프로세스의 Address space에 매핑됨. CPU가 표준 데이터 전송 명령어로 I/O 요청 수행 |
1.3 I/O Port Register
I/O port는 네 가지 Register로 구성된다:
| Register | 역할 | 접근 |
|---|---|---|
| Status register | 장치 상태를 나타내는 비트 포함 (Busy bit, Error bit) | Host가 읽음 |
| Control register | 명령 시작 또는 장치 모드 변경 | Host가 씀 |
| Data-in register | 입력 데이터를 담음 | Host가 읽음 |
| Data-out register | 출력 데이터를 담음 | Host가 씀 |
2. Polling (폴링)
- Status register의 Busy bit를 확인하여 장치 상태를 판별
- Busy-wait cycle로 장치의 I/O 완료를 대기
Polling의 효율성
| 상황 | 평가 |
|---|---|
| Controller와 Device가 빠른 경우 | Polling은 합리적인 방식 |
| 장치가 자주 준비되지 않는 상태에서 반복 시도 | 비효율적 - CPU가 다른 유용한 작업을 처리하지 못함 |
Polling이 비효율적인 경우, 하드웨어 Controller가 장치가 준비되면 CPU에 알리는 방식이 더 낫다 ⇒ Interrupt
3. Interrupt (인터럽트)
3.1 Interrupt 동작 과정
- CPU 하드웨어에 Interrupt-request line이라는 신호선이 존재
- I/O 장치가 이 선을 Trigger
- CPU는 매 명령어 실행 후 이 신호를 감지
- 신호 감지 시:
- CPU가 현재 상태(State)를 저장
- 메모리의 고정 주소에 있는 Interrupt handler routine으로 점프
3.2 Interrupt Handler
- Interrupt의 원인을 판별
- 필요한 처리를 수행
- Return from interrupt 명령어를 실행하여 CPU를 이전 상태로 복원
3.3 두 가지 Interrupt-Request Line
| 종류 | 설명 |
|---|---|
| Nonmaskable | 복구 불가능한 메모리 오류 등 중요 이벤트에 예약됨 |
| Maskable | Device controller가 사용하며, CPU가 중요 명령어 시퀀스 전에 끌 수 있음 |
3.4 Interrupt 관련 메커니즘
- Interrupt vector: Interrupt를 올바른 Handler로 Dispatch (전달)
- Interrupt 메커니즘은 Exception 처리에도 사용됨
- 예: Divide by zero, Protected memory address 접근 등
4. A Kernel I/O Structure

Kernel의 I/O 구조는 계층적(Layered)으로 설계되어 있다.
핵심 구조:
- Kernel (최상위) ⇒ 전체 시스템 관리
- Kernel I/O subsystem ⇒ I/O 관련 공통 기능 제공
- Device drivers (Software) ⇒ 각 장치별 차이를 Kernel로부터 은닉
- Device controllers (Hardware) ⇒ 장치와 직접 통신하는 하드웨어
- Physical devices (최하위) ⇒ 실제 I/O 장치 (SCSI, Keyboard, Mouse, PCI bus, Floppy, ATAPI 등)
5. Application I/O Interface
5.1 개요
- I/O system call은 장치의 동작을 Generic class로 캡슐화하여, I/O 장치를 표준적이고 균일하게 다룰 수 있게 함
- Device-driver layer가 I/O controller 간의 차이를 Kernel로부터 숨김
5.2 I/O 장치의 다양한 차원
I/O 장치는 여러 차원에서 다양하다:
| 차원 | 구분 |
|---|---|
| 데이터 전송 단위 | Character-stream vs Block |
| 접근 방식 | Sequential vs Random-access |
| 공유 가능성 | Sharable vs Dedicated |
| 동작 속도 | 장치마다 상이 |
| 접근 권한 | Read-write, Read only, Write only |
6. Block and Character Devices
6.1 Block Devices
- 예: Disk drives
- 지원 명령어:
read,write,seek - Raw I/O (예: Database system) 또는 File-system 접근
- Memory-mapped file 접근 가능
- 데이터 전송이 Demand-paged virtual-memory 접근과 같은 메커니즘으로 처리됨
6.2 Character Devices
- 예: Keyboards, Mice, Serial ports
- 지원 명령어:
get,put - 입력 장치에 편리: 데이터가 자발적(Spontaneously)으로 생성됨
- 출력 장치에 적합: Printer, Audio board 등은 자연스럽게 선형 바이트 스트림(Linear stream of bytes) 개념에 부합
7. Blocking and Nonblocking I/O
7.1 세 가지 I/O 모델 비교
| 모델 | 동작 방식 | 특징 |
|---|---|---|
| Blocking I/O | I/O 완료까지 프로세스 Suspended | Run queue에서 Wait queue로 이동. 사용하기 쉽고 이해하기 쉬움 |
| Non-blocking I/O | I/O 호출이 가용한 만큼의 데이터와 함께 즉시 반환 | Return value로 전송된 바이트 수를 표시 (요청한 전체, 일부, 또는 0) |
| Asynchronous I/O | I/O 실행 중에도 프로세스가 계속 실행 | 전체 전송을 요청하되, 미래 어느 시점에 완료됨. 사용하기 어려움 |
7.2 Non-blocking vs Asynchronous I/O
- Non-blocking I/O: 즉시 반환하되, 현재 사용 가능한 데이터만 전달 (전체, 일부, 또는 없음)
- Asynchronous I/O: 전체 전송을 요청하고, I/O가 완료되면 I/O subsystem이 프로세스에 Signal
8. Kernel I/O Subsystem
8.1 Scheduling
- Per-device queue를 통해 I/O 요청 순서 관리
- 공정성(Fairness)을 유지하려고 시도
8.2 Buffering
메모리에 데이터를 저장하여 장치 간 전송을 원활하게 함. 세 가지 목적:
| 목적 | 설명 |
|---|---|
| Speed mismatch 대응 | 속도가 다른 장치 간의 데이터 전송 조율 |
| Transfer size mismatch 대응 | 전송 단위 크기가 다른 장치 간 호환 |
| Copy semantics 유지 | ”디스크에 기록되는 데이터 버전은, Application의 buffer에 이후 변경이 있더라도, System call 시점의 데이터 버전임을 보장” |
Copy semantics 구현:
- Application의 데이터를 Kernel buffer에 복사한 후 Application에 제어를 반환
- 디스크 쓰기는 Application buffer가 아닌 Kernel buffer에서 수행
8.3 Caching
- 성능의 핵심 (Key to performance)
- 빠른 메모리 영역에 데이터의 복사본(Copy)을 보관
- 항상 다른 곳에 있는 항목의 사본일 뿐
- Buffer vs Cache 차이: Buffer는 데이터 항목의 유일한 사본을 보유할 수 있지만, Cache는 항상 복사본
8.4 Spooling
- 장치에 대한 출력을 임시 보관
- 장치가 한 번에 하나의 요청만 처리 가능한 경우에 사용
- 예: Printing - 여러 프로세스의 인쇄 요청을 Spool에 저장하고 순서대로 처리
8.5 Error Handling
- OS는 다양한 I/O 오류로부터 복구 가능:
- Disk read failure
- Device unavailable
- Transient write failures
- 매 사소한 문제가 전체 시스템 실패로 이어지지 않도록 함
- I/O 요청 실패 시 Error number 또는 Error code 반환
- System error log에 문제 보고서 기록
8.6 Kernel Data Structures
- Kernel은 I/O 구성 요소의 상태 정보를 유지:
- Open file table
- Network connection 정보
- Character device 상태
- Buffer, Memory allocation, “Dirty” block 등을 추적하기 위한 복잡한 자료 구조 다수 사용
9. Performance (성능)
9.1 I/O와 시스템 성능
I/O는 시스템 성능에 주요 요인이다:
- Device driver, Kernel I/O 코드 실행을 위한 CPU 부하
- Interrupt로 인한 Context switch
- Data copying 비용
- Network traffic이 특히 큰 부담
9.2 I/O 성능 개선 방법
| 개선 방법 | 설명 |
|---|---|
| Context switch 감소 | Interrupt 및 프로세스 전환 오버헤드 줄이기 |
| Data copying 감소 | 불필요한 데이터 복사 제거 |
| Interrupt 감소 | 대용량 전송(Large transfers) 사용 또는 Polling 활용 |
| DMA 사용 | CPU 개입 없이 장치와 메모리 간 직접 데이터 전송 |
| 균형 유지 | CPU, Memory, Bus, I/O 성능 간 Balance를 맞추어 최대 Throughput 달성 |
10. 핵심 정리
I/O 처리 방식 비교
| 방식 | CPU 개입 | 효율성 | 적합한 경우 |
|---|---|---|---|
| Polling | 높음 (Busy-wait) | 장치가 빠르면 효율적 | 빠른 장치, 짧은 대기 |
| Interrupt-driven | 낮음 (이벤트 기반) | 일반적으로 효율적 | 느린 장치, 긴 대기 |
| DMA | 최소 (전송 완료 시에만) | 대용량 전송에 최적 | Block device, 대량 데이터 |
Kernel I/O Subsystem 기능 요약
| 기능 | 역할 |
|---|---|
| Scheduling | I/O 요청 순서 관리, 공정성 |
| Buffering | 속도/크기 불일치 해소, Copy semantics |
| Caching | 성능 최적화를 위한 데이터 복사본 유지 |
| Spooling | 단일 접근 장치의 출력 관리 |
| Error handling | 오류 복구, 로깅 |
I/O Software 계층 구조
