[운영체제] DMA(Direct Memory Access) & 입출력 처리 방식

[운영체제] DMA(Direct Memory Access) & 입출력 처리 방식

CPU를 대신하여 I/O장치와 Memory사이의 데이터전송을 담당하는 장치를 지칭
CPU의 개입 없이 주변장치(입출력장치)와 주기억장치와의 데이터 전송이 이루어지는 방법을 통칭

CPU와 주기억장치만이 시스템 버스에 접근할 수 있고 입출력장치는 DMA와 같은 입출력 제어기에 의해 시스템 버스에 접근할 수 있다.

DMA(Direct Memory Access)의 특징

  • CPU의 개입 없이 주변장치와 주기억장치와의 데이터 직접 전송
  • 프로그램 수행 중 입출력을 위한 인터럽트의 발생 횟수를 최소화하여 컴퓨터 시스템의 효율을 높임
  • CPU는 DMA와 상태정보 및 제어정보만을 주고 받음
  • 속도가 빠른 디스크, 테이프 등에 사용됨
  • DMA는 기억장치 접근을 위해 CPU의 시스템 버스 사용권을 일시적으로 뺏는 사이클 스틸링(Cycle Stealing)을 수행한다. 시스템 버스에 대해 CPU보다 DMA의 우선순위가 높다.
  • DMA제어기와 CPU가 시스템 버스를 공유한다.
실제 CPU가 Control하는 건 DMAC (DMA Controller)를 Control 해주는 과정을 의미합니다.


입출력 처리 방식의 종류

빠른 순위 
  1. 채널에 의한 I/O
  2. 메모리 직접 접근 I/O(DMA)
  3. 인터럽트 처리에 의한 I/O
  4. 프로그램에 의한 I/O

프로그램에 의한 I/O

  • CPU상에서 실행되는 프로그램에 의해 입출력이 직접 제어
  • CPU는 입출력 장치에 명령을 보낸 후 동작이 완료될 때까지 대기
  • CPU는 주기적으로 주변장치의 상태를 반복적으로 검사, 폴링 방식
  • CPU는 자원낭비 발생

인터럽트 처리에 의한 I/O

  • 입출력 인터페이스가 주변장치의 상태를 검사하여 준비상태가 되면 인터럽트 신호를 발생하여 입출력 처리를 요구하는 방식
  • CPU는 그전에 수행되던 프로그램의 상태를 스택에 저장한 후 Context Switching과정을 통해 인터럽트 서비스 프로그램 수행
  • 주변장치에 명령을 보낸 후 주변장치로부터 결과가 올 때까지 CPU는 다른 작업을 수행할 수 있으므로 효율성 증가
  • 프로그램에 의한 I/O 문제점 개선
  • 순서
    1. 프로세서(CPU)가 I/O 모듈로 읽기 명령을 보낸다.
    2. I/O 모듈은 주변장치로부터 데이터를 읽는다. 그 동안 프로세서는 다른 일을 수행한다.
    3. 읽기 작업이 다 수행되면 I/O 모듈이 프로세서(CPU)로 인터럽트 신호를 보낸다.
    4. 프로세서가 데이터를 요구한다.
    5. I/O 모듈이 프로세서(CPU)에게 데이터를 전송한다.
      결국 읽기 작업 데이터는 프로세서가 주기억장치에 저장한다.

메모리 직접 접근 I/O(DMA)

  • 인터럽트 방식이 프로그램에 의한 입출력 방식보다는 효율적이지만 입출력을 위한 상태정보, 제어정보, 데이터 전송을 위해서는 여전히 CPU의 능동적인 개입이 요구됨
  • CPU는 상태정보, 제어정보만을 교환하게 하고 데이터 전송은 주변장치와 주기억장치간에 직접 교환하게 하는 방식이 더 효율적
  • DMA를 사용하기 위해서는 시스템 버스상에 모듈이 하나 추가
  • DMA모듈은 CPU를 통하지 않고 한번에 한 단어씩 직접 기억장치로부터 모든 데이터 블록을 전송
  • 전송이 완료되면 DMA모듈은 CPU에게 인터럽트 신호를 보내고 CPU는 전송의 시작과 끝 부분에만 관여

채널에 의한 I/O

  • DMA 개념을 확장하여 구현한 입출력만을 위한 전용처리장치
  • CPU처럼 독자적으로 주기억장치에 저장된 명령어를 처리할 수 있는 능력
  • 입출력 채널은 CPU의 개입없이 입출력 처리를 수행
  • 두가지 종류의 채널
    • 선택채널(Selector Channel) : 한 번에 하나의 입출력 장치 제어
    • 다중화채널(Multiplexor Channel) : 한 번에 여러 장치에 대한 입출력 제어, 저속장치에는 바이트 다중화 채널, 고속 장치에는 블록 다중화 채널

댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?