SW Engineering/OS Concept

58_응용 입/출력 인터페이스 (Application I/O Interface)

SungWookKang 2015. 7. 16. 14:23
반응형

58_응용 입/출력 인터페이스 (Application I/O Interface)

 

입/출력 장치들이 일관된 방법으로 다루어 질 수 있도록 운영체제가 인터페이스를 구성하는 기술을 설명 한다. 공통적인 특징을 가진 입/출력 장치들의 표준 함수를 인터페이스(interface)라 한다. 장치 드라이버(device driver)라 불리는 커널 내의 모듈들은 각 입/출력 장치를 위한 구체적인 코딩을 제공하여 바로 위에서 정의한 "인터페이스"의 표준 함수들을 내부적으로 수행한다.

 

장치 드라이버(device driver) 계층의 목적은 여러 입/출력 하드웨어 차이를 숨기고 이들을 간단한 표준 인터페이스들로 보이도록 포장시켜서 이것을 상위의 커널 입/출력 서브시스템에 제공하는 것이다. 이렇게 되면 입/출력 서브시스템은 하드웨어와 독립적이 되어서 운영체제 개발자의 작업을 간단하게 해준다.

 

한 가지 문제점은 운영체제마다 장치 드라이버 인터페이스에 대한 규격이 다르다는 것이다. 따라서 새로운 장치를 위한 드라이버가 함께 제공되어야 한다.

 

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

 

[블록 장치와 문자 장치(Block and Character Device)]

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

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

 

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

 

 

[네트워크 장치(Network Device)]

네트워크 인터페이스는 소켓(socket)인터페이스 이다. 원격지의 응용 프로그램이 이 소켓으로 접속을 완료하였는지 알아보고 연결이 되었으면 패킷(packet)을 주고 받도록 해 준다.

 

 

[클록과 타이머(Clock and Timer)]

대부분의 컴퓨터들은 하드웨어 클록과 타이머를 가지고 세 가지 기본적인 기능들을 제공한다.

  • 현재 시간을 제공
  • 경과된 시간을 제공
  • T 시각이 되면 X 오퍼레이션을 실행

 

이것은 어느 시간만큼 경과되면 인터럽트를 발생 시키도록 설정 할 수 있으며 이 과정을 한 번 또는 주기적으로 인터럽트를 발생하도록 설정 할 수 있다.

 

이 메커니즘은 스케줄러가 시간이 종료되면 현재 진행중인 프로세스로부터 CPU를 빼앗기 위해 사용되며 디스크 입/출력 서브시스템이 변경된 캐시 버퍼(dirty cache buffer)를 주기적으로 디스크에 쏟아내는 (flushing)데 사용되고 네트워크 서브시스템이 네트워크 혼잡이나 오류로 인해 어떤 작업을 취소하는데도 사용된다.

 

운영체제는 가상 클록을 흉내냄으로써 타이머 하드웨어 채널 수보다 더 많은 타이머 관련 요청들을 지원할 수도 있다. 하드웨어 클록의 틱에 의해 생성되는 인터럽트율은 초당 18~60틱 사이다. 간격이 촘촘하지 못한 이유는 타이머 하드웨어 자체에도 이유가 있지만 정밀하기 위한 가상 클록을 유지하는데 오버헤드가 매우 크기 때문이다.

 

따라서 대부분의 컴퓨터는 클록을 카운터로 구현한다. 카운터 값은 레지스터로부터 읽을 수 있도록 하여 정밀도를 높인다.

 

 

[봉쇄형과 비봉쇄형 입/출력(blocking and Nonblocking I/O)]

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

 

비봉쇄형 시스템 호출의 대안으로 비동기식(asynchronous)시스템 호출이 있다. 비동기식 호출도 비봉쇄형과 같이 즉각 복귀 한다.

 

 

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

 

반응형