SW 전공

SW 전공 이론 학습

이론 목록으로 돌아가기

인터럽트와 입출력 제어

인터럽트 처리 순서와 프로그램 I/O·인터럽트 I/O·DMA·채널 방식의 차이를 이해한다.

예상 읽기 6

1. 인터럽트

인터럽트는 현재 프로그램의 정상 실행 흐름을 잠시 중단하고 긴급하거나 비동기적인 사건을 처리한 뒤 복귀하게 하는 기능이다.

  • 하드웨어 인터럽트: 입출력 완료, 타이머, 전원·장치 오류
  • 예외: 0으로 나누기, 잘못된 명령, 페이지 부재
  • 소프트웨어 인터럽트·트랩: 시스템콜처럼 프로그램이 의도적으로 커널 서비스를 요청

용어 분류는 아키텍처마다 다를 수 있지만, 발생 원인과 동기·비동기 여부를 구분하는 것이 중요하다.

2. 인터럽트 처리 순서

  1. 현재 명령어를 완료한다.
  2. PC·상태 레지스터 등 현재 문맥을 저장한다.
  3. 인터럽트 벡터를 이용해 ISR 주소를 찾는다.
  4. 필요하면 다른 인터럽트를 마스킹하고 ISR을 실행한다.
  5. 원인을 처리하고 인터럽트 종료 명령을 수행한다.
  6. 저장한 문맥을 복원하고 원래 프로그램으로 복귀한다.

인터럽트 우선순위, 중첩 허용, 마스킹 가능 여부는 시스템에 따라 달라진다. 일반적으로 치명적인 하드웨어 오류가 높은 우선순위를 가진다.

3. 폴링과 인터럽트

  • 폴링: CPU가 장치 상태를 반복 확인한다. 단순하지만 대기 중 CPU 시간을 낭비할 수 있다.
  • 인터럽트: 장치가 준비되면 CPU에 알린다. CPU가 다른 일을 할 수 있지만 인터럽트 처리 오버헤드가 있다.

4. 입출력 제어 방식

프로그램 I/O

CPU가 장치 상태 확인과 데이터 이동을 직접 수행한다. 구현은 단순하지만 CPU가 바쁜 대기를 할 수 있다.

인터럽트 구동 I/O

CPU가 요청을 시작한 뒤 다른 작업을 수행하고, 장치가 준비되면 인터럽트로 알린다. 실제 데이터 이동에는 CPU가 관여할 수 있다.

DMA

DMA 제어기가 메모리와 입출력 장치 사이의 블록 전송을 수행한다. CPU는 전송 시작 조건을 설정하고 완료 인터럽트를 받는다.

  • cycle stealing: DMA가 메모리 버스 사이클을 한 번씩 가져간다.
  • burst mode: 연속된 블록을 한 번에 전송한다.

채널 I/O

독립적인 입출력 프로세서가 입출력 명령을 해석하고 여러 장치를 제어한다. 대형 시스템에서 CPU의 입출력 부담을 더 줄인다.

5. 비교

방식상태 확인데이터 이동CPU 부담
프로그램 I/OCPUCPU
인터럽트 I/O장치가 통지주로 CPU중간
DMA완료만 통지DMA 제어기작음
채널 I/O채널이 관리채널·장치매우 작음

6. 벡터 인터럽트와 우선순위 판정

벡터 인터럽트는 인터럽트 번호를 이용해 벡터 테이블에서 ISR 시작 주소를 바로 찾는다. 비벡터 방식은 공통 진입점에서 장치 상태를 조사해야 할 수 있다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
interrupt number 5
        ↓
vector table[5] = ISR_Keyboard 주소
        ↓
해당 ISR로 분기

동시에 여러 요청이 오면 데이지 체인, 우선순위 인코더, 인터럽트 컨트롤러 등으로 우선순위를 정한다. 마스킹 가능한 인터럽트는 소프트웨어가 일시 차단할 수 있지만 NMI 같은 비마스킹 인터럽트는 치명적 사건에 사용된다.

7. 중첩 인터럽트와 재진입

높은 우선순위 인터럽트가 낮은 우선순위 ISR을 선점하도록 허용하면 응답성은 높아지지만 저장해야 할 문맥과 스택 사용량이 늘어난다. ISR이 공유 자료구조를 사용한다면 재진입 가능성과 원자성을 고려해야 한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
사용자 코드 → 낮은 ISR → 높은 ISR → 낮은 ISR 복귀 → 사용자 코드 복귀

긴 작업을 ISR 안에서 모두 처리하면 다른 인터럽트 지연이 커진다. 따라서 빠른 확인·승인만 즉시 수행하고 후속 작업을 지연 처리하는 설계가 흔하다.

8. 정확한 예외와 재시작

정확한 예외(precise exception)는 예외 이전 명령은 모두 완료되고 이후 명령은 완료되지 않은 것처럼 상태를 제공한다. 페이지 부재를 처리한 뒤 문제 명령을 재시작하려면 PC와 부작용 상태가 정확해야 한다. 0으로 나누기처럼 같은 명령에서 동기적으로 발생하는 예외와 외부 장치 완료처럼 비동기적인 인터럽트를 구분한다.

9. 메모리 맵 I/O와 분리형 I/O

  • memory-mapped I/O: 장치 레지스터가 메모리 주소공간에 배치되어 일반 load/store를 사용
  • isolated/port-mapped I/O: 별도 I/O 주소공간과 전용 명령 사용

메모리 맵 I/O 영역은 일반 RAM처럼 캐싱하면 장치 상태를 잘못 읽을 수 있어 캐시 정책과 접근 순서 제약이 필요하다.

10. DMA 설정과 버스 사용

CPU는 보통 DMA 제어기에 시작 주소, 전송 길이, 방향, 장치 정보를 기록한다. DMA는 버스를 획득해 전송하고 완료 또는 오류 시 인터럽트를 발생시킨다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
CPU ──설정──→ DMA controller
                 │
I/O device ⇄ DMA │ ⇄ Main Memory
                 └──완료 인터럽트──→ CPU
  • cycle stealing: CPU 메모리 사이클 사이를 조금씩 사용, CPU가 느려질 수 있음
  • burst: 버스를 일정 시간 독점해 블록 전송, 높은 처리량이지만 CPU 대기 증가 가능
  • transparent DMA: CPU가 버스를 쓰지 않는 시점에 전송

11. 전송 시간과 인터럽트 수 계산

4MiB 데이터를 200MiB/s로 DMA 전송하면 순수 데이터 전송 시간은 4/200초=0.02초=20ms다. 설정·버스 중재·장치 지연은 별도다.

장치가 4KiB마다 인터럽트를 발생시키면 4MiB 전송에 1024회 인터럽트가 필요하지만, 전체 블록 완료 시 한 번만 알리면 인터럽트 오버헤드를 크게 줄일 수 있다. 반대로 너무 큰 묶음은 지연시간을 늘릴 수 있다.

12. 폴링과 인터럽트의 선택

이벤트가 매우 자주 발생하거나 처리 시간이 극히 짧다면 인터럽트 폭주보다 짧은 구간 폴링이 효율적일 수 있다. 이벤트가 드물고 대기 시간이 길면 인터럽트가 CPU 낭비를 줄인다. 따라서 “인터럽트가 항상 폴링보다 빠르다”는 절대 명제는 옳지 않다.

최종 확인 문제

  1. 벡터 인터럽트가 장치별 ISR 주소를 찾는 기본 원리를 설명하시오.
  2. 4MiB를 128MiB/s로 전송할 때 순수 DMA 데이터 전송 시간을 구하시오.
  3. memory-mapped I/O가 일반 RAM과 달리 캐시·접근 순서에 주의해야 하는 이유를 설명하시오.
  4. 높은 우선순위 인터럽트가 낮은 우선순위 ISR을 선점할 수 있는 방식을 무엇이라 하며 어떤 비용이 증가하는가?
  5. 프로그램 I/O와 DMA에서 실제 데이터 블록 이동을 주로 담당하는 주체를 각각 쓰시오.