Computer Science/운영체제

[운영체제] 12. I/O Systems

lumana 2024. 6. 19. 01:29

Modern I/O Systems

다양한 종류의 I/O 장치가 있습니다

  • CPU는 디바이스 컨트롤러(device controller)와 상호작용합니다.
    • 디바이스 컨트롤러는 읽고 쓸 수 있는 레지스터 세트를 포함합니다.

Programmed I/O

Port I/O

  • 특수 프로세서 명령어를 사용하여 데이터를 전송합니다.
    • 예: 인텔 아키텍처의 in/out 명령어
  • 각 장치는 다른 I/O 포트를 사용합니다. (포트 번호)

Memory-mapped I/O

  • 디바이스 컨트롤러의 레지스터는 물리 주소 공간에 매핑됩니다.
    • 주소는 하드웨어 점퍼(hardware jumper) 또는 부팅 시 프로그래밍으로 설정됩니다.
  • I/O는 로드 및 저장 명령어(load and store instructions)를 통해 수행됩니다.
  • I/O 주소 공간이 시스템 메모리 주소 공간의 범위를 차지하기 때문에 프로세스에서 사용할 수 없습니다.

Direct Memory Access (DMA)

Direct Memory Access

  • 대량의 데이터 이동을 위해 프로그래밍된 I/O를 피하기 위해 사용됩니다.
  • DMA 컨트롤러에게 메모리 버스에 대한 접근 권한을 부여합니다.
  • CPU를 우회하여 I/O 장치와 메모리 간에 직접 데이터를 전송합니다.
  • DMA 전송을 수행하는 6단계 프로세스

 

 

  • 디바이스 드라이버는 버퍼 주소 X로 디스크 데이터를 전송하라는 명령을 받음
  • 디바이스 드라이버는 디스크 컨트롤러에게 디스크에서 버퍼 주소 X로 C 바이트를 전송하라고 명령함
  • 디스크 컨트롤러는 DMA 전송을 시작함
  • 디스크 컨트롤러는 각 바이트를 DMA 컨트롤러로 보냄
  • DMA 컨트롤러는 주소 X의 버퍼로 바이트를 전송하면서 메모리 주소를 증가시키고 C를 0이 될 때까지 감소시킴
  • C가 0이 되면 DMA는 전송 완료를 신호하기 위해 CPU를 인터럽트함

 

 

Polling vs. Interrupt

  • OS는 I/O 장치가 작업을 완료했을 때를 알아야 하기 때문에 Polling과 Interrupt를 사용한다.

Interrupt

  • I/O 장치가 서비스가 필요할 때마다 인터럽트를 생성합니다.
  • 예측할 수 없는 이벤트를 잘 처리합니다.
  • 디바이스 드라이버에서 처리됩니다.

Polling

  • I/O 장치는 상태 레지스터(status register)에 완료 정보를 입력합니다.
  • OS는 주기적으로 디바이스 전용 상태 레지스터를 확인합니다.
  • 드문 또는 예측할 수 없는 I/O 작업의 경우 많은 사이클을 낭비할 수 있습니다.

일부 장치는 Polling과 Interrupt를 결합하여 사용합니다

  • 예: 고대역폭 네트워크 장치
    • 첫 번째 패킷 수신에 대해 인터럽트 발생
    • 이후 패킷에 대해 Polling

Standard Interfaces to Devices(표준 인터페이스 장치)

Block Devices(블록 장치)

  • 데이터는 블록 단위로 접근됩니다.
  • 예: 하드 디스크, 테이프, SSD
  • 명령어: read(), write(), seek()
  • 파일 시스템 또는 원시 I/O 접근

Character Devices(문자 장치)

  • 예: 키보드, 마우스, 프린터
  • 한 번에 한 문자씩 처리
  • 명령어: get(), put()

Network Devices(네트워크 장치)

  • 예: 이더넷, 무선, 블루투스
  • 유닉스와 윈도우는 소켓 인터페이스 포함
  • 명령어: create(), connect(), listen(), accept(), send(), receive()

Blocking and Non-blocking I/O

Blocking I/O(봉쇄형 I/O) - "Wait"

  • I/O가 완료될 때까지 프로세스가 중단됩니다.
  • 데이터 요청 시 프로세스가 데이터 준비될 때까지 대기
  • 데이터 작성 시 프로세스가 데이터가 작성될 때까지 대기

Non-blocking I/O(비봉쇄형 I/O) - "Don't Wait"

  • 요청된 데이터의 바이트 수를 반환하며 빠르게 종료

Kernel I/O Subsystem

I/O subsystem

  • 디바이스에 출력을 위한 간단한 예제

  • 이 코드는 많은 다른 디바이스에서 작동합니다.
  • I/O 서브시스템은 다양한 디바이스에 대한 표준 인터페이스를 제공합니다.
    • create, open, read, write, close, etc.
  • I/O 서브시스템은 디바이스 드라이버와 협력할 프레임워크를 제공합니다.

Device Driver

  • 디바이스와 직접 상호작용하는 커널의 디바이스 전용 코드

Kernel I/O Subsystem

A kernel I/O structure

  • (애플리케이션 레벨에서 커널 레벨로의 I/O 요청 흐름)
  • (하드웨어 장치 드라이버와의 상호작용)

Kernel I/O Subsystem

I/O Scheduling

  • I/O 성능 향상을 위해 I/O 요청을 재정렬합니다.
  • 예: 디스크 I/O 스케줄링 - SSTF, SCAN, C-SCAN 등

Buffering

  • 장치 간 데이터 전송 시 메모리에 데이터를 저장
    • 장치 속도 불일치 문제를 해결
    • 장치 전송 크기 불일치 문제를 해결

Caching

  • I/O 성능 향상을 위해 빠른 메모리(fast memory)에 데이터 복사본을 저장

Spooling(Simultaneous Peripheral Operations On-Line)

  • 인터리브된 데이터 스트림을 수용할 수 없는 장치를 위해 출력을 보관합니다.
  • 데이터를 병렬적으로 처리할 수 없는 장치를 위해 출력을 보류하는 기능을 말함
  • 예: 프린터

Kernel I/O Subsystem

A blocking read request example

(1) 사용자 프로세스: 시스템 호출로 I/O 요청

(2) 커널 I/O 서브시스템:

  • (2-1) 요청을 이미 충족할 수 있는지 확인, 충족할 수 있으면 데이터 전송 후 완료 상태 또는 오류 코드를 반환하고 (9)으로 이동
  • (2-2) 충족할 수 없으면 디바이스 드라이버에게 요청을 전송하고, 적절한 경우 프로세스를 블록 (3)

(3) 커널 I/O 서브시스템: 디바이스 드라이버에게 요청을 전송하고, 적절한 경우 프로세스를 블록

(4) 디바이스 드라이버: 요청을 처리하고, 컨트롤러에게 명령을 전송, 인터럽트가 발생할 때까지 블록하도록 컨트롤러를 구성

(5) 디바이스 컨트롤러: 장치를 모니터링하고, I/O가 완료되면 인터럽트 발생

(6) 디바이스 컨트롤러: I/O 완료 시 인터럽트 생성

(7) 인터럽트 핸들러: 인터럽트를 수신하고, 데이터가 입력된 경우 디바이스 드라이버 버퍼에 데이터를 저장, 디바이스 드라이버를 언블록하도록 신호

(8) 디바이스 드라이버: 완료된 I/O를 확인하고, 상태 변경을 I/O 서브시스템에 표시

(9) 커널 I/O 서브시스템: (적절한 경우) 데이터를 프로세스에 전송하고, 완료 상태 또는 오류 코드를 반환

(10) 사용자 프로세스: 시스템 호출로부터 반환, I/O 완료, 입력 데이터 이용 가능 또는 출력 완료