본문 바로가기

[운영체제] 02-2. Interrupt Mechanism

출처 서울대학교 홍성수 교수님, [K-MOOC] 운영체제의 기초, 2주차 Review of Computer Hardware

Interrupt란?

CPU 외곽에 있는 회로 circuit가 CPU의 관심을 얻어오고자 할 때, CPU에 보내는 시그널이 Interrupt이다.

Interrupt는 OS 스케줄러디스패처 기능을 구현하는 데 있어 굉장히 중요한 하드웨어 서포트이다.

 

Interrupt의 종류

Interrupt는 Interrupt를 발생시키는 주체에 따라 구분할 수 있다.

 

(1) 하드웨어 Interrupt

비유

 

방에서 책을 읽고 있다. 택배 기사가 초인종을 눌렀다. - 하드웨어 interrupt

읽던 페이지에 책갈피를 꽂고 방을 나간다. 택배를 받는다. 방에 들어와서 책갈피가 꽂혀 있던 페이지를 열고 다시 읽는다.

 

특징

 

독서와 택배가 오는 것은 완전 별개의 entity이다. -> 하드웨어 Interrupt는 Asynchronous한 핸들링을 촉발한다.

 

I/O 컨트롤러는 CPU에게 전기적인 신호를 보냄으로써 이벤트의 존재를 알린다. 반드시 external Interrupt source가 필요하다.

하드웨어 Interrupt를 핸들링한다는 것은 Interrupt에 대한 대응을 하는 것이다.

 

(2) 소프트웨어 Interrupt

비유

 

책을 100페이지까지 읽으면 독서를 멈추고 물을 마시고 온 후 독서를 재개해야겠다고 생각한다.

100페이지의 마지막 줄을 읽는 순간- 소프트웨어 Interrupt가 발생하는 순간

 

특징

 

책을 읽는 행위와 물을 마셔서 갈증을 해결하는 행위는 temporrally related되어 있다. -> 소프트웨어 Interrupt는 synchronous하다.

 

*Synchronous: 두 개 이상의 entity가 temporal relatonship이 있다.

- syn: together, 함께

- chron: time

 

CPU의 관점에서 외부에서 들어오는 시그널은 전혀 없다. 어떤 기능이 소프트웨어로 구현되었다는 것은 그 기능이 instruction으로 이루어져 있다는 뜻이다. 소프트웨어 Interrupt를 일으키기 위해서는 마이크로 프로세서에서 제공하는 Interrupt Instruction이 필요하다.

에러 처리를 위해 사용하는 소프트웨어 Interrupt
- 프로그램을 수행하다가 도저히 수행을 지속할 수 없는 경우
    - <예시> divide by zero exception
    - 제어권이 os로 넘어가서 os는 소프트웨어 Interrupt를 유발시킨 그 job을 종료시킨다.
- 멀티 프로그래밍을 구현할 때 job의 주소가 바운드 값보다 클 때
    * 메모리 protection을 구현시키기 위해서 어떤 job이 이슈한 주소가 그 job의 valid한 주소 영역에 있는지 비교

 

 

컴퓨터 시스템상에서 Hardware Interrupt가 들어왔을 때 OS의 대응

  1. 프로그램은 현재 수행하던 Intruction까지만 수행하고 더 이상 수행하지 않는다.
  2. 다시 수행을 하게 됐을 때 중단된 Instruction부터 수행되기 위해 다음에 수행할 instruction의 주소를 CPU 안에 있는 프로그램 카운터 레지스터에 저장한다.
    - 이를 통해 Interrupt가 끝나고 돌아온다는 것을 보장할 수 있다.
  3. Interrupt를 이슈한 source가 누구인지 파악한다.
    - source별로 어떻게 핸들링해야 하는지 정해져 있다. 핸들링을 준비한다.
    - Interrupt를 소스별로 구하기 위해 IRQ Interrupt Request Number를 얻는다.
  4. IRQ 넘버를 가지고 내가 수행시킬 핸들러 코드를 찾는다.
    - 배열 인덱스가 IRQ이다. 요소에 Interrupt 핸들링하는 루틴의 주소가 들어 있다. C언어로 얘기하면 function pointer가 들어 있다. OS가 관리하는 이 테이블을 Interrupt vector table이라고 한다.
  5. Interrupt  핸들러, 즉 ISR(Interrupt Service routine)으로 점프하여 그 코드를 수행시킨다.
  6. Interrupt 수행이 끝나면 return from Interrupt라고 하는 instruction을 수행한다.
    - 프로그램 카운터의 값을 받아와서 Interrupt에 의해 중단된 코드를 다시 시작한다.