본문 바로가기
컴퓨터공학/운영체제

12. I/O Systems

by Jinger 2023. 5. 18.

서론

 컴퓨터의 두 가지 주요 작업은 계산(computing)과 입축력 작업(I/O)이다. 많은 경우 계산 혹은 연산 처리 작업은 부수적이며 입출력 작업이 중요하다.


I/O Hardware

Modern I/O Systems

 현대에는 엄청나게 많은 종류의 I/O 장치가 있다. CPU는 장치 컨트롤러을 통해 이들과 상호 작용한다. 장치 컨트롤러에는 읽고 쓸 수 있는 일련의 레지스터가 포함되어 있다.

Programmed I/O

 프로그램 제어 입출력(Programmed I/O)은 포트 입출력(Port I/O)과 메모리 맵 입출력(Memory-mapped I/O)로 구성된다. 포트 입출력에서는 특수한 프로세서 명령어를 사용하여 데이터를 전송한다. 예를 들어, 인텔 아키텍처에서는 in/out 명령어가 있다. 또한, 각 장치는 고유한 입출력 포트(포트 번호)를 사용한다.

 메모리 맵 입출력에서는 장치 컨트롤러의 레지스터가 물리적 주소 공간에 매핑된다. 주소는 하드웨어 점퍼나 부팅 시 프로그래밍에 의해 설정된다. 입출력은 로드(load)와 스토어(store) 명령어를 사용하여 수행된다. 입출력 주소 공간은 시스템 메모리 주소 공간의 범위를 차지하기 때문에 프로세스에는 사용할 수 없다.

Direct Memory Access

 직접 메모리 접근(Direct Memory Access, DMA)은 대량의 데이터 이동에 프로그램 제어 입출력(Programmed I/O)를 피하기 위해 사용된다. DMA 컨트롤러에게 메모리 버스 접근 권한을 부여하여 CPU를 우회하고 I/O 장치와 메모리 간에 데이터를 직접 전송한다. DMA 전송을 수행하기 위해 다음과 같은 여섯 단계의 과정이 있다.

Polling vs. Interrupt

 폴링(Polling)과 인터럽트(Interrupt)는 운영체제가 I/O 장치의 작업 완료 여부를 알아야 할 때 사용된다. 폴링(Polling)은 운영체제가 주기적으로 I/O 장치의 상태를 확인하여 작업이 완료되었는지 여부를 판단하는 방식이다. 하지만 폴링은 작업이 불규칙하거나 드물게 발생하는 경우에는 많은 자원과 시간을 낭비할 수 있다. 반면에 인터럽트(Interrupt)는 I/O 장치가 작업을 요청할 때마다 인터럽트 신호를 발생시켜 운영체제에게 작업 완료를 알리는 방식이다. 이는 예측할 수 없는 이벤트를 신속하게 처리할 수 있으며, 장치 드라이버에서 관리된다. 일부 장치는 폴링과 인터럽트를 혼합하여 사용하여 처리 효율성을 극대화하는 경우도 있다.


Application I/O Interface

Standard Interfaces to Devices

표준 장치 인터페이스는 다음과 같이 분류된다.

  1. 블록 장치(Block Devices)
    • 데이터가 블록 단위로 접근한다.
    • 하드 디스크, 테이프, SSD 등이 여기에 해당된다.
    • read(), write(), seek()와 같은 명령어가 사용된다.
    • 파일 시스템 또는 원시 I/O 액세스를 지원한다.
  2. 문자 장치(Character Devices)
    • 키보드, 마우스, 프린터와 같은 장치가 여기에 속한다.
    • 한 번에 하나의 문자를 처리한다.
    • get(), put()과 같은 명령어가 사용된다.
  3. 네트워크 장치(Network Devices)
    • 이더넷, 무선, 블루투스 등과 같은 장치가 여기에 속한다.
    • Unix와 Windows는 소켓 인터페이스를 제공한다.
    • create(), connect(), listen(), accept(), send(), receive()와 같은 명령어가 사용된다.
    • 이러한 표준 인터페이스는 다양한 유형의 장치와의 상호 작용을 가능하게 하며, 운영 체제 및 응용 프로그램이 장치를 효율적으로 제어하고 사용할 수 있도록 한다.

Blocking and Non-blocking I/O

 봉쇄형(Blocking) I/O는 I/O 작업이 완료될 때까지 프로세스가 일시 중단되는 반면, 비봉쇄형(Non-blocking) I/O는 빠르게 반환되며 성공적으로 전송된 바이트 수를 반환한다. 봉쇄형I/O에서는 데이터를 요청할 때 프로세스가 데이터가 준비될 때까지 대기하고, 데이터를 기록할 때는 데이터가 기록될 때까지 대기한다. 비봉쇄형 I/O는 데이터가 준비되지 않았거나 기록되지 않았더라도 프로세스가 블로킹되지 않는다. 이러한 두 가지 I/O 방식은 프로세스의 동작을 제어하는 데 사용되며, 봉쇄형I/O는 다른 작업을 수행할 수 없는 반면, 비봉쇄형I/O는 다른 작업을 수행할 수 있다.


Kernel I/O Subsystem

 I/O 서브시스템( I/O structure)은 다양한 장치들에 대한 표준 인터페이스를 제공하며, create, open, read, write, close 등과 같은 함수를 통해 다양한 장치에 대한 입출력을 처리한다. 이를 통해 같은 코드가 다양한 장치에서 동작할 수 있다. 또한, I/O 서브시스템은 디바이스 드라이버와의 협력을 위한 프레임워크를 제공하여 장치별로 특정한 동작을 수행할 수 있게 한다. 디바이스 드라이버는 커널 내에서 디바이스 하드웨어와 직접 상호작용하는 장치별 코드이다.

A kernel I/O structure

 I/O 스케줄링(I/O Scheduling)은 I/O 요청을 재배열하여 I/O 성능을 향상시키는 기능을 말한다. 예를 들어, 디스크 I/O 스케줄링에서는 SSTF, SCAN, C-SCAN 등의 알고리즘을 사용한다.
 버퍼링(Buffering)은 장치 간 전송 중에 데이터를 메모리에 저장하는 것을 의미한다. 이는 장치 간의 속도 불일치나 전송 크기 불일치에 대처하기 위해 사용된다. 캐싱(Caching)은 데이터의 사본을 빠른 메모리에 보관하여 I/O 성능을 향상시키는 역할을 한다.

 스풀링(Spooling)은 데이터를 병렬적으로 처리할 수 없는 장치를 위해 출력을 보류하는 기능이다. 프린터가 이에 해당합니다.

A blocking read request example


핵심

  • 장치와 메모리 사이의 데이터 이동은 프로그래밍된 I/O로 CPU에 의해 수행되거나 DMA 컨트롤러로 오프로드된다.
  • OS는 인터럽트 및 폴링을 통해 I/O 장치가 작업을 완료한 시점을 안다.
  • 응용 프로그램 인터페이스의 경우 I/O 장치는 블록 장치, 문자 장치 및 네트워크 장치로 나눌 수 있다.
  • I/O 하위 시스템은 장치 드라이버와 협력하기 위한 프레임워크뿐만 아니라 다른 장치에 대한 표준 인터페이스를 제공한다.
  • I/O 하위 시스템은 I/O 스케줄링, 버퍼링, 캐싱 및 스풀링과 같은 다양한 서비스도 제공한다.
반응형

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

OS 14. File System Implementation  (1) 2023.05.19
OS 13. File System Interface  (0) 2023.05.19
OS 11. Mass-Storage Structure  (0) 2023.05.18
OS 10. Virtual Memory  (0) 2023.05.18
OS 9. Main Memory  (0) 2023.05.18

댓글