다양한 입출력 방법

컴퓨터 구조

목록 보기
20/20

컴퓨터 구조: 입출력 장치의 데이터 전송 방식


1. 입출력 장치가 데이터를 전송하는 방법 3가지

컴퓨터가 입출력 장치와 정보를 주고받는 방식에는 3가지 방법이 있음:
1. 프로그램 입출력 (Programmed I/O)
2. 인터럽트 기반 입출력 (Interrupt-driven I/O)
3. DMA 입출력 (Direct Memory Access, DMA)

이제 하나씩 자세하게 설명해볼게요.


2. 프로그램 입출력 (Programmed I/O)

기본 개념

  • CPU가 직접 입출력 장치를 제어하는 방식
  • CPU가 프로그램 명령어를 통해 장치 컨트롤러와 상호작용하여 데이터를 주고받음
  • 입출력 장치의 레지스터(제어, 상태, 데이터 레지스터)를 읽고 쓰면서 입출력 작업 수행

예시: 하드디스크에 데이터를 백업하는 과정

1️⃣ CPU가 하드디스크 컨트롤러의 제어 레지스터쓰기(write) 명령을 보냄
(예: "쓰기 작업을 수행하라!")

2️⃣ 하드디스크 컨트롤러가 상태 레지스터를 확인하여 준비 상태인지 검사

3️⃣ 준비가 완료되면, CPU는 메모리에 저장된 데이터를 하드디스크 컨트롤러의 데이터 레지스터에 씀

4️⃣ 위 과정을 반복하여 백업이 완료될 때까지 계속 진행


🔹 문제점 (단점)

⚠ 1. CPU가 계속 대기해야 함 → 다른 작업을 수행할 수 없음

  • 프로그램 입출력 방식은 CPU가 직접 입출력 장치를 제어해야 하는 방식이므로,
    입출력 장치가 데이터를 준비할 때까지 CPU가 계속 기다려야 함
  • 이 대기 시간 동안 CPU는 다른 작업을 수행할 수 없음비효율적

📌 예제:

  • CPU가 하드디스크(HDD)에 파일을 저장하는 명령을 실행했다고 가정

    1. CPU는 "쓰기(write) 작업을 시작하라!"라는 명령을 하드디스크 컨트롤러에 전달
    2. 하드디스크는 데이터를 저장할 준비가 될 때까지 시간이 필요함
    3. 이 동안 CPU는 계속 하드디스크 상태를 확인하면서 기다려야 함
    4. 하드디스크가 "준비 완료!"라고 신호를 보내면, CPU가 데이터를 전송
  • CPU는 이 대기 시간 동안 다른 연산을 수행하지 못하고 단순히 기다려야 함

  • 입출력 장치가 빠르면 괜찮지만, 느릴 경우 CPU의 낭비가 심각해짐


⚠ 2. 입출력 장치가 느리면, CPU 자원이 낭비됨

  • CPU는 매우 빠른 연산이 가능하지만, 대부분의 입출력 장치는 속도가 느림
  • 하드디스크(HDD), 프린터, 네트워크 장치 등의 속도는 CPU 속도보다 훨씬 느림
  • 입출력 작업이 완료될 때까지 CPU가 계속 기다려야 하므로, 고성능 CPU의 연산 자원이 낭비됨

📌 비유적 설명:

  • 사람(CPU)이 기계(입출력 장치)에 작업을 요청하는 상황을 가정
    • 사람이 복사기(프린터)에 "문서 100장을 복사해줘!"라고 요청
    • 복사기가 1장씩 복사하는 동안, 사람이 옆에서 복사기가 끝날 때까지 계속 지켜보고 있어야 하는 상황
    • 사람이 그 시간에 다른 업무를 볼 수 없는 것과 같음
    • 복사 속도가 느릴수록 사람의 시간이 더 많이 낭비됨

📌 컴퓨터 예제:

  • CPU의 클럭 속도가 3GHz(= 30억 명령어 실행 가능)라고 가정
  • 하드디스크가 데이터를 읽는 속도가 100MB/s
  • 하드디스크에서 1GB(= 1024MB)의 데이터를 읽는 데 약 10초가 걸림
  • CPU는 10초 동안 아무 일도 하지 않고 기다려야 함 → 엄청난 낭비

⚠ 3. CPU 사용률이 비효율적 (Polling 방식 문제점)

  • CPU가 입출력 장치의 상태를 지속적으로 확인해야 함 (Polling 방식)
  • CPU가 입출력 장치에게 "지금 준비됐어?"라고 계속 물어보는 과정이 필요
  • CPU의 연산 능력을 입출력 장치 확인하는 데 사용해야 하므로, 불필요한 연산 낭비 발생

📌 폴링(Polling) 방식 문제 예시:
1. CPU: "하드디스크야, 준비됐어?"
2. 하드디스크: "아직이야..."
3. CPU: "하드디스크야, 준비됐어?"
4. 하드디스크: "아직이야..."
5. (이 과정을 계속 반복)
6. 하드디스크: "이제 준비됐어!"
7. CPU: "좋아, 이제 데이터를 전송하자!"

  • 만약 CPU가 1초에 10억 번 질문할 수 있다고 가정하면,
    실제 데이터 전송이 가능한 순간까지 10억 번의 연산이 낭비될 수도 있음
  • 입출력 장치의 속도가 느릴수록 CPU의 낭비가 극심해짐

📌 폴링 방식이 비효율적인 이유:

  • 입출력 장치의 반응이 즉각적이지 않음
  • CPU가 질문을 반복하는 동안, 다른 유용한 작업을 할 수 없음

🔴 이 문제를 해결하기 위해 등장한 것이 인터럽트 기반 입출력(Interrupt-driven I/O) 방식

  • 입출력 장치가 준비되었을 때 자동으로 CPU에게 신호(인터럽트)를 보냄
  • CPU는 기다리지 않고 다른 작업을 하다가, 신호를 받으면 입출력 작업을 수행

🔹 장점

✅ 1. 구현이 단순하여, 소규모 시스템에서는 적절할 수 있음

  • 프로그램 입출력 방식은 CPU가 직접 명령을 실행하여 데이터를 주고받는 방식이므로
    구현이 간단하고 하드웨어가 복잡하지 않음
  • 소규모의 임베디드 시스템(간단한 장치)에서는 이 방식이 효율적일 수도 있음

📌 예제:

  • 마이크로컨트롤러(아두이노, 라즈베리 파이 등)

  • 간단한 센서(온도 센서, 조도 센서 등)

  • 작은 임베디드 시스템(스마트 전등, 계산기 등)

  • 이처럼 단순한 장치에서는 CPU가 대기하는 동안 다른 중요한 작업이 없기 때문에
    프로그램 입출력 방식이 충분히 적절할 수 있음


✅ 2. 하드웨어 인터럽트 없이도 입출력 장치를 제어할 수 있음

  • 인터럽트 기반 입출력 방식이나 DMA(Direct Memory Access) 방식은 인터럽트 처리를 위한 추가적인 하드웨어가 필요
  • 하지만 프로그램 입출력 방식은 별도의 인터럽트 컨트롤러 없이 입출력 작업을 수행할 수 있음
  • 하드웨어 설계를 간단하게 유지할 수 있음

📌 비유적 설명:

  • 인터럽트 방식이 전화(call-back) 방식이라면,
    프로그램 입출력 방식은 직접 가서 물어보는 방식
  • 전화기를 설치할 필요 없이 직접 가서 확인하는 것이 더 간단할 수도 있음

📌 적용 예시:

  • 소형 마이크로컨트롤러(하드웨어 인터럽트 지원이 부족한 경우)
  • 초기 컴퓨터 시스템 (1950~1980년대 컴퓨터)

CPU가 장치 컨트롤러의 레지스터를 인식하는 방법

CPU는 입출력 장치의 주소를 알아야 레지스터를 읽고 쓸 수 있음
이를 위해 두 가지 방법이 존재:
1. 메모리 맵 입출력 (Memory-mapped I/O)
2. 고립형 입출력 (Isolated I/O, Port I/O)


3. 메모리 맵 입출력 (Memory-mapped I/O) vs 고립형 입출력 (Isolated I/O)

입출력 장치의 레지스터(제어, 상태, 데이터 레지스터)에 접근하는 방법에는 메모리 맵 입출력고립형 입출력 두 가지 방식이 있음.
CPU가 입출력 장치를 어떻게 인식하고 데이터를 주고받는지에 대한 차이를 설명함.


🔹 ① 메모리 맵 입출력 (Memory-mapped I/O)

CPU가 입출력 장치를 메모리처럼 취급하여 접근하는 방식

  • 메모리 주소 공간과 입출력 장치 주소 공간을 하나로 통합하여 사용
  • CPU가 입출력 장치를 메모리의 특정 주소처럼 인식하고,
    메모리에 접근하는 것과 같은 방식으로 데이터를 읽고 씀
  • 입출력 장치의 레지스터(제어 레지스터, 데이터 레지스터 등)가 특정 메모리 주소에 배정됨

📌 예제:

  • 516번지 = 프린터의 데이터 레지스터
  • 517번지 = 프린터의 상태 레지스터
  • 518번지 = 하드디스크의 데이터 레지스터
  • 519번지 = 하드디스크의 상태 레지스터

💡 프린터에 데이터를 보내는 과정 (메모리 맵 I/O 방식)

MOV 516, A  ; 메모리 516번지(프린터 데이터 레지스터)에 값 A를 저장
  • 이 명령어가 실행되면, 프린터의 데이터 레지스터에 값 A가 전달됨
  • 메모리에 값을 저장하는 것과 같은 방식으로 입출력 장치를 제어할 수 있음

📌 장점

메모리 접근 명령어(LOAD, STORE)로 입출력 장치를 제어 가능

  • 별도의 입출력 전용 명령어(IN, OUT)가 필요 없음
    프로그래밍이 간단함
  • 입출력 장치도 일반적인 메모리처럼 취급할 수 있으므로 CPU 설계가 단순해짐
    빠른 입출력 속도
  • CPU가 메모리 접근 방식과 동일하게 입출력 장치를 제어하므로,
    추가적인 연산 과정이 줄어듦 → 빠른 데이터 전송 가능

📌 단점

메모리 주소 공간이 줄어듦

  • 입출력 장치가 메모리 주소를 차지하기 때문에, 실제 사용할 수 있는 메모리 공간이 감소함
  • 예: CPU가 1024개의 메모리 주소 공간을 지원하는 경우,
    100개의 입출력 장치가 존재하면 1024 - 100 = 924개만 메모리 주소로 사용 가능
    대형 시스템에서는 메모리 낭비가 심할 수 있음
  • 입출력 장치가 많을수록 메모리 주소 공간이 더 많이 차지됨

🔹 ② 고립형 입출력 (Isolated I/O, Port I/O)

입출력 장치를 위한 별도의 주소 공간을 사용하고, 입출력 전용 명령어(IN, OUT)로 장치를 제어하는 방식

  • 메모리 주소 공간과 입출력 장치 주소 공간을 분리하여 사용
  • CPU가 메모리와 입출력 장치를 구분하여 처리함
  • 입출력 장치에 접근할 때는 입출력 전용 명령어(IN, OUT)를 사용

📌 예제:

  • PORT 10 = 프린터의 데이터 레지스터
  • PORT 11 = 프린터의 상태 레지스터
  • PORT 12 = 하드디스크의 데이터 레지스터
  • PORT 13 = 하드디스크의 상태 레지스터

💡 프린터에 데이터를 보내는 과정 (고립형 I/O 방식)

OUT 10, A  ; 포트 10(프린터 데이터 레지스터)에 값 A를 전송
  • 메모리처럼 접근하는 것이 아니라, 포트 번호를 지정하여 데이터를 전송함

📌 장점

메모리 주소 공간을 온전히 메모리만 사용할 수 있음

  • 입출력 장치가 별도의 I/O 공간을 사용하므로, 메모리 주소를 낭비하지 않음
    입출력 장치가 많아도 메모리 주소를 차지하지 않음
  • 대형 시스템에서도 입출력 장치가 많아지는 경우, 메모리 공간이 줄어드는 문제 발생하지 않음

📌 단점

별도의 입출력 전용 명령어(IN, OUT)가 필요함

  • CPU가 메모리와 입출력 장치를 다르게 처리해야 하므로, 명령어 집합이 복잡해짐
    프로그래밍이 복잡할 수 있음
  • 메모리 접근과 입출력 접근 방식이 다르므로, 개발자가 별도로 입출력 명령어를 사용해야 함

구분메모리 맵 입출력 (Memory-mapped I/O)고립형 입출력 (Isolated I/O, Port I/O)
주소 공간메모리 주소 공간과 입출력 주소 공간이 하나로 통합메모리 주소 공간과 입출력 주소 공간이 분리됨
명령어 방식일반적인 메모리 접근 명령어(LOAD, STORE) 사용입출력 전용 명령어(IN, OUT) 사용
CPU의 복잡도CPU가 메모리처럼 다루므로 간단CPU가 메모리와 I/O를 구분해야 하므로 복잡
속도빠름 (메모리 접근 방식과 동일)상대적으로 느릴 수 있음
메모리 낭비 문제입출력 장치가 메모리 공간을 차지함 → 메모리 주소 공간이 줄어듦입출력 장치가 별도 주소 공간 사용 → 메모리 주소 낭비 없음
적용 분야소형 시스템, 임베디드 시스템, CPU 설계가 단순한 환경대형 시스템, 입출력 장치가 많은 환경

4. 인터럽트 기반 입출력 (Interrupt-driven I/O)

기본 개념

  • 입출력 장치가 준비될 때까지 CPU가 계속 확인할 필요 없이, 입출력 장치가 CPU에게 직접 "준비 완료!"라고 알리는 방식
  • 이를 위해 장치 컨트롤러가 인터럽트 요청(IRQ, Interrupt Request)을 발생시킴
  • CPU는 다른 작업을 하다가, 인터럽트가 발생하면 입출력 작업을 처리

인터럽트 기반 입출력 과정

  1. CPU가 입출력 명령을 장치 컨트롤러에 보냄
  2. 장치 컨트롤러가 작업을 진행한 후, 준비가 완료되면 CPU에게 인터럽트 신호(IRQ) 전송
  3. CPU는 현재 작업을 중단하고 인터럽트 서비스 루틴(ISR)을 실행하여 입출력 작업 수행
  4. 작업이 끝나면 다시 원래 프로그램으로 복귀

장점

  • CPU가 불필요한 대기 시간을 낭비하지 않음
  • CPU가 다른 작업을 하다가 인터럽트 신호가 오면 입출력 작업을 수행 → 효율적인 처리 가능

인터럽트 요청이 여러 개 동시에 발생하면?

  • 여러 개의 입출력 장치가 동시에 인터럽트를 발생시키면 CPU는 우선순위를 고려하여 처리해야 함

  • 이를 위해 PIC(Programmable Interrupt Controller, 프로그래머블 인터럽트 컨트롤러) 사용

    • 여러 개의 인터럽트 요청 중에서 가장 중요한(우선순위가 높은) 요청을 CPU에게 전달
    • (ex: 마우스보다 키보드 입력이 더 중요한 경우 키보드 인터럽트를 먼저 처리)



5. DMA (Direct Memory Access) 입출력

기본 개념

  • CPU를 거치지 않고 입출력 장치와 메모리가 직접 데이터를 주고받는 방식
  • 이를 위해 DMA 컨트롤러가 CPU 대신 입출력 작업을 수행
  • CPU는 입출력의 시작과 끝만 관리하고, 데이터 전송 자체는 DMA 컨트롤러가 처리

DMA 입출력 과정

  1. CPU가 DMA 컨트롤러에 입출력 작업을 요청
  2. DMA 컨트롤러가 입출력 장치와 메모리 간 데이터 전송을 수행
  3. CPU는 그동안 다른 작업을 수행할 수 있음
  4. 데이터 전송이 끝나면, DMA 컨트롤러가 인터럽트를 발생시켜 CPU에게 알림

장점

  • CPU가 입출력 장치와 데이터를 직접 주고받지 않으므로 CPU의 부하를 줄일 수 있음
  • 특히 대용량 데이터 전송 시 CPU의 효율성이 크게 향상됨


4. DMA 입출력 (Direct Memory Access, 직접 메모리 접근)

입출력 장치가 CPU를 거치지 않고, 직접 메모리와 데이터를 교환하는 방식.

🔹 동작 과정

1️⃣ CPU가 DMA 컨트롤러(DMAC)에게 입출력 작업을 요청

2️⃣ DMA 컨트롤러가 장치 컨트롤러와 직접 통신하여 입출력 수행

3️⃣ 필요한 경우, DMA 컨트롤러가 메모리에 직접 접근하여 데이터 이동

4️⃣ 데이터 전송이 끝나면 DMA 컨트롤러가 인터럽트를 발생시켜 CPU에 완료 신호를 보냄
5️⃣ CPU는 입출력 작업이 완료되었음을 확인하고 다음 작업을 수행

🔹 장점

CPU가 직접 개입하지 않아 CPU의 부담이 줄어듦
대량의 데이터를 빠르게 전송 가능
멀티태스킹 환경에서 CPU가 다른 작업을 수행할 수 있음

🔹 문제점 (단점)

DMA 컨트롤러가 메모리에 직접 접근하는 과정에서 시스템 버스를 차지할 수 있음
DMA를 효율적으로 사용하지 않으면 CPU 성능에 영향을 줄 수도 있음

6. 시스템 버스와 DMA의 문제점

DMA가 시스템 버스를 사용할 때 발생하는 문제

  • 시스템 버스는 CPU, 메모리, 입출력 장치가 공유하는 자원
  • 따라서 CPU와 DMA 컨트롤러가 동시에 시스템 버스를 사용하려 하면 충돌 발생
  • 이를 방지하기 위해 사이클 스틸링(Cycle Stealing) 기법 사용
    • CPU가 시스템 버스를 사용하지 않는 순간을 이용해 DMA 컨트롤러가 데이터를 전송
    • 즉, CPU와 DMA가 시스템 버스를 나눠서 사용

7. 입출력 버스 (I/O Bus)

  • 많은 장치 컨트롤러가 시스템 버스에 직접 연결되면 비효율적
  • 이를 해결하기 위해 입출력 전용 버스(I/O Bus)를 사용
  • 대표적인 입출력 버스:
    • PCI (Peripheral Component Interconnect)
    • PCI Express (PCIe)
    • USB (Universal Serial Bus)

입출력 버스를 사용하면?

  • 장치 컨트롤러가 직접 시스템 버스를 점유하지 않음CPU와 메모리의 성능 저하 방지
  • 데이터 전송을 더 효율적으로 관리할 수 있음


8. 최신 기술: 입출력 전용 프로세서

  • 최근에는 입출력 전용 프로세서(I/O Processor)를 장착한 장치가 등장
  • 예: 듀얼 코어 CPU가 내장된 프린터 → CPU의 개입 없이 자체적으로 입출력 작업 수행
  • 입출력 장치 자체가 독립적인 연산을 수행할 수 있도록 발전 중

📌 요약

입출력 방식CPU의 개입장점단점
프로그램 입출력직접 제어간단한 구조CPU가 계속 대기
인터럽트 기반 입출력필요할 때만 개입CPU의 효율적 사용인터럽트 처리 비용 발생
DMA 입출력거의 개입 XCPU 부담 최소화시스템 버스 충돌 가능

👉 CPU의 부담을 줄이기 위해, 현대 컴퓨터는 대부분 인터럽트 기반 입출력DMA를 사용함! 🚀

0개의 댓글