OS - (11) I/O System

정선용·2022년 5월 20일
0

Operating System

목록 보기
11/12

I/O System

운영체제의 주요 동작은 computing(연산) / IO(입출력) 두가지이다. OS는 I/O에대한 수행과 물리 입출력 장치(HW)를 관리하고 컨트롤함.
I/O는 HW를통한 입출력정보를 OS상에서 구동중인 application에서 control하고자할 때 사용하는 일종의 interface. I/O system call은 물리적 장치와 사용자 ㅍ로세스간 많은 소프트웨어 계층을 오가므로 CPU비용이 비싼편. (kernel protection boundary 경계를 오가며 발생하는 컨텍스트 스위칭이나 I/O 장치를 서비스하기 위한 시그널링이나 인터럽트 핸들링, 커널 버퍼와 사용자 프로세스간의 데이터 복사 과정에서의 CPU나 메모리 시스템의 부하로부터 발생하는 일종의 오버헤드)

  • 입출력 처리 과정
  1. 사용자 프로세스는 열고있던 파일의 file descriptor를 통해 blocking 함수인 read(), 시스템콜 호출함.
  2. 커널 내부 system call 코드에서 만약 파라미터가 입력값이고, 데이터가 버퍼 캐시에 존재한다면 곧바로 I/O요청을 완료한다.
  3. 버퍼 캐시에 데이터가 없는 상태라면 물리적 I/O가 수행된다. 사용자는 시스템콜을 요청하고 프로세스는 실행큐(run queue)에서 대기큐(wait queue)로 옮겨진다. 그리고 시스템콜에 의한 I/O작업요청이 스케줄링됨. -> I/O subsystem이 요청을 디바이스 드라이버로 전달하고,
  4. 디바이스 드라이버는 커널 버퍼 공간을 할당받아 데이터를 수신할 준비를 하고 I/O스케줄을 처리한다. (device dricer도 device control register를 통해 디바이스 컨트롤러에게 실제 커맨드 전달)
  5. 디바이스 컨트롤러는 데이터 전송을 수행하기 위해 device HW를 동작시킨다. : 여기까지가 사용자 프로세스에서 I/O요청이 실제 HW까지 도달 과정
  6. DMA컨트롤러가 전송과정 관리 가정했을 떄, 인터럽트 벡터 테이블을 참조하여 해당 인터럽트 신호가 적절한 인터럽트 핸들러에게 전달되고, 해당 인터럽트 핸들러는 필요한 모든 정보를 저장하고 디바이스 드라이버로 신호를 전달.
  7. 디바이스 드라이버가 완료된 I/O 요청 상태를 결정, 커널 I/O subsystem에 전달된 요청 정보 처리가 완료되었다고 알려줌.
  8. 커널은 디바이스 드라이버로부터 전달받은 데이터를 전송하고, 사용자 프로세스의 주소 공간에 코드를 반환. 사용자 프로세스는 wait queue에서 ready queue로 이동.
  9. 사용자 프로세스를 ready queue로 이동시켜 사용자 프로세스 blocking해제. 스케줄러는 사용자 프로세스를 다시 CPU에 할당하고 시스템 콜이 완료되는 시점에 사용자 프로세스 실행상태(running state)로 재개.

I/O Hardware

I/O device : 입출력장치.

  • 기본개념
    • Port : sw 포트번호와 연결됨.
    • Bus : I/O디바이스끼리 연결 도와줌
    • Controller : I/O장치 제어, 타이밍 조절

typical 구조는 데이터를 주고받을 때 디바이스 안에 내장되어있는 컨트롤러를 통해 디바이스를 제어하고 PCI bus를 통해 전송한다.

Direct I/O : 메인메모리 주소체계에 속하지 않는 주소체계인 I/O port number를 사용하여 할당.
Memory-Mapped I/O : Direct I/O와 반대, 메인메모리 주소체계와 I/O device 주소체계를 하나로 통합해서 같이 사용 .주소값 자체로 메인메모리 주소인지 I/O주소인지 구분이 가능하다는 장점. (일반 명령어를 사용해 I/O접근)

  • Polling vs Interrupt
    • Polling I/O : I/O 디바이스에 변화가 있는지 지속적으로 감시하는 방식. CPU와 I/O컨트롤러의 작업이 끝났는지 주기적으로 loop를 돌면서 전달을 반복한다. 반복적으로 진행되므로 비효율적이다. (interrupt가 좋음, 네트워크 장치에서 많이 사용)
    • Intterupt I/O : HW 컨트롤러가 자신의 상태가 바뀔 때 마다 CPU에게 통보하는 방식. 단점으로는 높은 처리량을 요구하는 I/O장치에서는 overhead큼. 키보드,마우스 등 대기시간이 긴 장치에 대해서는 interrupt방식 사용.
  • DMA : Direct Memory Access
    CPU에서 발생하는 단순 데이터 복사 작업을 줄이기 위함.
    디스크가 데이터를 읽어서 가져다 놓을 때 CPU가 계속해서 중재하게되면 CPU가 하는 일이 많아지므로 디스크 컨트롤러가 직접 메모리에 올려놓는 방식. I/O device가 직접 메모리 접근해 데이터를 올려놓고 받아옴. CPU개입 없이 주변장치에 데이터 직접전송이 가능한 장점이 있고 interrupt 발생횟수를 줄일 수 있다.

Application I/O Interface

동일 기기를 묶어서 동일하게 하드웨어를 수행할 수 있도록 명령어를 System Call을 통해서 내린다. : 입출력장치들이 일관된 방법으로 다루어질 수 있도록 운영체제가 인터페이스를 구성.
인터페이스란 공통적 특징을 가진 것들의 표준.
운영체제는 공통 특징을 가진 IO장치들의 표준 함수를 만들어 제공한다. (장치 드라이버라는 커널 내 모듈이 I/O장치를위한 표준함수들을 내부적으로 수행함)

  • 순차 접근과 임의 접근(Sequential or random access) : 순차 장치는 순차적 순서로만 자료를 전송하지만 임의 접근 장치는 임의의 위치에 있는 자료도 입/출력 할 수 있다.
  • 동기식과 비동기식 (Synchronous or asynchronous) : 동기식 장치는 일정한 응답 시간을 갖지만 비동기식 장치는 응답 시간이 예측 불가능 하다.
  • 공유와 전용 (Sharable or dedicated) : 공유 가능한 장치는 몇 개의 프로세스나 쓰레드에 의해 동시에 사용될 수 있으나 전용 장치는 혼자만 사용해야 한다.
  • 읽기/쓰기, 읽기 전용, 쓰기 전용 : 일부 장치들은 읽기와 쓰기를 모두 수행하지만 어떤 것들은 하나만 지원한다.
  • 문자 스트림과 블록(Character stream or block) : 문자 스트림 장치는 바이트를 하나씩 전송(read,write..)하지만 블록 장치는 블록 단위로 전송(get,put..) 한다.

    블록 장치 인터페이스는 디스크나 이와 유사한 블록 지향(block oriented)장치를 사용하기 위해 필요한 모든 요소들을 제공하고 있다. 운영체제나 데이터베이스는 블록 장치를 마치 선형 배열(linear array)이라고 이해하고 사용하기를 원할 것이다. 이러한 접근 모드를 비가공 입/출력(raw I/O)라 불린다.

    만약 응용프로그램이 자체 버퍼링을 수행 한다면 파일 시스템은 불필요하고 중복된 버퍼링을 하게 될 것이다. 또한 응용프로그램이 파일의 블록이나 일부에 대한 자체 잠금 기능을 제공한다면 운영체제의 잠금 기능은 최소한 중복된 기능이고 최악의 경우에는 모순이 발생 할 수도 있다. 이러한 충돌을 피하기 위해 비가공 장치(raw device)의 접근은 장치의 제어권을 집적 응용프로그램에 일임하고 운영체제는 한발 물러나야 한다. 이에 대한 절충안으로 운영체제가 버퍼링과 잠금을 하지 않는 모드로 파일에 대한 입/출력 작업을 하는 것이다. UNIX에서는 이러한 방식을 직접 입/출력(direct I/O)이라고 한다.

    메모리 매핑(memory mapped) 파일 접근은 블록 장치 위의 계층으로 구현할 수 있다. 메모리 매핑 파일 접근이란 실제로 장치를 읽거나 쓰는 명령을 사용하는 대신 메모리의 특정 번지를 읽거나 쓰는 명령으로 파일 입/출력을 대신하는 방식이다. 키보드는 문자 스트림(character stream) 인터페이스를 통해 접근되는 장치의 예이다.

  • Clocks and timers
    대부분의 컴퓨터는 클록을 카운터로 구현한다. 카운터 값은 레지스터로부터 읽을 수 있도록 하여 정밀도를 높인다. 컴퓨터를 끄더라도 시간은 지속적으로 카운트되며 현재시간을 유지.
    timer는 RR등으로 정해진 타임퀀텀만큼 지속적으로 인터럽트를 거는 것.

  • blocking and Nonblocking I/O

    • Blocking : 입/출력이 즉시 완료 될 수 없을 경우 응용프로그램은 blocking. 즉 실행 큐로부터 대기 큐로 옮겨진다. 이후 수행 될 때 대기 큐에서 실행 큐로 옮겨지며 응용 프로그램은 입/출력 시스템 호출이 되돌려준 값을 받아 사용하게 된다.
    • Non-blockng : 연산과 입/출력간의 중첩을 최대한 도모하기 위해 다중 스레드 방식으로 작성한다. 예를 들면 연산(렌더링)을 하는 동안 입출력 작업(마우스 움직임 등)을 할 수 있다. 프로그램을 멈춰두지 않고 곧장 돌아오며 몇 개의 바이트가 전송되었는지를 알려주는 복귀값을 되돌려 준다.
      Non-Blocking 시스템 호출의 대안으로 비동기식(asynchronous)시스템 호출이 있다.
profile
정선용

0개의 댓글