[CS] 다양한 입출력 방법

정은아·2024년 1월 15일
post-thumbnail

💡 가장 보편적인 입출력 방법인 프로그램 입출력과 인터럽트 기반 입출력, DMA 입출력에 대해 알아보자!

프로그램 입출력

  • 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법이다.
  • CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 입출력장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.

그런데 CPU는 입출력장치들의 주소를 어떻게 아는걸까?
명령어들이 어떻게 명령어로 표현되고, 메모리에 어떻게 저장되는 걸까?
✔️ 메모리 맵 입출력, 고립형 입출력 방식이 있다!

메모리 맵 입출력(memory-mapped I/O)

  • 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 같은 주소 공간을 사용하는 방법.
  • 일부는 메모리를 위한 주소 공간으로 할당하고 다른 일부는 입출력장치를 위한 주소 공간을 할당하여 하나의 주소 공간으로 메모리와 입출력장치를 접근하는 것이 가능하다.
  • 하나의 메모리 공간에 있기 때문에 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어가 같다.

고립형 입출력(isolated I/O)

  • 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리하는 방법이다.
    고립형 입출력은 입출력장치 읽기/쓰기와 메모리 읽기/쓰기가 나누어져 각자 별도의 제어 버스를 사용한다.
  • 메모리 맵 입출력 방식에 비해 메모리 주소 공간이 확보된다.
  • 서로 다른 주소 공간을 활용하기 때문에 입출력장치 전용 명령어를 사용해야 한다.


인터럽트 기반 입출력

  • 입출력장치의 작업 시작, 작업 종료 등 인터럽트 발생을 통해 입출력을 하는 방식이다.
  • 이 때 입출력장치에 대한 인터럽트는 장치 컨트롤러에서 발생한다.
  • 장치 컨트롤러는 인터럽트 요청 신호를 CPU에 전송하고, CPU는 작업 중이던 일을 백업하고 인터럽트 서비스 루틴을 실행한다.

여러 입출력장치에서 인터럽트가 발생한 경우 처리 방법

1. 인터럽트 발생 순서대로 인터럽트를 처리

  • 단점 : 인터럽트 중 더 빨리 처리해야 하는 경우에 반영이 어렵다.

2. 우선순위가 높은 인터럽트 순으로 다중 인터럽트를 처리

  • 플래그 레지스터 속 인터럽트 비트가 활성화 되어있는 경우, 혹은 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI(Non-Maskable Interrupt)가 발생한 경우 CPU는 우선순위가 높은 인터럽트부터 처리한다.
  • 프로그래머블 인터럽트 컨트롤러(PIC, Programmable Interrupt Controller)라는 하드웨어를 사용한다.
  • 여러 장치 컨트롤러에 연결돼 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청의 우선순위를 판별한다.
  • PIC는 여러 핀들을 가지고 있고, 각 핀은 하드웨어와 연결돼 있어 각 하드웨어를 통제한다.

✔️ PIC 다중 인터럽트 처리 과정

    1. PIC가 장치 컨트롤러에서 인터럽트 요청 신호들을 받아들인다.
    1. PIC는 인터럽트 우선순위를 판단하고, CPU에 처리해야 할 인터럽트 요청 신호를 보낸다.
    1. CPU는 PIC에 인터럽트 확인 신호를 보낸다.
    1. PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보낸다.
    1. CPU는 인터럽트 벡터를 통해 인터럽트 요청을 한 하드웨어를 알고, 해당 장치의 인터럽트 서비스 루틴을 실행한다.

✔️ 조금 더 알아보기

  • 일반적으로 많은 입출력장치의 인터럽트를 관리하기 위해 두 개 이상의 PIC를 계층적으로 구성한다.
  • PIC는 가장 높은 우선순위(무시할 수 없는)인 NMI의 우선순위는 판별하지 않는다.
  • 가장 높은 우선순위이기 때문에 판별할 필요가 없다.
  • PIC는 인터럽트 비트를 통해 막을 수 있는 하드웨어 인터럽트들의 우선순위만을 조정해준다.


DMA(Direct Memory Access) 입출력 과정

  • DMA 컨트롤러를 통해 CPU를 거치지 않고 상호작용할 수 있는 입출력 방식이다.

DMA 입출력 과정

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

💡 CPU 입장에서는 마치 버스에접근하는 주기를 도둑 맞는 기분이 든다.
그래서 이러한 DMA의 시스템 버스 이용을 사이클 스틸링(Cycle Stealing)이라고 한다.

입출력 버스

  • DMA를 위해 시스템 버스를 너무 자주 사용하면 그만큼 CPU가 시스템 버스를 이용하지 못하게 되므로, 해결하기 위해 나온 개념이 바로 입출력버스이다.
  • 장치 컨트롤러들이 시스템 버스가 아닌 입출력 버스로 DMA 컨트롤러에 연결된다면 DMA 컨트롤러와 장치 컨트롤러가 서로 데이터를 전송할 때는 시스템 버스를 이용할 필요가 없어지므로 시스템 버스의 사용 빈도를 줄일 수 있다.
  • 입출력장치를 컴퓨터 내부와 연결 짓는 통로라고도 볼 수 있다.
  • 입출력 버스에는 PCI(Peripheral Component Interconnect) 버스, PCI Express(PCIe) 버스 등이 있다.
  • 최근에는 입출력 전용 CPU(입출력 프로세서 / 입출력 채널)가 탑재된 입출력장치들이 출시되어 판매되고 있다.
profile
꾸준함의 가치를 믿는 개발자

0개의 댓글