[운영체제] 인터럽트(Interrupt)

부나·2023년 12월 14일
0

안드로이드

목록 보기
6/12

인터럽트 (Interrupt)

인터럽트(Interrupt)CPU에게 Mode bit가 0(커널 모드)으로 변경 됨을 알리는 신호입니다.

일반 소프트웨어는 권한이 있는 명령을 수행하지 못하기 때문에, 인터럽트를 발생시켜서 커널 모드로 전환하여 운영체제에게 대신 일을 맡깁니다.

예를 들어, 어떠한 소프트웨어가 키보드 입력을 받기 위해 CPU에게 Interrupt를 발생시킬 수 있습니다.

CPU는 인터럽트가 발생했음을 알고 키보드(I/O Device)에게 입력을 받는 커널 명령을 실행시킨 후 해당 프로세스를 대기시킵니다.

이 때 CPU는 놀지 않고 다른 프로세스를 실행시키게 됩니다.

그리고 사용자가 키보드 입력을 마쳤다면,
또 다른 Interrupt를 발생시켜 입력받은 데이터를 메모리에 가져다 놓고,
다시 키보드 입력을 요구했던 소프트웨어를 실행시키도록 Context Switch 합니다.

중간에 운영체제를 거치기 때문에, 이러한 명령들이 실행돼도 괜찮은지 OS가 직접 검증하여 보안을 유지할 수 있습니다.

이처럼 인터럽트 종류에 따라서 I/O Device 데이터 입출력 , Context Switch 등 커널 권한을 가지고 있어야만 수행할 수 있는 루틴을 수행합니다.


조금 더 자세히 설명하자면,
CPU는 메모리에서 가져온 명령을 수행하기에 앞서, 매번 Interrupt line 을 확인합니다.

Interrupt line이 비어 있다면 기존에 실행하려던 명령을 쭉 이어서 실행하면 됩니다.
하지만, Interrupt line에 어떠한 인터럽트가 지정되어 있다면 인터럽트 서비스 루틴(ISP)을 수행합니다.

즉, 인터럽트를 발생시킨다는 것은 CPU의 Interrupt line에 특정 인터럽트 값을 지정한다는 말과 동일합니다.

이러한 과정을 다음과 같이 정리할 수 있습니다.

  1. Timer가 완료될 때까지 기존에 실행하던 프로세스 A를 실행합니다.
  2. Timer가 완료되면 기존에 실행하던 프로세스의 정보(레지스터 값, PC 등)를 PCB(Process Control block) 에 저장합니다.
  3. CPU 제어권을 Kernel에게 넘겨 인터럽트 서비스 루틴(ISP) 을 수행합니다.
  4. ISP를 마치면 CPU 제어권을 다시 프로세스 A에게 넘깁니다.
  5. PCB에 저장되어 있던 값들을 다시 CPU의 레지스터, PC 등에 복구합니다.

인터럽트 서비스 루틴 (ISR : Interrupt Service Routine)

인터럽트 서비스 루틴(ISP) 이란 인터럽트를 처리하는 커널 함수를 의미합니다.

인터럽트를 발생시켰다는 것은 권한이 필요한 명령을 커널 모드에서 수행해야 한다는 상황일 것입니다.

다시 생각해보면, 위 예시에서 다뤘던 I/O Device 데이터 입출력 , Context Switch 등이 인터럽트 서비스 루틴입니다.

인터럽트 서비스 루틴의 주소들을 모아둔 곳을 인터럽트 벡터(Interrupt Vector) 라고 부릅니다.

인터럽트의 종류

크게 하드웨어 인터럽트 , 소프트웨어 인터럽트 2가지로 분류됩니다.

하드웨어 인터럽트 (Interrupt)

하드웨어 인터럽트는 하드웨어가 발생시킨 인터럽트를 의미합니다.

  • CPU에게 키보드 입력을 마쳤음을 알리기 위한 인터럽트 (Keyboard)
  • 프로세스의 CPU 사용 시간이 끝났음을 알리기 위한 인터럽트 (Timer)
  • 마우스 클릭 이벤트를 알리기 위한 인터럽트 (Mouse)

일반적으로 Interrupt라고 하면 하드웨어 인터럽트를 의미합니다.

소프트웨어 인터럽트 (Trap)

소프트웨어 인터럽트는 Trap 이라고도 부릅니다.

Trap은 2가지가 존재합니다.

Exception : 프로그램이 오류를 범하여 예외가 발생한 경우
ex) 숫자를 0으로 나누는 등 예외가 발생하여 운영체제가 적절히 조치해주어야 하는 상황

System Call : 프로그램이 커널 함수를 호출하는 경우
ex) 소프트웨어가 어떠한 입출력을 받아야 해서 커널의 도움이 필요한 상황

profile
망각을 두려워하는 안드로이드 개발자입니다 🧤

0개의 댓글