코드의 여백

[운영체제] 입출력 시스템과 장치 관리의 핵심 구조 이해하기

by rowing0328

※ 슬라이드 내용을 기반으로 정리한 글입니다. 일부 해석은 주관적일 수 있습니다.

 

운영체제를 공부하다 보면
CPU, 메모리, 프로세스 같은 요소가 먼저 등장한다.


하지만 현실에서 컴퓨터가 실제로 '일'을 하기 위해선
사용자와 소통할 수 있는 입출력 장치(I/O Device)가 필수적이다.

 

모니터, 키보드, 프린터, USB, 그래픽카드 등
수많은 장치들이 데이터를 주고받으며 동작한다.

 

이번 장에서는 이러한 장치들이 시스템과

어떻게 연결되고 어떤 방식으로 작동하는지를 살펴본다.

 

 

핵심 키워드 미리 보기

  • Peripheral Device (주변장치)
  • I/O Bus Architecture (입출력 버스 구조)
  • I/O Controller (입출력 제어기)
  • I/O Interrupt (입출력 인터럽트)
  • Buffer (버퍼)
  • Channel Selector (채널 선택기)

 

 

Peripheral Device

컴퓨터는 CPU와 메모리만으로는 세상과 연결될 수 없다.

주변장치는 컴퓨터가 외부와 데이터를 주고받기 위한 필수 수단이다.

 

입력 장치에는 키보드, 마우스가 있고,
출력 장치에는 모니터, 프린터가 있다.

 

이 장치들이 보내고 받는 데이터는 CPU와 메모리로

전달되어 작업이 처리된다.

 

이 모든 흐름은 버스(Bus)라는 통신 경로를 통해 이루어진다.

 

 

I/O Bus Architecture

I/O 버스 아키텍처는 CPU, 메모리, 입출력 장치를

어떻게 연결할지를 정의한 구조다.

 

I/O Bus는 장치 간 데이터 통신을 위한 물리적 통로이며,

다음과 같은 세 가지 신호선으로 구성된다:

  • Data Bus: 실제 데이터가 이동하는 통로
  • Control Bus: 제어 신호가 오지는 통로
  • Address Bus: 메모리나 장치의 주소를 지정하는 통로

 

버스는 전송 방향에 따라 다음과 같이 구분되기도 한다:

  • Input Channel: 장치에서 시스템으로 데이터 전송
  • Output Channel: 시스템에서 장치로 데이터 전송
  • Bidirectional Channel: 양방향 전송 가능

 

고속 장치는 각각의 신호선을 분리해서 사용하는 경우가 많고,

저속 장치는 입력/출력 신호선을 공유하는 간소한 구조를 사용하기도 한다.

 

 

I/O Controller

각 장치와 연결되어, 데이터 전송을 직접 관리하는 장치다.

CPU가 모든 장치를 일일이 제어하는 부담을 줄이기 위해 사용된다.

 

특히 대용량 데이터 전송에는 DMA(Direct Memory Access)가 사용된다.

DMA는 CPU의 개입 없이 메모리와 장치 간 데이터를직접 전송할 수 있도록 해준다.

 

이 방식은 CPU의 부하를 줄이고 시스템 효율을 높이는 데 기여한다.

 

 

Buffer

입출력 장치와 메모리 사이에는 속도 차이가 있다.

이 차이를 완충하기 위해 사용하는 것이 바로 버퍼(Buffer)이다.

 

버퍼는 데이터를 임시로 저장하는 공간이며,
두 시스템 사이에서 데이터를 조율하는 역할을 한다.

 

  • 단일 버퍼: 하나의 공간을 번갈아 사용하는 구조다.
  • 이중 버퍼: 두 개의 공간을 교대로 사용해 처리 속도를 향상한다.

 

버퍼가 없으면 입출력 장치의 속도에 따라
CPU나 메모리가 대기하게 된다.

 

반대로 버퍼가 있으면 서로 독립적으로 움직일 수 있어

전체 시스템의 효율이 올라간다.

 

 

I/O Interrupt

인터럽트는(Interrupt)는 입출력 장치가 작업을

완료했을 때 CPU에 알리는 방법이다.

 

과거에는 폴링(Polling) 방식으로 CPU가 직접 장치를

계속 확인했지만, 이는 리소스를 낭비하는 비효율적인 방식이었다.

 

인터럽트 방식에는 장치가 준비되었을 때 스스로

IRQ(Interrupt Request)를 발생시킨다.

 

그러면 CPU는 현재 작업을 잠시 멈추고,
해당 장치의 요청을 처리한다.

 

인터럽트의 핵심 구성은 다음과 같다:

  • IRQ: 장치가 보내는 신호
  • Interrupt Controller: 다양한 인터럽트를 모아서 관리하고 우선순위를 정함
  • Interrupt Vector Table: 어떤 인터럽트가 발생했는지에 따라 처리 루틴을 연결하는 테이블
  • ISR: 인터럽트를 실제로 처리하는 코드

 

인터럽트는 CPU가 장치를 계속 감시하지 않아도 되도록 해주며,

시스템 자원을 훨씬 효율적으로 사용할 수 있게 만들어준다.

 

 

Channel Selector

입출력 컨트롤러는 여러 장치를 관리해야 한다.

Channel Selector는 그중 어떤 장치와 통신할지를 정해주는 역할을 한다.

 

또한 장치 특성에 따라 적절한 채널을 배분하는 기능도 수행한다.

 

채널은 주로 전송 속도에 따라 다음처럼 분류된다:

  • 고속 채널
    데이터 전송량이 많고 빠른 장치 (SSD, GPU 등)을 위해 별도의 전용 채널을 사용한다.
    대역폭이 크고 제어/주소/데이터 신호선을 분리한다.
  • 저속 채널
    마우스, 키보드처럼 느린 장치는 여러 장치가 채널을 공유하거나 단순한 통로만을 사용한다.

 

Channel Selector는 이런 다양한 요청들을 조율해

컨트롤러와 장치 간 충돌 없이 통신이 이뤄지도록 한다.

 

 

전체 흐름 - 실제 데이터 전달의 여정

운영체제의 입출력 구조는 크게 두 가지 방향으로 나뉜다:

  • 외부 → 내부: 입력 장치에서 시스템으로 데이터가 들어오는 방향
  • 내부 → 외부: 시스템에서 출력 장치로 데이터가 나가는 방향

각 방향마다 인터럽트가 발생하며,
CPU는 이에 반응해 효율적으로 입출력 처리를 수행한다.

 

[외부 → 내부] 데이터 입력 흐름 + 인터럽트 발생 절차

Device → Channel Selector → I/O Controller → [IRQ 발생] → Interrupt Controller → CPU
                                             ↓
                                         DMA → Buffer → Memory → MIC → CPU

ⓐ Device (입력장치): 키보드, 마우스 등에서 사용자의 입력이 발생한다.

ⓑ Channel Selector: 해당 입력 장치를 식별하고 I/O Controller와 연결한다.

ⓒ I/O Controller: 입력 데이터를 수신하며, IRQ(Interrupt Request)를 발생시킨다.

ⓓ Interrupt Controller: 인터럽트 신호를 CPU에 전달하고, 우선순위를 조정한다.

ⓔ CPU: 인터럽트를 수락하고 ISR(Interrput Service Routine)을 실행해 해당 장치 요청을 처리한다.

ⓕ DMA: CPU 명령에 따라 데이터를 OS가 미리 지정한 버퍼 주소로 직접 전송한다.

ⓖ Buffer: 데이터를 임시 저장한다.

ⓗ Memory → MIC → CPU: 필요시 버퍼 데이터를 메모리로 이동하며, CPU가 후속 처리를 수행한다.

 

이 흐름은 사용자의 입력을 빠르게 수신하고,
CPU가 효율적으로 개입하도록 돕는다.

 

[내부 → 외부] 데이터 출력 흐름 + 인터럽트 발생 절차

CPU → MIC → Memory → Buffer ← DMA ← I/O Controller ← Channel Selector ← Device
                                                ↑
                                   [IRQ 발생: 출력 완료]

ⓐ CPU: 출력 작업을 명령한다 (예: 인쇄 요청, 화면 출력 등).

ⓑ MIC (Memory I/O Controller): CPU와 메모리 사이의 데이터 흐름을 관리한다.

ⓒ Memory: 출력할 데이터를 제공한다.

ⓓ Buffer: 메모리 데이터를 일시 저장해 속도 차이를 조절한다.

ⓔ DMA: 버퍼 데이터를 I/O Controller로 직접 전송한다.

ⓕ I/O Controller: 데이터를 출력 장치로 전송하고, 전송 완료 시 IRQ(인터럽트)를 발생시킨다.

ⓖ Channel Selector: I/O Controller와 해당 출력 장치를 연결한다.

ⓗ Device (출력장치): 데이터를 최종 출력한다.

ⓘ Interrupt Controller → CPU: 출력 완료 인터럽트를 CPU에 전달하고, CPU는 후속 작업을 수행한다.

 

이 흐름은 데이터 출력 과정에서도
CPU의 효율적 개입과 자원 활용을 가능하게 한다.

 

 

마무리

단순한 입출력 개념을 넘어, 입출력 장치와 메모리,
CPU 컨트롤러들이 어떻게 협력하는지를 설명하는 장이다.

 

하나의 데이터를 입력하거나 출력하는 데도
수많은 중간 단계가 존재하고,

각 요소는 최대한 효율적으로 분산된 책임을 가지고 움직인다.

 

이 구조는 마치 정교하게 설계된 물류 시스템처럼,
빠르고 안정적으로 데이터를 운반하고 전달하는 생태계를 이루고 있다.

블로그의 정보

코드의 여백

rowing0328

활동하기