자격/임베디드기사

[임베디드기사] [필기] 버스와 입출력장치

버스와 입출력장치

 

컴퓨터라는 것을 구분하면 제어장치 / 저장장치 / 입출력장치가 존재한다. 입출력장치는 사용자와의 상호작용을 하는 장치로 어떻게 보면 가장 느린 속도를 가지게 되는데(유저의 입력과 출력에 따른 Feedback은 전산적이지 않으니 말이다.) 이번시간에는 시스템의 통신경로인 버스를 알아보고 출력의 특징을 고려한 여러 가지 기본 개념을 알아보도록 하겠다.


시스템 버스

버스는 컴퓨터의 구성요소들을 서로 연결하는 데이터통로이다. 데이터 버스 / 주소 버스 / 제어 버스로 구분이된다. 개념도는 아래와 같다.

제어 버스(Control Bus)

데이터버스와 주소 버스를 제어하기위한 신호를 전송하는 통로이다. 양방향 버스이며, 세부 명령은 다음과 같은 것들이 존재한다.

  • 메모리 읽기 신호 : 주소가 지정하는 기억장소의 Data를 읽고, 버스에 해당 Data를 전송하는 제어신호
  • 기억장치 쓰기 신호 : 버스에 있는 Data를 기억장치 지정된 주소공간에 저장하는 제어신호
  • I/O 읽기 신호 : 지정된 입출력장치로부터 Data를 읽어 버스에 Data를 전송하는 제어신호
  • I/O 쓰기 신호 : 버스에 전송된 Data를 지정된 입출력장치로 출력하는 제어 신호

주소 버스(Address Bus)

주소버스는 메모리나 입출력장치로 기억장치 주소나 입출력장치의 포트를 전달하는 통로이다. 주소전달만을 수행하기 때문에 단방향 버스로 구분된다.

 

데이터 버스(Data Bus)

데이터 스는 시스템 요소 들간에 데이터를 전송하는데 사용되는 경로를 의미한다. CPU와 다른 장치사이에서 Data와 신호를 교환하는 버스로. 메모리와 입출력장치의 명령어나 데이터를 CPU로 전송하고, CPU의 연산결과를 기억장치나 입출력장치로 전송하는 역할을 수행한다. 모든 장치와 양방향으로 통신하는 특징이 있다.


입출력 매핑(I/O Mapping)

CPU가 입출력장치를 사용하고자 할 때 입출력장치에 사용될 메모리와 레지스터를 CPU가 접근하는 실제 주기억장치와 구분하지 않으면 메모리 매핑 입출력, 구분되어있으면 입출력 매핑 입출력 방식이라고 칭한다.

입출력 방식

CPU와 입출력장치간 데이터전송 방식은 여러 가지의 모드로 구분이 된다. 입출력장치의 늦지만 상호작용성을 고려하여 CPU를 거치지 않고 전송을 하는 방식또한 존재한다. 여러 가지 입출력 방식을 알아보자

  • Programmed I/O : CPU가 입출력이 완료되었는지 입출력장치를 지속적으로 검사하는 방식으로 I/O작업 시 CPU가 그 작업에 할당되어 다른 작업이 불가하다. CPU가 지속적인 검사를 요청하기에 Pooling 방식으로도 칭한다.
  • Interrupt I/O : 입출력장치의 사용이 필요한 순간 입출력 인터페이스가 CPU에게 사용요청을 Interrupt하는 방식이다. 입출력이 완료되면 CPU는 원래의 작업으로 돌아간다.
  • DMA(Direct Memory Access) : CPU를 경유하지 않고 DMA의 Cycle Stealing이라는 방식을 통해서 메모리와 입출력장치를 직접 매핑한다. 아래에서 Cycle Stealing을 조금 자세히 알아보자
  • Channel I/O : DMA의 한계를 극복하기 위해서 고안된 방식으로 애초에 입출력장치를 위한 CPU와는 독립적으로 동작하는 처리기(채널)이 존재한다.

DMA – Cycle Stealing

사이클 스틸링은 CPUDMA 컨트롤러 중 주기억장치에 먼저 접근(Access)하는 우선순위를 DMA 컨트롤러에게 주는 것을 의미한다. CPU의 연산 주기(Cycle)을 탈취하기에 저런 이름이 붙였다. Cycle Stealing을 수행한 DMA 컨트롤러는 한 번에 하나의 데이터 워드를 전송하고 버스의 제어를 CPU에게 반환한다. 이때 CPU는 메모리의 참조가 필요한 연산을 제외하고는 다른 작업을 수행할 수 있으며 Interrupt방식과 다르게 CPU의 상태보존(복귀를 위한)도 필요없다.


버퍼(Buffering)

버퍼란 입출력간에 사용하는 임시공간이다. 사용자의 입출력신호나 CPU의 연산결과를 일시적으로 저장하는 버퍼공간을 활용하면 한번에 신호를 몰아서 처리할 수 있는 작업이라고 볼 수 있겠다. 예시를 들자면 여러분이 바나나를 수확해서 공장(CPU)에 가져다 둔다고 가정하자(입력) 하나 수확하는데 1분이 걸린다면(오랜시간) 하나하나 옮기는거보다 다른일을 하고 있다가 요청이 들어오면(Interrupt) 10개씩 옮기는게 좋지 않겠는가? 버퍼는 그 바나나를 담아두는 공간이다.


정리

버스란 컴퓨터 내부에서 신호를 전달하는 통로이다. 시스템에서 사용하는 버스는 제어 / 주소 / 데이터버스가 있다. 입출력은 사용자와 컴퓨터간에 신호와 데이터를 전달하는 과정이라고 할 수 있다. 그 방식은 인터럽트 / 채널 / DMA와 같은 방식이 있고 그 과정에서 효율성을 올리는 버퍼를 사용한다.

 

다음시간에는

다음시간에는 입출력포트에 대해서 같이 공부해보겠다.(내가 모르는게 엄청 많구나...)