개인공부/컴퓨터 구조와 운영체제

[컴퓨터구조와 운영체제] 다양한 입출력 방법

개바리여리 2025. 1. 7. 23:48

 

프로그램 입출력은 프로그램 속 입출력 명령어를 통하여 장치 컨트롤러와 상호작용하며 입출력장치를 제어하는 방법이다.

 

 

ex: 메모리에 저장된 정보를 하디스크에 백업을 한다 -> 하드디스크에 쓰기 작업이 이루어진다.

 

1. CPU는 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 보낸다.

 

2. 하드 디스크 컨트롤러는 하드 디스크의 상태를 확인한다.  -> 상태 레지스터에 준비 완료를 표시한다. 

3. CPU는 상태 레지스터를 주기적으로 확인하고 준비가 되었다면 메모리의 정보를 데이터 레지스터에 적재한다.

백업작업이 끝날때까지 위에 과정을 반복하게 된다.

 

 

 

* CPU는 어떻게 다양한 종류의 장치 컨트롤러의 레지스터들을 인지하고 소통하는 것일까?

 

프로그램 입출력 방식(CPU가 장치컨트롤러의 레지스터값을 인식하는 방법)에는 두가지 방식이 있다.

  • 메모리 맵 입출력 
  • 고립형 입출력

 

 

메모리 맵 입출력

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

 

메모리의 모든 공간은 메모리를 위한 공간만으로 사용하지 않는다.

입출력 공간에 각 번지에 각 장치컨트롤러의 레지스터들을 등록한다.

EX : 517번지 : 프린트 컨트롤러의 상태 레지스터,  519번지 : 하드 디스크 컨트롤러의 상태 레지스터

 

이렇게 함으로써 프린터 상태 읽기에는 '517번지를 읽어라' 라는 명령어가 통할 수 있다.

그런데 위와 같은 명령어는 메모리 접근 명령어랑 유사하게 생겼다.

이것이 메모리 맵 입출력의 특징인 두 공간을 동일한 공간으로 간주하게 되서 생긴 특징이다.

 

 

고립형 입출력

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

 

입출력 전용 명령어를 분리해놓는다.

메모리 전용 명령어와 입출력 전용 명령어를 통하여 각 공간에 대해 활성화를 시킨다.

 

 

메모리 맵 입출력 고립형 입출력
메모리와 입출력장치가 같은 공간을 사용 분리된 공간을 사용
메모리 공간이 축소된다. 메모리 공간이 축소되지 않는다.
같은 명령어를 사용한다. 입출력 전용 명령어를 사용한다.

 

 

이 두가지 방법외에도 인터럽트 기반 입출력이라는 인터럽트 기반의 방식이 있다.

 

 

인터럽트 기반 입출력

 

위 작업을 통하여 CPU는 좀 더 효율적인 작업이 가능하다. 

인터럽트를 이용하면 요청 신호가 오면  그 순간에 반응이 가능하다. 인터럽트 방식이 없다면 주기적으로  장치 컨트롤러에 확인여부를 검사해야 한다.

 

 

만약 동시다발적인 입출력장치의 인터럽트 요청 신호가 올때 만약 플래그 레지스터 속 인터럽트 비트를 비활성 한 상태로 처리를 한다면 순차적인 처리가 가능하다.

 

하지만 안 되는 경우도 존재하는데 nonmaskable interrupt(NMI) 라고 부른다. (하드웨어 고장 혹은 정전 등 중요도가 높은 이벤트 발생 시) 이 경우는 인터럽트 비트를 비활성화 해도 순차적인 처리를 하지않고 우선 순위가 높은 인터럽트부터 처리한다. 

 

대부분 인터럽트는 순차적인 처리를 하지않는다. 우선 순위가  높은 인터럽트가 존재하기 때문이다.

 

PIC (Programmable Interrupt Controller)

동시다발적인 인터럽스에서의 우선순위를 반영할 수 있게 해주는 하드웨어이다.

여러 장치 컨트롤러에 연결되어 장치 컨트롤러의 인터럽트 우선순위를 판단하고 cpu에게 전달한다.

 

하지만 이 장치는 NMI 우선순위까지는 판단하지 않음 --> NMI 순위는 바로 다이렉트로 CPU가 처리하게 된다.

 

 

 

안그래도 바쁜 CPU인데 디스크 백업과 같은 대용량 데이터의 이동이 일어날 경우 CPU의 부담이 커지게 되는데

이 문제점을 바탕으로 DMA(Direct Memory Access) 입출력 등장한다. -> CPU를 거치지 않고 입출력장치가 메모리에 직접적으로 접근이 가능하다.

 

 

 DMA 입출력의 과정

  • CPU는 DMA 컨트롤러에 입출력 작업을 명령한다 (DMA에 작업을 위임한다.)
  • DMA컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.
  • 입출력작업이 완료되면 DMA컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알린다.

하지만 이 입출력과정에서 문제점이 발생한다.

DMA과정에서 시스템 버스를 이용 -> 시스템 버스는 공용자원이기에 동시 점유가 불가능

CPU가 시스템 버스 이용 중 DMA컨트롤러는 사용불가하고 DMA가 사용중일때는 CPU가 사용이 불가

 

그래서 DMA는 두가지 방식으로 시스템 버스를 이용한다.

 

1. CPU가 이용하지 않을때 조금씩 사용

2. CPU에 REQUEST 요청을 보내어서 자기가 먼저 처리 

 

 

입출력 버스

장치컨트롤러가 시스템 버스에 직접 연결되는 것은 시스템 버스의 점유도가 높아져서 권장되지 않는다.

그래서 장치컨트롤러는 입출력 전용 버스에 연결된다.

 

 

출처 : https://www.youtube.com/watch?v=RRgGVu8OCP4&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=23