개발자로 근무하면서 기획자나, QA, 운영하시는 분들께 종종 질문들을 받습니다.
위와 같은 다양한 질문들을 받고 설명할 때, 경력과 근무하시는 환경에 따라 CS에 대한 이해가 각각 다르시기 때문에 어떻게 설명을 드려야 하는지 가끔 막막할 때가 있었습니다.
그럴 때마다 CS에 대해 비전공자 분들도 이해하실 수 있는 문서가 있어서 이를 바탕으로 설명할 수 있었으면 좋겠다고 생각했습니다.
이 글은 이처럼, 개발자와 같이 협업하면서 일하시는 분들이 이해하시면 좋을 내용과 원활한 설명을 위한 레퍼런스로써 역할을 수행할 수 있도록 하기 위해 작성되었습니다.
이 포스트는 강민철 님의 [혼자 공부하는 컴퓨터 구조+운영체제] 를 읽고 요약・정리한 글입니다.
입출력 장치는 CPU, 메모리보다 다르기 더 까다롭습니다. 여기에는 두 가지 이유가 있습니다.
입출력 장치에는 종류가 너무 많습니다.
키보드, 모니터, 마우스, USB 메모리, 하드 디스크 등등 장치가 너무 많습니다. 장치가 다양하면 자연스레 장비마다 속도, 데이터 전송 형식 등도 다양합니다. 따라서 다양한 입출력 장치와 정보를 주고 받는 방식을 규격화하기 어렵습니다.
일반적으로 CPU와 메머리의 데이터 전송률은 높지만 입출력 장치의 데이터 전송률은 낮습니다.
여기서 전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표입니다. CPU와 메모리 처럼 전송률이 높은 장치는 1초에도 수많은 데이터를 주고받을 수 있지만, 키보드나 마우스와 같이 상대적으로 전송률이 낮은 장치는 같은 시간 동안 데이터를 조금만 주고받을 수 있습니다.
이와 같은 이유로 입출력 장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결됩니다. 모든 입출력 장치는 각자의 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고 받고, 장치 컨트롤러는 하나 이상의 입출력 장치와 연결되어 있습니다.
장치 컨트롤러는 대표적으로 다음과 같은 역할을 통해 앞에서 언급한 문제들을 해결합니다.
장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램입니다.
장치 컨트롤러가 입출력 장치를 연결하기 위한 하드웨어적 통로라면, 장치 드라이버는 입출력 장치를 연결하기 위한 소프트웨어적인 통로입니다.
프로그램 입출력은 기본적으로 프로그램 속 명령어로 입출력 장치를 제어하는 방법입니다. CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 입출력 장치에 연결된 장치 컨트롤러와 상호 작용하며 입출력 작업을 수행합니다.
프로그램 입출력 방식에서 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로서 이루어집니다.
인터럽트는 이전에 'CPU가 입출력 장치에 처리할 내용을 명령하면 입출력 장치가 명령어를 수행하는 동안 CPU 는 다른 일을 할 수 있다' 라고 했습니다.
또한 입출력 장치가 CPU에게 인터럽트 요청 신호를 보내면 CPU 는 하던 일을 잠시 멈추고 해당 인터럽트를 처리하는 프로그램인 인터럽트 서비스 루틴을 실행한 뒤 다시 하던 일로 되돌아옵니다.
입출력장치에 의한 하드웨어 인터럽트는 정확히 말하면 입출력 장치가 아닌 장치 컨트롤러에 의해 발생합니다. CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력 장치를 제어하며 입출력을 수행하는 동안 CPU는 다른 일을 할 수 있습니다.
이렇게 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력이라고 합니다.
위에서 설명한 두 방식에 공통점이 있다면 입출력 장치와 메모리 간의 데이터 이동은 CPU가 주도하고 이동하는 데이터도 반드시 CPU를 거친다는 점입니다.
입출력 장치와 메모리 사엥 전송되는 모든 데이터가 반드시 CPU를 거쳐야 한다면 CPU는 입출력 장치를 위한 연산때문에 시간을 뺐기게 됩니다. 하드디스크 백업과 같이 대용량 데이터를 옮길 때는 CPU 부담이 더욱 커지게 됩니다.
그래서 입출력 장치와 메모리가 CPU 를 거치지 않고도 상호작용 할 수 있는 입출력 방식인 DMA(Direct Memory Access) 가 등장했습니다. 이는 이름 그대로 직접 메모리에 접근할 수 있는 입출력 기능입니다.
이를 위해 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요합니다.
CPU는 DMA 컨트롤러에 입출력 장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령합니다.
DMA 컨트롤러는 CPU대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행합니다. 이때 DMA 컨트롤런는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 씁니다.
입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알립니다.