본문 바로가기
Computer Science/Operating System

인터럽트, Interrupt

by rueMi 2023. 11. 22.

인터럽트, Interrupt

인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.

대부분 컴퓨터는 한 개의 CPU를 사용하므로 한 순간에는 하나의 일 밖에 처리할 수 없다. 따라서 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리할 필요가 있을 때, 인터럽트를 사용할 수 있다.

 

인터럽트 종류

일반적으로 사용되는 인터럽트는 다음과 같이 크게 두 가지로 나눠볼 수 있다.

 

외부 인터럽트 === 하드웨어 인터럽트

입출력 장치, 타이밍 장치, 전원 등의 하드웨어와 같이 외부적인 요인에 의해서 발생하는 인터럽트이다.

  • 전원 이상 인터럽트 : 정전이나 전원에 이상이 있는 경우
  • 기계 고장 인터럽트 : CPU 등의 기능적인 동작 오류가 발생한 경우
  • 입출력 인터럽트(I/O Interrupt) : 입출력의 종료 등의 이유로 CPU 수행을 요청하는 인터럽트

예시 중 입출력 인터럽트와 타이머 인터럽트에 대해서 좀 더 자세히 살펴보자

 

입출력 인터럽트, I/O Interrupt

입출력 인터럽트는 입출력 기기들, 즉 키보드, 마우스, 프린터 등에 의해 발생하는 인터럽트이다. 마우스에 대한 자세한 예시를 들어보자.

 

🧐 마우스 커서를 움직일 때

  1. 마우스를 움직이면 CPU에 전기 신호(인터럽트)를 보내준다.
  2. CPU가 인터럽트를 감지하면 현재 작업을 중단하고, OS 내부에 있는 Mouse Interrupt Service Routine으로 점프한다.
  3. Mouse Interrupt Service Routine은 커서를 이동시킨 좌표를 모니터상에 표현해주는 역할을 한다.

 

🧐 마우스를 더블 클릭한 경우

  1. 마우스를 더블 클릭하면 CPU에 전기 신호(인터럽트)를 보내준다.
  2. CPU가 인터럽트를 감지하면 현재 작업을 중단하고, OS 내부에 있는 Mouse Interrupt Service Routine으로 점프한다.
  3. Mouse Interrupt Service Routine은 커서가 더블 클릭한 좌표에 있는 아이콘(프로그램)을 실행한다. 즉, 디스크에서 프로그램을 찾아 메모리에 올린다.

 

타이머 인터럽트, Timer

CPU는 코어가 하나인 경우 한 번에 하나의 프로세스만 수행할 수 있다. 따라서 여러 개의 프로세스를 실행해야 하는 멀티 프로세스 환경에서는 CPU 스케쥴링을 통해 여러 개의 프로세스를 돌아가며 수행할 수 있다.

 

이때 CPU 스케쥴링 방식은 선점 방식과 비선점 방식으로 나뉜다. 선점 방식은 프로세스마다 CPU를 사용할 수 있는 제한 시간을 정하고, 제한 시간이 지나면 CPU를 점유하는 프로세스에게서 CPU를 강제로 빼앗을 수 있는 방식이고, 비선점 방식은 강제로 빼앗을 수 없는 방식을 말한다. 여기서 선점 방식을 사용할 때 이 타이머 인터럽트가 필요하다.

 

타이머 인터럽트를 발생시키는 장치가 컴퓨터 안에 칩으로 존재하는데, 해당 칩에서 일정 간격으로 인터럽트를 계속해서 발생시킨다. 여기서는 1초를 주기로 인터럽트를 발생시킨다고 가정하겠다.

 

그러면 하드웨어에서는 1초 간격으로 운영체제에게 인터럽트를 발생시키고, 그것을 받은 운영체제는 해당 인터럽트를 누적시켜서 가지고 있다.

 

여기서 우리가 선점 스케줄러를 사용하고, 10초마다 프로세스를 교체한다고 가정한다면, 운영체제는 하드웨어로부터 받은 인터럽트의 누적이 10초가 되는 순간 프로세스를 교체해야 한다는 것을 알 수 있다. 이것이 선점형 스케줄러에 사용되는 외부 인터럽트 처리 방법이다.

 

전원 이상 인터럽트

컴퓨터를 하다가 갑자기 전원 공급이 중단되는 등의 문제가 생기면 CPU에 인터럽트를 걸어서 현재 작업 중이던 프로세스를 대피시킬 수 있도록 하는 신호를 걸어줘야 한다.

 


내부 인터럽트 === 소프트웨어 인터럽트

소프트웨어 상에서 잘못된 명령이나 데이터를 사용할 때 발생하는 인터럽트이다.

  • 예외 발생
    • 0으로 나누는 경우
    • 오버플로우, 언더플로우 발생한 경우
  • 프로그램 상의 오류
  • 프로그램에서 함수 등 명령어를 잘못 사용한 경우
  • 소프트웨어 인터럽트 : CPU가 인스트럭션을 수행하는 도중에 일어나는 인터럽트

 

Exception Interrupt, Trap

프로그래밍 상 예외, 트랩이라고도 불린다.

대표적으로 0으로 나누는 비정상적인 작업을 시도하거나 오버플로우 / 언더플로우와 같이 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 처리하는 인터럽트이다.

즉, 이와 같이 CPU가 수행할 수 없는 예외 상황을 만나면 CPU는 자기 자신을 인터럽트 걸어서 커널의 처리 루틴으로 가게 된다.

 

SVC Interrupt, Supervisor Call

SVC 인터럽트란 Supervisor Call로 운영체제를 호출해서 처리하라는 의미이다. 즉 시스템콜과 같은 맥락이다.

사용자 프로그램에 open(”a.txt”)라는 명령어가 들어왔을 경우를 생각해보자. 이 명령어는 사용자 프로그램이 처리할 수 없고, 운영체제 내부에 정의된 코드를 실행해야 하기 때문에 커널 모드로 전환해야 한다.

즉, 운영체제에 서비스를 요청하기 위해 인터럽트를 걸고 커널 모드로 전환하는 인터럽트이다.

 

인터럽트 처리 과정

인터럽트 서비스 루틴, ISR, Interrupt Service Routine

인터럽트가 발생하면 처리하기 위한 루틴인 ISR이 실행된다.

Interrupt Service Routine

  1. 주 프로그램 실행
  2. 인터럽트 발생
  3. 복귀주소 저장
  4. 인터럽트 백터로 점프
  5. 인터럽트 처리
  6. 인터럽트 처리 완료
  7. 복귀 주소 로드
  8. 마지막에 실행되던 주소로 점프
  9. 주 프로그램 실행

예시

시스템 콜을 예를 들어 인터럽트 처리 과정을 좀 더 자세히 살펴보자

 

🧐 open(”data.txt”.0_READONLY); 시스템 콜 실행

해당 코드를 기계어로 번역하면 다음과 같다.

mov eax, 5 //5는 시스템 콜 고유 번호
mov ebx, 0 //0은 인자
int 0x80   //소프트웨어 인터럽트 명령
  1. eax 레지스터에 시스템 콜 고유 번호를 넣는다
  2. ebs 레지스터에 인자 값을 넣는다. 여기서는 “data.txt”.0_READONLY 가 인자이다.
  3. 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨준다.

항상 마지막에 int 0x80 명령어가 들어가는데, 이는 CPU가 제공하는 OP code에 해당하는 int와 인터럽트 번호를 넣어주는 명령어이다. 즉 여기서 0x80이 의미하는 것이 바로 시스템 콜 번호이다.

그렇다면 시스템 콜 인터럽트 명령을 호출하면서 0x80 값(시스템 콜 번호)를 넘겨주면 어떤 일이 일어날까?

  1. “int”라는 OP code로, CPU는 사용자 모드를 커널 모드로 변경한다.
  2. IDT(Interrupt Descriptor Table)를 통해 인터럽트 번호에 해당하는 코드가 들어있는 주소(함수)를 얻는다.
  3. 해당 인터럽트 핸들러를 실행한다.
  4. 실행이 완료되면 다시 사용자 모드로 변경되고, 해당 프로세스의 다음 코드를 실행한다.

즉 다음과 같이 사용자 모드와 커널 모드를 왔다 갔다 하며 인터럽트가 실행된다

 

 

🧐 IDT, Interrupt Descriptor Table

수 많은 이벤트를 처리하는 인터럽트는 고유 번호가 미리 정의되어 있다. 또한 이러한 인터럽트가 발생했을 때 각각 어떻게 처리할 지에 대한 코드들이 운영체제에 구현이 되어 있고, 이 코드는 IDT에 기록 되어 있다.

그럼 언제 IDT에 기록을 할까? 해당 코드를 사용하려면 프로세스 실행보다 먼저 기록되어 있어야 하기 때문에, 컴퓨터는 부팅 시에 바로 운영체제가 기록을 하기 시작한다. 또한 내부에서 실행하는 코드이므로 커널 영역에 위치하게 된다.

리눅스 예시

0~31 : 예외 상황 인터럽트(대부분 내부 인터럽트) 32~47 : 하드웨어 인터럽트(변경 가능) 128(0x80) : 시스템 콜

 


 

 

[운영체제 7편] 인터럽트가 무엇인가

안녕하세요~ 개발자 배씨입니다 :) ㅎㅎ 자! 오늘은 인터럽트가 무엇인지에 대해서 알아볼려고 해요~ 해당 주제를 어떻게 정리해야할 지 정말 까다로워서 며칠을 고민하고 수정했답니다. 또한,

baebalja.tistory.com

 

 

#7 운영체제 | 인터럽트는 무엇이고 왜 필요한가

인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.대부분의 컴퓨터는 한 개의 CPU를 사용하므로 한 순간에는 하나의 일 밖에 처리할 수

velog.io

 

 

인터럽트(Interrupt)란?

인터럽트 인터럽트란 프로세스 실행 도중 예기치 않은 상황이 발생할 때 발생한 상황을 처리한 후 실행 중인 작업으로 복귀하는 것을 말한다. 주로 입출력 장치의 signal, data가 발생할 때까지 원

velog.io