[OS] I/O system

rg.log·2022년 5월 24일
0
post-thumbnail

I/O system은 다양한 입력(Input)/출력(Output) 장치들의 제어를 위한 시스템이다. processor가 필요한 정보를 요청할 때 해당 데이터는 메인 메모리에 저장되어 있어야 하기 때문에 입출력 장치에서 메인 메모리로 받은 데이터를 프로세서가 가져다 사용하거나, 프로세스가 메인 메모리에 데이터를 쓰면 입출력 장치를 통해 내보내게 된다.

processor 와 I/O device는 H/W 적으로 어떻게 데이터를 주고받을까?

1. Processor가 제어하는 메모리 접근 방법

  • Polling (Programmed I/O)
    Processor가 주기적으로 순환하며 I/O 장치가 전송 준비 중인지 등의 전송 상태를 확인한다. 이는 I/O 장치가 빠르고 데이터 전송이 잦을 때 효율적으로 사용할 수 있는 방법이지만, Processor가 주기적으로 장치들을 확인해야 해서 overhead가 크다. 데이터 전송이 잦을 때는 키보드, 마우스와 같이 자주 입력하는 때를 예로 들 수 있다.
  • Interrupt
    I/O 장치가 작업 완료한 후, 자신의 상태를 Processor에게 쿡 찔러 전달한다. 이것을 Interrupt라고 하는데, Interrupt 발생 시 Processor는 데이터 전송을 수행하면 된다. 이렇게 하면 Polling 방법에 비해 overhead가 적고 불규칙적인 요청을 처리하는데 적합하다.

이들은 Processor에 많은 부분을 의지하고 있어, Processor의 overhead를 줄이고자 하는 방법으로 아래 방법이 나왔다.

2. 직접 메모리 접근 방법 (DMA)

I/O 장치와 memory 사이에 데이터 전송을 Processor 개입 없이 수행하는 방법이다. Processor는 데이터 전송의 시작과 종료만 관여하게 되어 overhead가 줄어든다. 이를 대부분 현재 system에서 사용하고 있다.


1) processor가 전송 방향, 바이트 수, 데이터 블록의 메모리 주소 등을 DMA 제어기에 보낸다.
2) DMA 제어기는 Disk 제어기에 데이터를 메인 메모리로 전송하라 요청한다.
3) Disk 제어기가 메인 메모리에 데이터를 전송한다.
4) 데이터 전송 완료후, Disk 제어기는 DMA 제어기에 완료 메세지를 전달한다.
5) DMA 제어기가 processor에 Interrupt 신호를 보낸다.

위에는 H/W적인 방법이었다면, 이번엔 S/W적인 방법에 대해 알아보자.


커널 안에 있는 커널 입출력 서브시스템에서 I/O Service를 제공한다. I/O 스케줄링, 에러 핸들링, I/O 장치 정보 관리 등이 있다.

  • I/O Scheduling
    입출력 요청에 대한 처리 순서를 결정한다. 잘 결정한다면, 시스템의 전반적 성능은 향상하고 process의 요구에 대한 공평한 처리가 가능하게 된다.

  • Error handling
    디스크에 데이터를 쓰다가 실패하거나, nw를 통해 데이터를 받을 때 오류가 있는 등 입출력 중 발생하는 오류를 처리해 준다.

  • I/O device information managements
    다양한 I/O 장치들의 정보를 관리해 준다.

OS가 I/O service를 효율적으로 하는 방법은?

I/O service를 효율적으로 한다는 것은 즉, I/O의 성능을 향상시킨다는 말이다.

  • Buffering
    I/O 장치와 프로그램 사이에 전송되는 데이터를 Buffer에 임시 저장하고 저장 장치가 커버할 수 있는 만큼의 양을 보내준다. 이는 입력 장치와 저장 장치 간의 전송 속도나 처리 단위 차이 문제를 해결해 줄 수 있다.

  • Caching
    메모리 공간 상 일정 공간을 잡아놓고, 자주 사용하는 데이터를 미리 복사해두어 CPU는 disk까지 가지 않고 데이터를 읽을 수 있어 속도를 향상시킬 수 있다. Cache hit 시 (미리 복사해둔 것을 CPU가 자주 읽으면) disk에 접근하는 I/O를 생략할 수 있는 것이다.

  • Spooling
    한 I/O 장치에 여러 Program이 요청을 보낼 때, 출력이 섞이지 않도록 하는 기법이다. 예를 들어 프린터에 A의 요청, B의 요청, C의 요청이 순차적으로 들어올 때 A의 글이 써지다가, B의 글이 써지는 등 겹쳐지면 안 되기 때문에 각각 Program에 대응하는 disk file에 기록한다. 이를 Spooling이라 하고 Spooling이 완료되면, disk file을 한 번에 하나씩 I/O 장치로 전송한다.

0개의 댓글