본문 바로가기

프로그래밍/컴퓨터구조

[컴퓨터구조] 인터럽트(Interrupt)란?

인터럽트

개요

2017년 컴퓨터구조 과목을 수강하면서 가장 많이 나온 단어가 인터럽트가 아닐까 싶다.
외부 인터럽트, 내부 인터럽트 인터럽트 서비스, 인터럽트 서비스 루틴, 인터럽트 핸들러, 인터럽트 벡터 등등..
인터럽트와 관련된 많은 용어들이 나를 괴롭혔다.

이번 포스팅에서는 나를 괴롭혔던 인터럽트에 대해 포스팅하고자 한다.

toomuchtalker

박찬호 선수를 CPU라고 생각해보자. CPU가 방송 프로그램에 나와 입담을 가동하고 계시다.

질문

한 학생이 용기를 내어서 박찬호 선수의 말을 끊는다.
"저 질문이 있습니다!"

바로 이 학생이 한 행동을 인터럽트(interrupt)라고 한다. 즉, CPU의 정상적인 프로그램 실행 을 방해했다는 의미다. 이때 박찬호 선수는 질문을 먼저 처리하고, 다시 원래 했던 얘기로 돌아가 입답을 펼칠 것이다.

인터럽트는 크게 내부 인터럽트와 외부 인터럽트 두 가지 종류가 있다. 어떤 경우에는 하드웨어 인터럽트와 소프트웨어 인터럽트 두 가지 경우로 나누는 경우도 있지만, 여기서는 전자를 간략하게 소개한다.

내부 인터럽트

  1. 하드웨어 고장(Hardware Interrupt)
    • 컴퓨터 고장
    • 데이터 전달 과정에서의 비트 오류
    • 전원이 나간 경우
  2. 실행할 수 없는 명령어 : 기억장치에서 인출한 명령어의 비트 패턴이 정의되어 있지 않은 경우
  3. 명령어 실행 오류 : 나누기 0을 하는 경우
  4. 사용 권한 위배 : 사용자가 운영체제만 사용할 수 있는 자원에 액세스하는 경우

외부 인터럽트

외부 인터럽트는 주로 입출력장치 에 의해 발생된다.

  1. 타이머 인터럽트 : 타이머가 일정한 시간 간격으로 중앙처리장치에게 인터럽트를 요청
  2. 입출력 인터럽트 : 속도가 느린 입출력장치가 입출력 준비가 완료되었음을 알리기 위해 인터럽트를 요청

인터럽트 처리 과정

2011110800000000000046311

이제 질문을 받았으니, 박찬호 선수가 이 질문을 처리하는 과정들을 살펴보도록 하자.

스크린샷, 2018-01-10 18-48-00

위 그림이 시사하는 바는 다음과 같다. 우선, 명령어 사이클은 인출(fetch stage)실행(execution stage) 두 가지 단계를 반복해서 수행한다. 그런데 인터럽트 요청이 들어왔다고 해서 바로 이를 처리하는 것이 아니라, 명령어 N의 실행 단계를 마쳐야 한다. 명령어의 실행단계를 마칠 때마다 중앙처리장치는 반복적으로 인터럽트 요청이 있는지 계속해서 확인한다. 인터럽트 요청이 있어야 인터럽트 서비스 단계를 진행한다.

좀 더 큰 개념으로 살펴본다면 아래와 같은 그림이 된다.

스크린샷, 2018-01-10 17-58-38

시험공부할 때 이 부분이 어려워서, 4-5번 계속 반복해서 읽었던 기억이 난다. 한번에 이해가 되지 않는다고 해서 좌절할 필요가 없다. 다시 한번 보면 된다.

박찬호 선수가 선발등판할 떄 루틴은 경기 시작 1시간 20분 전에 나와 러닝과 스트레칭으로 몸을 푼다.
그는 "메이저리그때부터 지켜온 루틴"이라고 말했다.
 - SBS 스포츠 2012817일 기사

루틴(routine)이라는 말은, 운동선수에게 반드시 따라다니는 말이기도 한데, 반복적으로 수행하는 일을 의미한다. 인터럽트 처리과정에서 가장 핵심적인 내용은 인터럽트 서비스 루틴이다. 즉, 어떤 소스(source)가 인터럽트 요청을 하면 반복적으로 수행하는 일이 있다는 뜻이다. 다른 말로 인터럽트 핸들러(interrupt handler)라고도 한다.

소스(source)마다 처리해달라고 하는 일은 서로 다르다. 그래서 기억장치 어딘가에 서로 다른 일을 처리할 수 있도록 루틴들을 (기억장치에) )저장해두었다. 내가 이 부분에 대해서 학습하면서 '뭔가 독특한데?' 라고 느꼈던 부분은 인터럽스 서비스 루틴 역시 기억장치 내에 저장되어 있는 프로그램(program)이라는 점이다.

인터럽트 벡터
아키텍처 구조에 따라 인터럽트 벡터를 서로 다르게 지정한다. 위 표는 AVR ATmega128 마이크로컨트롤러가 정의하는 인터럽트 벡터의 일부다. 위에서 언급했던 내부 / 외부 인터럽트에 대해 상황처리를 서로 다른 주소에서 처리하는 것을 알 수 있다.

인터럽트 번호는 예외상황 인터럽트를 제외하고 운영체제가 결정한다. 리눅스에서 인터럽트 번호는 아래와 같다.

0 ~ 31 : 예외상황 인터럽트
32 ~ 47 :  하드웨어 인터럽트
128 : 시스템 콜

마무리

인터럽트가 무엇인지 간단하게 이해할 수 있을 정도의 깊이로만 포스팅하려고 한다. 내가 배운 부분이 이정도 수준까지이기도 하다. 나중에 기회가 된다면 입출력장치에서 발생하는 인터럽트에 대해 포스팅하고자 한다.