[CS] Interrupt의 처리 과정과 분류 기준, 그리고 Exception과의 오해

박상혁·2023년 3월 20일
0

CS

목록 보기
3/10

개요

인터럽트의 구체적인 처리 과정, 그리고 interrupt, exception간의 분명한 분류 기준을 이해하기 위해 해당 포스팅을 작성하였습니다.

목차

  1. interrupt란?
  2. 발생 조건
  3. 처리 과정
  4. 분류 기준
  5. exception과의 오해

본론

interrupt란?

CPU의 작업을 방해하는 하드웨어 신호입니다.

발생 조건

  • System call
    System call은 interrupt에 의해 구동되는 OS 내부 프로그램입니다.
    System call을 호출하기 위해 interrupt를 발생시킵니다.

ex) printf()도 System Call을 호출하여 인터럽트를 발생시킨 후 write() ISR을 수행하는 것이라 할 수 있습니다.

  • I/O 입출력 마침
    입출력 처리를 마쳤다는 소식을 커널에게 전달하기 위함.
    혹은 입출력 과정에서 오류가 발생했다는 것도 인터럽트를 통해 전달

  • 타이머
    주기적으로 인터럽트를 발생해야 할 경우

  • 프로그램 검사
    Division by zero, Overflow/Underflow ...
    하드웨어 수준에서 발생하는 오류

처리 과정

하드웨어 인터럽트와 소프트웨어 인터럽트 처리 과정은 거의 비슷합니다. 1단계에서 인터럽트 요청을 코드를 통해 직접 발생시키느냐, 다른 하드웨어로부터 인터럽트 발생을 감지하느냐 차이입니다.

  1. 다른 장치로부터 인터럽트 요청 신호가 들어옵니다.

  2. 항상 실행 사이클이 끝나고 다음 명령어를 인출(Fetch)하기 전 인터럽트 여부를 확인합니다.
    이 때 요청 신호가 있음을 확인합니다.

  3. 요청 신호가 들어왔다는 것을 확인한 후, flag register의 interrupt flag가 활성화 되어있는 것을 확인합니다.

  1. CPU는 지금까지 한 작업을 백업하여 안전하게 보관합니다. 이 때 다음번에 실행할 명령어 주소를 기억하는 레지스터인 PC값을 백업합니다.

  2. 인터럽트 서비스 루틴(ISR)을 실행합니다. 이는 해당 인터럽트를 어떻게 처리해야할지 적혀있는 코드들로 이루어져 있습니다.

  3. Program Counter 값을 복구시킨 후 이전에 수행중인 프로그램 이어서 실행합니다.

분류 기준

인터럽트를 분류하는데 중요한 점은, 인터럽트를 발생시킨 주체입니다.

  • 하드웨어 인터럽트
    주체 : CPU 이외 기타 하드웨어
    예시 :

  • keyboard, mouse, monitor 등에서 데이터 전송을 끝마쳤다는 소식을 인터럽트를 통해 OS 혹은 장치 드라이버에게 전달.

  • timer에 의해 의도적으로 프로그램이 중단.

  • 소프트웨어 인터럽트
    주체 : CPU
    예시 :

  • 응용 프로그램이 입출력 기능을 사용하기위해 OS에게 System Call.

  • division by zero, overflow/underflow같은 하드웨어게 큰 손상을 입힐 수 있는 명령들을 검사.

Exception과의 오해

Exception도 Interrupt를 통해서 이루어진다는 것은 사실이 아닙니다.
이 둘을 나누는 기준은 제어 흐름을 변경하는 방식에 있습니다.

  • 예상치 못한 이벤트
    인터럽트 자체는 하드웨어에서 보내는 CPU를 방해하는 신호에 의해 제어 흐름이 변경됩니다.
    단순히 응용 프로그램 내부에서 해결할 수 있는 수준이 아닌, OS나 기타 하드웨어의 작업 도움이 필요할 때 인터럽트를 발생시킵니다.

  • 일반적인 제어 구조
    인터럽트와 달리 exception은 응용 프로그램 내부의 개발자가 정의한 제어 구조에 의해 제어 흐름이 변경됩니다
    조건문(if-else)이나 반복문(while) 같은 제어 구조는 조건이 있으며
    해당 조건을 달성하면 {} 안의 코드를 실행시키거나 빠져나옵니다.

Java를 예로 들면
조건에 부합하지 않는 것은 예외를 throw 합니다.
이를 통해 JVM은 이에 맞는 예외 객체를 생성하여 반환합니다.

이후, try-catch와 같은 예외문을 사용하여 try문에 코드를 작성하면
JVM이 실행 도중 오류를 발견하고 걸맞는 예외 객체를 생성하여 이를 catch에 반환합니다.
catch에 구문을 작성하여 Log 출력, stacktrace 출력 등의 개발자가 정해놓은 행동을 취할 수 있습니다.
<< Java의 Exception 동작에 대한 자세한 정보는 해당 포스팅 참조 >>

예외는 code 영역 안에서 기계어를 통해 해결할 수 있다는 점입니다.

요약

  • 인터럽트는 CPU 동작을 방해하는 하드웨어 신호
  • System call, 다양한 I/O 처리 알림, 프로그램 검사 등을 진행
  • 인터럽트가 발생 -> 하던 작업을 멈춤 -> 백업 -> ISR 수행 -> 복원 -> 작업 이어서 진행
  • 인터럽트는 CPU 내부에서 발생했냐, 아니냐에 따라 구분
  • Exception은 인터럽트에 의해 발생하지 않는다

소감

해당 포스팅을 작성하면서 컴퓨터 구조에 대한 기초 지식이 중요하다는 사실을 상기 시켜주었습니다.

interrupt의 예시들의 동작들을 하나하나 떠올리는 것이 도움이 되었습니다.

참조

인터럽트 위키백과
인터럽트(Interrupt)의 종류와 처리과정
Arm Interrupt & Exception ( 인터럽트, 예외, 차이점 )

profile
개발 노트

0개의 댓글