0.🚶들어가며
이번 글에서는 입출력 시스템의 개요를 소개해보려 합니다. 입출력 장치는 무엇이 있는지, 컴퓨터 주변 장치는 무엇인지, 주변장치와 필수 장치 사이의 통신은 어떻게 이루어지는지 등에 대해 알아보도록 하겠습니다.
1.💽주변장치에 대하여
컴퓨터는 필수 장치인 CPU와 메모리, 주변장치인 입출력 장치와 저장장치로 구성됩니다. 또한 각 장치는 메인보드에 있는 버스로 연결되죠. 오늘 알아볼 내용은 대부분 주변장치에 대한 이야기입니다.
주변장치는 데이터 전송 속도에 따라 아래 두 가지로 구분됩니다.
1) 저속 주변장치
- 메모리와 주변장치 사이에 오고 가는 데이터 양이 적어 데이터 전송률이 낮은 장치입니다.
- 키보드가 대표적인 예입니다.
2) 고속 주변장치
- 메모리와 주변장치 사이에 오고 가는 데이터 양이 많아 데이터 전송률이 높은 장치입니다.
- 그래픽카드, 하드디스크가 대표적인 예입니다.
2.🚌입출력 버스 구조
입출력 버스 구조는 시대에 따라 바뀌어왔습니다. 컴퓨터 사용 초기에는 주변장치가 많지 않았고, CPU와 메모리의 속도도 빠르지 않아 모든 장치를 하나의 버스로 연결해도 큰 문제가 없었습니다. 아래 사진과 같이 말이죠!
하지만 시간이 흐르면서 CPU와 메모리 성능이 향상되고 주변 장치도 다양해지기 시작했습니다. 이러한 이유 때문에 입출력을 CPU가 직접 관리하는 것이 비효율적이게 되고, 주변 장치 간에 속도 차이도 생겨 하나의 버스만으로 연결하는 것도 문제가 생겼습니다.
위 같은 문제 상황으로 인해 입출력 버스 구조는 두 가지 큰 변화가 발생했습니다.
- 입출력 제어기(I/O Controller) 도입
- 입출력 버스의 분리
위 사진을 보시면 초기 입출력 버스 구조와 많이 달라진 것을 볼 수 있습니다. 하나씩 알아봅시다.
우선 입출력 제어기가 생겼습니다. 입출력 제어기는 CPU와 주변 장치 간의 데이터 통신을 직접 관리합니다. 이 덕분에 CPU와 메모리의 작업이 느려지는 것을 막을 수 있고 이에 따라 전체 시스템의 효율이 향상되었습니다.
또한, 고속 입출력 장치를 위한 버스와 저속 입출력 장치를 위한 버스가 나뉘었습니다. 만약 두 버스를 나누지 않는다면 고속 입출력 장치 역시 느려지기 때문에 이처럼 분리하게 된 것입니다. 또한 데이터 전송을 채널 선택기가 관리해주어 두 버스의 데이터 전송 속도를 조절하게 됩니다.
추가로 위 사진 왼편에 그래픽 카드는 따로 관리되고 있음을 확인할 수 있습니다. 그래픽 카드의 경우 주변장치임에도 불구하고 CPU의 계산 능력만큼이나 뛰어난 속도를 가지고 있는데 이를 고속 입출력 버스로는 감당할 수 없어 메인 버스에서 CPU와 메모리와 함께 같이 다룹니다.
3.🏌직접 메모리 접근(DMA)
입출력 제어기는 주변장치들의 입출력을 대행하고, 여러 채널에서 온 데이터를 메모리에 옮기는 역할을 합니다. 이때 CPU 도움 없이도 메모리에 접근할 수 있도록 입출력 제어기에 DMA라는 권한을 부여합니다. 즉, 입출력 제어기에는 직접 메모리에 접근하기 위한 DMA 제어기가 마련되어있습니다.
근데 이런 방식을 사용하면 CPU가 사용하는 작업 공간인 메인 메모리가 DMA 제어기와 공유됩니다. 따라서 오늘날 입출력 시스템에서는 메인 메모리에 공간을 CPU가 작업하는 공간과 DMA 제어기가 데이터를 옮기는 공간로 분리합니다. 이러한 방식을 Memory mapped I/O라고 하죠. 위 같은 방식으로 CPU와 DMA 제어기의 작업 공간이 겹치는 것을 막는 것입니다.
4.✋인터럽트
인터럽트는 주변장치의 입출력 요구나 하드웨어의 이상 현상 등을 CPU에 알려주는 역할을 하는 신호입니다.
인터럽트가 없다면 CPU가 요청한 입출력 요구가 완료되었는지 계속해서 확인해야 할 것입니다. busy waiting과 비슷하게 말이죠! 그러한 방식을 사용하는 대신 CPU가 요청한 작업을 완료했을 때 입출력 제어기는 CPU에 인터럽트를 보내는 것입니다.
다양한 주변 장치에서 생기는 인터럽트를 처리하기 위해서 운영체제는 장치에 따라, 인터럽트 성격에 따라 IRQ라는 고유 인터럽트 번호를 부여합니다. 이를 통해 인터럽트가 발생 시 IRQ를 확인하고 IRQ에 맞는 인터럽트 처리 루틴을 수행하게 되는 것이죠.
위 사진을 살펴보시면 인터럽트가 발생할 시 인터럽트 벡터 테이블을 먼저 살펴보는 것을 알 수 있습니다. 인터럽트 벡터 테이블을 통해 인터럽트 처리 루틴이 등록된 곳을 살펴보고 처리 루틴에 따라 처리한 뒤 복귀하는 흐름이 바로 인터럽트 처리 과정입니다.
# 인터럽트 벡터 테이블?
각 인터럽트에 대해 해당 인터럽트의 처리 루틴이 등록된 메모리 주소가 포인터 형태로 등록되어있는 테이블입니다.
5.💬버퍼
버퍼는 속도가 다른 두 장치의 속도 차이를 완화하는 역할을 합니다. 여기서 속도 차이라 함은 대표적으로 메모리와 하드 디스크 사이의 속도 차이가 있습니다. 느린 장치에서 들어오는 데이터를 버퍼라는 공간에 모아 한꺼번에 이동하면서 속도 차이를 완화시키는 방법이죠.
CPU가 한 번에 데이터를 100개씩 처리할 수 있는 능력이 있는데 디스크에서는 한 번에 10개씩만 데이터를 보낼 수 있는 상황을 생각해봅시다. 이 과정에서 버퍼라는 저장공간을 두고 디스크에서 일정량 이상의 데이터를 보내 버퍼가 차면 그때 CPU가 이를 처리하는 방식을 사용하고, 이를 통해 더 효율적인 자원 활용을 하는 것입니다.
6.💨나가며
이번 글에서는 주변 장치에 관한 개념들을 간략하게 다뤄보았습니다.
이어서 다음 글에서는 디스크와 관련된 내용을 다뤄보겠습니다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제(OS)] 디스크 구조와 디스크 스케줄링 (0) | 2022.03.11 |
---|---|
[운영체제(OS)] 가상 메모리 - (5) 스레싱과 프레임 할당 (0) | 2022.03.03 |
[운영체제(OS)] 가상 메모리 - (4) 페이지 교체 알고리즘 (0) | 2022.03.03 |
[운영체제(OS)] 가상 메모리 - (3) 요구 페이징(Demand Paging) (0) | 2022.03.02 |
[운영체제(OS)] 가상 메모리 - (2) 세그멘테이션 기법과 세그멘테이션-페이징 혼용 기법 (0) | 2022.03.01 |