Published on

인터럽트(interrupt)

Authors
  • avatar
    Name
    유사공대생
    Twitter

순서도

image

참을성 많은 사람이 집에 왔다면 이런 식으로 처리해도 문제가 없을 것이다. 하지만 서명해야 하는 중요한 소포가 배달됐다고 가정하자. 쿠키 냄새를 맡고 조금 얻어먹기 위해 기다리는 경우 가 아니라면. 배달 기사가 45분씩 기다려주지는 않을 것이다. 다른 방식으로 처리 해보자.

폴링(polling)

image

이런 방법을 폴링(polling)이라고 부른다. 폴링은 어느 정도 잘 작동하지만 아주 잘 작동하지는 않는다. 배달 온 소포를 못 받을 가능성은 적어지지만 문 앞에 누가 왔는지 검사하는 데 너무 많은 시간을 소모한다.

이 문제는 일반적이며 아주 중요한 문제이지만 이런 문제를 소프트웨어적으로 해결할 수 있는 방법은 없다. 프로그램의 구조를 잘 재배치해서 이런 작업을 더 잘 처리하는 것은 불가능하다.

실행중인 프로그램을 잠깐 중단(interrupt)시켜서 주의를 기울여야 하는 외부의 요소에 대응할 수 있게 만들 방법이 필요하다.

인터럽트(interrupt) 시스템

요즘 쓰이는 프로세서 대부분은 인터럽트(interrupt) 시스템이 들어간다. 인터럽트 시스템은 적절한 신호가 들어오면 CPU 실행을 잠깐 중단시킬 수 있는 핀이나 전기 연결을 포함한다.

핀(pin)은 칩에 연결된 전기적 접점을 뜻하는 말이다. 칩에는 핀처럼 보이는 부품이 있는 경우가 많았지만, 장치 크기가 줄어듦에 따라 다른 방식도 쓰이기 시작했다. 많은 프로세서 칩에는 통합 주변장치(integrated peripheral)가 들어있고, 이런 장치들은 내부적으로 인터럽트 시스템에 연결되어 있다.

인터럽트 시스템이 작동하는 방식

CPU가 주의를 기울여야 하는 주변장치는 인터럽트 요청(interrupt request)을 생성한다. 프로세서는 현재 실행 중인 명령어를 끝까지 실행한다. 그 후 프로세서는 현재 실행 중인 프로그램을 잠시 중단시키고 인터럽트 핸들러(interrupt handler)라는 전혀 다른 프로그램을 실행하기 시작한다. 인터럽트 핸들러가 필요한 작업을 다 마치고 나면 원해 실행 중이던 프로그램이 중단된 위치부터 다시 실행을 계속한다. 인터럽트 핸들러는 함수다.

인터럽트 시스템은 서비스 후 돌아올 프로그램 위치를 스택에 저장한다. 인터럽트 핸들러는 자신이 엎어쓸 레지스터를 모두 저장해야 할 책임이 있다. 이렇게 약속하면 인터럽트 핸들러가 저장해야 하는 요소를 최소화해서 가장 빨리 인터럽트를 서비스할 수 있다.

컴퓨터가 어떻게 인터럽트 핸들러 위치를 찾을 수 있을까? 보통은 인터럽트 핸들러 주소를 저장하기로 약속한 메모리 주소가 존재한다. 이 주소에는 여러 인터럽트 벡터가 들어 있고, 각 인터럽트 벡터는 CPU가 지원하는 각 인터럽트에 대한 핸들러 주소를 지정한다. 인터럽트 벡터는 단지 메모리 위치를 가리키는 포인터일 뿐이다. 인터럽트가 일어나면 컴퓨터는 인터럽트 벡터에 저장된 주소를 살펴보고 제어를 그 주소로 옮긴다.(즉 프로그램 카운터를 벡터에 저장된 갑으로 설정한다.)

전형적인 경우 여러 가지 종류의 특별한 인터럽트 제어가 가능하다.

예를 들어 어떤 인터럽트를 켜거나 끌 수 있다. 마치 '문이 열려 있는 동안에는 나를 방해하지 마세요'라고 말하는 것처럼, 인터럽트를 중단시킬 수 있는 마스크(mask)가 있는 경우가 자주 있다. 인터럽트가 많이 있는 기계에는 종종 인터럽트 간의 우선순위(priority)가 있어서 더 중요한 인터럽트를 더 먼저 처리하게 해준다. 이 말은 우선순위가 낮은 인터럽트를 서비스하는 인터럽트 핸들러는 더 높은 인터럽트가 발생하면 일시 중단될 수도 있다는 것이다. 대부분의 기계에는 일정 시간이 지나면(또는 일정 시간 간격으로) 인터럽트를 발생시킬 수 있는 내장 타이머(timer)도 하나 이상 들어 있다.