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/ODevice 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 동작 과정

  1. CPU 하드웨어에 Interrupt-request line이라는 신호선이 존재
  2. I/O 장치가 이 선을 Trigger
  3. CPU는 매 명령어 실행 후 이 신호를 감지
  4. 신호 감지 시:
    • CPU가 현재 상태(State)를 저장
    • 메모리의 고정 주소에 있는 Interrupt handler routine으로 점프

3.2 Interrupt Handler

  • Interrupt의 원인을 판별
  • 필요한 처리를 수행
  • Return from interrupt 명령어를 실행하여 CPU를 이전 상태로 복원

3.3 두 가지 Interrupt-Request Line

종류설명
Nonmaskable복구 불가능한 메모리 오류 등 중요 이벤트에 예약됨
MaskableDevice 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/OI/O 완료까지 프로세스 SuspendedRun queue에서 Wait queue로 이동. 사용하기 쉽고 이해하기 쉬움
Non-blocking I/OI/O 호출이 가용한 만큼의 데이터와 함께 즉시 반환Return value로 전송된 바이트 수를 표시 (요청한 전체, 일부, 또는 0)
Asynchronous I/OI/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 기능 요약

기능역할
SchedulingI/O 요청 순서 관리, 공정성
Buffering속도/크기 불일치 해소, Copy semantics
Caching성능 최적화를 위한 데이터 복사본 유지
Spooling단일 접근 장치의 출력 관리
Error handling오류 복구, 로깅

I/O Software 계층 구조