[CS] 인터럽트 (Interrupt)

  • CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치 또는 예외상황이 발생하여 처리가 필요할 경우 CPU에게 알려 처리할 수 있도록 하는 것
    → CPU가 어떤 프로그램을 순차적으로 수행하는 중에 외부로부터 인터럽트 요구가 들어오면, CPU는 원래 프로그램의 수행을 중단하고 인터럽트를 먼저 처리함. 후에 인터럽트 처리가 끝나면 원래의 프로그램으로 복귀하여 수행을 계속 함.
    → 인터럽트를 발생시키기 위해서는 CPU 내에 있는 인터럽트 라인을 세팅함.
  • 하드웨어 인터럽트
    • 하드웨어가 발생시키는 인터럽트
    • CPU가 아닌 다른 하드웨어 장치가 CPU에 어떤 사실을 알려주거나 CPU 서비스를 요청해야할 경우 발생
  • 소프트웨어 인터럽트
    • 소프트웨어가 발생시키는 인터럽트
    • 소프트웨어가 스스로 인터럽트 라인을 세팅'

인터럽트 종류

  • 외부 인터럽트 : 보통 외부 입출력장치에 의해 발생
    • 전원 이상 인터럽트(Power Fail Interrupt) : 정전, 파워 이상 등의 경우
    • 기계 착오 인터럽트(Machine Check Interrupt) : CPU의 기능적인 오류의 경우
    • 외부 신호 인터럽트(External Interrupt) : 타이머 인터럽트(자원이 할당된 시간이 다 끝난 경우), 키보드 인터럽트(Ctrl + Alt + Del), 외부장치 인터럽트
    • 입출력 인터럽트(I/O Interrupt) : 입출력 장치가 데이터 전송을 요구하거나 다음 동작이 수행되어야 할 경우, 입출력 데이터에 이상이 있는 경우
  • 내부 인터럽트 : 잘못된 명령이나 잘못된 데이터를 사용할 때 발생, Trap이라고도 함
    • 프로그램 검사 인터럽트(Programm Check Interrupt) : 0으로 나눈 경우, Overflow/Underflow, 기타 예외 경우
  • 소프트웨어 인터럽트 : 프로그램 처리 중 명령 요청에 의해서 발생
    • SVC(SuperVisor Call) : 사용자가 프로그램을 실행시키거나 감시프로그램을 호출하는 동작을 수행한 경우, 복잡한 입출력 처리를 한 경우
📌 인터럽트 우선순위
전원 이상(Power Fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) >
명령어 잘못 > 프로그램 검사(Program Check) > SVC(SuperVisor Call)

✅ 인터럽트 우선순위 판별법

  • Polling (소프트웨어적 방법)
    • 인터럽트 요청 플래그를 차례로 비교해 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 수행
    • 특징
      • 속도가 빠른 장치에 높은 등급을 부여
      • 우선순위 변경이 쉬움
      • 많은 인터럽트가 있을 경우 하드웨어적인 방법에 비해 우선순위 판단 속도가 느림
  • Interrupt (하드웨어적 방법)
    • MCU 자체가 하드웨어적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식
    • 인터럽트를 요청할 수 있는 장치와 CPU 사이에 장치번호를 식별할 수 있는 버스를 직렬/병렬로 연결
    • Daisy Chain
      • 인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결
      • 우선순위가 높은 장치를 상위에 두고 차례로 배치
    • 병렬 우선순위 부여
      • 각 장치별 우선순위를 판별하기 위한 Mask Register에 bit를 설정
      • Mask Register상 우선순위가 높은 서비스 루틴 수행 중 우선순위가 낮은 bit들을 비활성화 시킬 수 있음
      • 반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리됨

인터럽트 처리 과정

  • 요청중단보관처리재개
    1. 인터럽트 요청
    2. 프로그램 실행 중단
      1. 현재 실행중이던 Micro Operation까지 수행
    3. 현재 실행중인 프로그램 상태 보관
      1. Interrupt Vector를 읽어 ISR 주소값을 얻음
      2. ISR로 점프 (이 때, PC 값은 자동 대피,저장됨)
      3. 현재 진행중인 프로그램의 레지스터를 대피함
    4. 인터럽트 서비스 루틴 처리
      1. 인터럽트 원인을 파악하고 실질적인 작업 수행
      2. 서비스 루틴 수행 중, 우선순위가 더 높은 인터럽트가 발생하면 재귀적으로 1~5 과정 수행
    5. 상태 복구
      1. 해당 작업을 다 처리하면, 대피시킨 레지스터를 복원
      2. ISR끝에 RETI명령어에 의해 인터럽트 해제
      3. 명령어가 실행되면, PC값을 복원하여 이전 실행 위치로 복원

인터럽트 구성요소

  1. 발생원(Source) : 누가 인터럽트를 요청했는지
  2. 우선순위(Priority) : 2개 이상의 요청 시 어떤 서비스를 먼저 실행할 것인지? (중요도)
  3. 인터럽트 벡터(Interrupt Vector) : 서비스 루틴의 시작 번지는 어디인지

✅ Interrupt Vector

: 인터럽트가 발생했을 때 해야할 일이 무엇인가를 정해놓은 것으로 인터럽트 서비스 루틴(ISR)의 시작 주소

✅ IDT(Interrupt Descriptor(=Vector) Table)

: 미리 정의되어 있는 인터럽트들의 번호와 실행 코드를 가리키는 주소들이 저장되어 있는 테이블

  1. 컴퓨터 부팅 시 운영체제가 IDT에 인터럽트들을 기록하고,
  2. 인터럽트 발생 시 IDT를 확인해 Interrupt 번호에 해당하는 함수를 호출해서 인터럽트를 처리하게 됨

✅ Interrupt Handler

: 인터럽트가 발생하면 이를 핸들링하기 위한 함수가 호출되는데 이를 인터럽트 핸들러라고 함

: 함수 형태로 존재하며 커널 내부의 IRQ(Interrupt ReQuest) 서브 시스템을 통해 호출

: 인터럽트 핸들러의 최소 요구 조건은 인터럽트를 받았다는 사실을 인터럽트를 발생시킨 하드웨어에 알려줘야 한다는 것

✅ Interrupt Context

: 현재 실행 중인 프로세스가 현재 인터럽트를 처리 중이라는 것을 의미

'CS > OS' 카테고리의 다른 글

[CS] PCB & Context Switching  (0) 2024.02.01
[CS] 시스템 콜(System Call)  (0) 2024.02.01
[CS] 프로세스 주소 공간  (0) 2023.10.28
[CS] 프로세스와 스레드  (1) 2023.10.28
[CS] 운영체제  (0) 2023.10.28