221205 TIL

apwierk·2022년 12월 5일
0

TIL

목록 보기
31/33

입출력장치

장치 컨트롤러와 장치 드라이버

장치 컨트롤러

CPU, 메모리보다 다루기 까다롭다.
종류가 너무 많고, 데이터 전송률이 일반적으로 CPU, 메모리는 높지만 입출력 장치는 낮다.
즉, 1초에 100마디 하는 사람과 1초에 1마디 하는 사람은 대화하기 힘들다는 것과 비슷하다.
이와 같은 이유로 입출력장치는 컴퓨터와 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결된다.

장치 컨트롤러 역할

  • CPU와 입출력장치 간의 통신 중개
  • 오류 검출
  • 데이터 버퍼링

    버퍼링이란?
    전송률이 높은 장치와 낮은 자치 사이에 주고받는 데이터를 버퍼라고 하는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법. 쉽게 마해 버퍼링은 '버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 보내는 방법' 이라고 보면 된다.

장치 컨트롤러 내부는 복잡하지만, 여기서 알아야 할 부분은 데이터 레지스터, 상태 레지스터, 제어 레지스터 세 가지이다.

  • 데이터 레지스터
    : CPU와 입출력장치 사이에 주고 받을 데이터가 담기는 레지스터
  • 상태 레지스터
    : 입출력장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 입출력장치에 오류가 없는지 등의 상태 정보가 저장된다.
  • 제어 레지스터
    : 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.

장치 드라이버

: 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램

장치 드라이버를 인식하고 실행하는 주체는 운영체제이다

핵심포인트

  • 입출력장치는 장치 컨트롤러를 토앻 컴퓨터 내부와 정보를 주고받는다.
  • 장치 드라이버는 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.

다양한 입출력 방법

프로그램 입출력, 입터럽트 기반 입출력, DMA 입출력 세 가지 방법이 있다.

프로그램 입출력

: 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법
플그램 입출력 방식에서의 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어진다.
이 과정에서 CPU는 장치 컨트롤러의 레지스터 주소를 어떻게 알까?
메모리 맵 입출력, 고립형 입출력 두 가지 방법이 있다.

메모리 맵 입출력

:메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로
간주하는 방법이다.

고립형 입출력

: 메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법

메모리 맵 입출력고립형 입출력
메모리와 입출력장치는 같은 주소 공간 사용메모리와 입출력장치는 분리된 주소 공간 사용
메모리 주소 공간이 축소됨메모리 주소 공간이 축소되지 않음
메모리와 입출력장치에 같은 명령어 사용 가능입출력 전용 명령어 사용

인터럽트 기반 입출력

: 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 이터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다.

폴링
인터럽트와 자주 비교되는 개념 중 폴링이라는 개념이 있다. 앞서 프로그램 입출력은 'CPU는 주기적으로 장치 컨트롤러의 상태 레지스터를 확인하며 입출력장치의 상태를 확인한다'라는 방식이다. 이처럼 폴링이란 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식이다.
폴링 방식은 이터럽트 방식보다 당연히 부담이 크다. 인터럽트를 활용하면 CPU가 인터럽트 요청을 받을 때까지 온전히 다른 일에 집중할 수 있기 때문이다.

CPU가 플래그 레지스터 속 인터럽트 비트를 활성화한 채 인터럽트를 처리하는 경우 다른 입출력장치에 의환 하드웨어 인터럽트를 받아들이지 않기 때문에 CPU는 순차적으로 하드웨어 인터럽트를 처리한다.
이와 같이 플래그 레지스터 속 인터럽트 비트를 활성화한 경우, 혹은 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI(NonMaskable Interrupt)가 발생한 경우 CPU는 이렇게 우선순위가 높은 인터럽트부터 처리한다.

처리 방법 중 대부분 프로그래머블 인터럽트 컨트롤러(PIC)를 사용한다.
PIC는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판벌한 뒤 CPU에 지금 처리해야 할 하드웨어 인터럽트는 무엇인지를 알려주는 장치이다.

  1. PIC가 장치 컨트롤러에서 인터럽트 요청 신호를 받아들인다.
  2. PIC는 인터럽트 우선 순위를 반단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 보낸다.
  3. CPU는 PIC에 인터럽트 확인 시노를 보낸다.
  4. PIC는 데이터 버스롤 토앻 CPU에 인터럽트 벡터를 보낸다.
  5. CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고, 해당 장치의 인터럽트 서비스 루티을 실행한다.

DMA 입출력

위 프로그램 기반 입출력과 인터럽트 기반 입출력은 공통점이 있다면 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 반드시 CPU를 거친다는 점이다.
CPU를 거쳐야한다면 연산때문에 시간이 뺏기게 되고, 하드 디스크 백업과 같이 대용량 데이터를 옮길 때는 CPU부담이 커진다. 그래서 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식인 DMA(Direct Memory Access)가 등장하였다. 이름 그대로 직접 메모리에 접근할 수 있는 입출력 기능이다. DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라른 하드웨어가 필요하다.

DMA 입출력 과정

  1. CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령한다.
  2. DMA컨트롤러는 CPU대신 장치 컨트롤러와 상호작용하면 입출력 작업을 수행한다. 이 때 DMA컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 쓴다.
  3. 입출력 작업이 끝나면 DMA컨트롤러는 CPu에 인터럽트를 걸어 작업이 끝났음을 알린다.

입출력 버스

DMA를 위해 시스템 버스를 너무 자주 사용하면 그만큼 CPU가 시스템 버스를 이용하지 못한다. 이 문제는 DMA컨트롤러와 장치 컨트롤러들을 입출력 버스라는 별도의 버스에 연결하여 해결할 수 있다.

핵심 포인트

  • 프로그램 입출력은 프로그램 속 명령어로 입출력 작업을 하는 방식이다.
  • 메모리 앱 입출력은 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 입출력 방식이다.
  • 고립형 입출력은 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 별도로 분리하는 방식이다.
  • 인터럽트 기반 입출력은 인터럽트로써 입출력을 수행하는 방법이다.
  • DMA 입출력은 CPU를 거치지 않고 메모리와 입출력장치 간의 데이터를 주고받는 입출력방식이다.
  • 입출력 버스는 입출력장치와 컴퓨터 내부를 연결 짓는 통로로, 입출력 작업 과정에서 시스템 버스 사용 횟수를 줄여준다.
profile
iOS 꿈나무 개발자

0개의 댓글