I/O Systems

k_bell·2024년 6월 16일
0

운영체제

목록 보기
15/15
post-thumbnail

I/O 장치에는 HDD, SSD, 프린터, 네트워크 카드 등이 포함된다. 이러한 I/O 장치들은 사용자의 요청에 따라 여러 입출력이 발생하는데, 이는 많은 단계를 거쳐야 하는 과정이기 때문에 CPU 입장에서 제법 부하가 높은 작업이다. 따라서 OS는 I/O system을 관리하여 데이터 전송을 효율적으로 수행할 수 있도록 한다.

운영체제가 I/O 시스템을 관리하고 하드웨어 구성요소와 상호작용하는 법을 알기 위해 다음의 주요 구성요소에 대해서 먼저 살펴보도록 하자.

  • Port
    : 포트는 컴퓨터 시스템과 외부 장치가 신호를 주고받는 연결 지점이다. 포트를 통해 OS가 I/O 디바이스들과 데이터를 주고받을 수 있다.

  • Bus
    : 버스는 컴퓨터 시스템 내에서 데이터 신호를 주고받는 통로이다. 여러 디바이스들이 동일한 버스를 통해 연결되어 데이터를 주고받을 수 있다. 버스의 종류에는 PCI, PCIe, Expansion, Serial-Attached SCSI (SAS) 등이 있다.

  • PCI (Peripheral Component Interconnect) : 주로 내부 장치와 컴퓨터 시스템을 연결하는 데 사용된다. 다양한 확장 카드(그래픽 카드, 네트워크 카드 등)를 연결할 수 있다.
  • PCIe (PCI Express) : PCI의 향상된 버전으로, 데이터 전송 속도가 빠르고 확장성이 좋습니다.
  • Expansion Bus : 시스템의 기능을 확장하기 위해 사용된다. 다양한 확장 카드와 연결할 수 있다.
  • SAS (Serial-Attached SCSI) : 고속 데이터 전송을 위해 사용되며, 주로 서버와 스토리지 장치를 연결하는 데 사용된다.
  • Controller
    : 컨트롤러는 버스, 포트, 디바이스를 제어하는 전자 장치이다. Host adapter 라고도 하며, OS와 하드웨어 장치 간의 인터페이스 역할을 한다.

Special Register

I/O controller에 존재하는 special register 는 I/O 디바이스에 대한 명령어, 상태 정보, 데이터 등을 저장한다. 따라서 OS의 디바이스 드라이버가 I/O 디바이스에 대한 명령을 실행할 때, 다음과 같은 과정을 수행한다.

  • 1. Device Driver
    : 특정 디바이스와의 통신을 담당하는 소프트웨어이다. 각 I/O 디바이스마다 고유의 드라이버가 존재한다.

  • 2. I/O 명령 실행
    : OS는 필요한 데이터를 디바이스 드라이버를 통해 디바이스에 전달한다. 이후 명령어와 데이터를 해당 스페셜 레지스터에 기록한다.

  • 3. 장치 상태 확인
    : status 레지스터를 통해 장치의 현재 상태를 확인한다. 오류 발생 및 작업 완료 여부 등의 정보를 얻는다.

  • 4. 데이터 전송
    : I/O 레지스터를 통해 실제 데이터 전송이 이루어진다. 예를 들어, 데이터 입력 레지스터에서 데이터를 읽어오거나, 데이터 출력 레지스터에 데이터를 기록하는 등의 작업을 수행한다.

  • 5. 제어 신호 전송
    : Command 레지스터를 통해 장치에 특정 작업을 지시한다. 예를 들어, 프린터에 인쇄 작업을 시작하라는 명령을 내리거나, 네트워크 카드에 데이터 전송을 시작하라는 명령을 내릴 수 있다.

Port-mapped I/O vs Memory-mapped I/O

OS에서 I/O 디바이스와 통신하기 위해 디바이스에 주소를 할당하는 방법에는 두 가지가 있다. 바로 port-mapped I/O 와 memory-mapped I/O 이다.

  • Port-mapped I/O
    : 각각의 I/O 장치에 서로 다른 port 주소를 할당하는 방법이다. 특별한 I/O instruction을 사용하여 포트에 명령을 전달하는 형태이다. 아래에서 설명할 memory-mapped와는 다르게 메모리와 독립된 공간을 사용하기 때문에 메모리 공간이 충돌하지는 않지만, 속도가 느리다.

  • Memory-mapped I/O
    : I/O 디바이스의 레지스터에 메모리 주소를 할당하여, 메모리에 접근하는 것처럼 I/O 디바이스에 접근하는 방법이다. 여기서 중요한 것은 실제 메모리에 접근하는 것이 아니라는 점이다. 디바이스 레지스터에게 메모리 주소를 부여하는 것은 맞지만, 레지스터가 실제로 메모리에 할당되는 것은 아니다. 여전히 레지스터는 I/O 디바이스 안에 존재하며, I/O 레지스터에게 부여된 메모리로 접근하면, 메모리가 아닌 해당 I/O 레지스터로 매핑되도록 구현한 것이다.

실제 메모리에 할당되는 것이 아니다!!!

Polling & Interrupt

CPU와 I/O 디바이스 간의 데이터 전송 과정에서 pollinginterrupt 개념이 등장한다. 전송 과정을 살펴보면서 두 개념에 대해 알아보자.

  1. 디바이스 드라이버는 해당 I/O 레지스터의 status register의 busy bit 가 0이 될 때까지 상태를 확인한다.
    -> 이때, busy waiting 또는 polling 방식을 통해 busy bit를 읽는다. polling 이란, 일정 주기마다 busy bit를 당겨와 확인하는 방법이다.

  2. 호스트는 read-write 비트를 설정하고, 데이터 레지스터에게 데이터를 전송한다. (write인 경우)

  3. 호스트는 command - ready bit를 설정한다.
    ( I/O 컨트롤러에게 작업이 있음을 알렸다고 표시하는 비트 )

  4. 컨트롤러는 해당 작업을 수행하기 위해 busy bit를 다시 1로 설정하고 작업을 수행한다.

  5. 컨트롤러가 작업을 마치면, 해당 결과를 전송한다.

I/O 디바이스가 CPU와 소통하는 방법은 interrupt이다. CPU는 instruction을 실행할 때마다 interrupt-request line을 감지한다. CPU가 interrupt-request line을 감지하면, interrupt에 해당하는 interrupt handler routine으로 점프한다.

interrupt handler routine은 메모리의 고정된 주소에 저장되어 있다.

Interrupt vector는 interrupt에 해당하는 handler들의 주소를 저장하고 있으며, OS는 interrupt vector에서 적절한 interrupt handler를 찾아 IHR을 수행한다.

해당 글은 interrupt에 대해서 자세히 다루지 않으므로 이 정도만 설명하도록 하겠다.

Direct Memory Access (DMA)

DMA란 I/O 디바이스가 CPU를 거치지 않고 바로 메모리와 데이터를 주고 받을 수 있는 기술을 말한다. DMA controller를 사용하며,하드디스크와 메모리를 직접 연결하여 CPU는 제어신호만 주고받을 뿐 데이터 전송에서 제외시킬 수 있다. 따라서 입출력 시 CPU는 제어를 위해 데이터 전송 시작과 완료에만 할당되어 CPU 자원의 낭비가 제거된다.

디스크에 있는 대용량의 파일을 메인 메모리로 바로 올릴 때 사용하면 유리하다.

IOMMU

Input-Output Memory Management Unit (IOMMU) 란, I/O 디바이스들이 메모리에 접근할 때 메모리의 실제 주소가 아닌 가상 주소를 통해 접근하는데 이 가상 주소들을 실제 주소로 변환시켜 주는 장치이다. 따라서 MMU와 매우 유사하다고 볼 수 있다!

DMA는 IOMMU 없이도 사용 가능한 기술로서, IOMMU의 개입 없이 DMA 컨트롤러를 통해 사용이 가능하다!

Kernel I/O Structure

OS는 다양한 I/O 디바이스들과 상호작용하기 위해, I/O system call 을 사용한다. I/O system call은 디바이스의 다양한 동작들을 generic class들로 캡슐화한다. 예를 들어, read, wirte, open, close 등과 같은 작업을 수행하는 system call이 전부 따로 정의되어 있는 것이다.

Device driver layer 는 OS의 커널과 하드웨어 디바이스 간의 인터페이스 역할을 수행한다. 각 디바이스 드라이버는 특정 디바이스와 상호작용하며, I/O system call에 대한 요청을 처리한다.

Block and Character Devices

특성블록 장치 (Block Devices)문자 장치 (Character Devices)
데이터 접근 단위블록 (block)문자 (character)
주요 명령어read(), write(), seek()get(), put()
예시디스크 드라이브 (HDD, SSD)키보드, 마우스, 시리얼 포트
데이터 접근 방식Raw I/O, Direct I/O, 파일 시스템 접근, 메모리 맵 파일 접근주로 단순 읽기/쓰기, 라인 편집 기능 추가 가능
사용 사례대량 데이터 처리, 파일 시스템 관리사용자 입력 처리, 시리얼 데이터 통신

Nonblocking and Asynchronous I/O

  • Blocking
    : I/O 작업이 완료될 때까지 호출자가 기다리는 방식. 기다리는 동안 다른 작업을 수행하지 않는다.

  • Nonblocking
    : I/O 작업의 완료 여부와 상관없이 바로 결과를 반환받는 방식. 작업이 끝나지 않았어도 결과를 반환받는다.

  • Asynchronous
    : 작업이 시작된 후 완료될 때까지 호출자는 다른 작업을 수행한다. I/O 작업이 완료되면 호출자에게 알림을 보낸다.

I/O Request Life Cycle

0개의 댓글

관련 채용 정보