본문 바로가기
Computer Science

인터럽트

by 개발자 데이빗 2021. 12. 26.

인터럽트란 

cpu가 프로그램을 실행하고 있을 때,

입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 cpu에 알려서 처리하는 기술

특정 이벤트가 발생했을때 cpu에 인터럽트를 걸어준다.

 

이벤트와 인터럽트

인터럽트는 일종의 이벤트로 불림

이벤트에 맞게 운영체제가 처리한다.

 

인터럽트 필요 이유

어느 한순간 cpu가 실행하는 명령은 하나이기 때문에 입출력 하드위에 등의 장치나 예외상항이 발생한 경우 cpu가 해당 처리를 할 수 있도록 cpu에 알려줘야한다.

 

인터럽트 처리 예시

예외 상황 핸들링

코드에 오류가 있어 해당 응용프로그램을 종료(Kill) 하는 경우 해당 예외사항을 cpu에 알려주기 위해 인터럽트가 필요하다.

ex) 숫자를 0으로 나누는 경우의 예시 코드

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
    int data;
    int divider = 0;
    data = 1 / divider; // 이 부분에서 인터럽트가 발생
    return 0;
}

 

선점형 스케줄러 (타이머 인터럽트)

선점형 스케줄러의 경우 running 중인 프로세스를 다른 프로세스로 교체하기 위해

스케줄러가 이를 중단시키고(인터럽트) 다른 프로세스를 실행 시킨다.

하드웨어로부터 일정 시간마다 타이머 인터럽트를 운영체제에 알려주는 방식

 

IO Device 와의 커뮤니케이션 (입출력 인터럽트)

저장매체에서 데이터 처리 완료 또는 키보드 입력, 마우스 이동 등의 이벤트 발생 시, 프로세스를 깨워야 한다. (block state -> ready state) 

 

인터럽트의 종류

내부 인터럽트 (소프트웨어 인터럽트)

  • 주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용시 발생
    • 사용자 모드에서 허용되지 않은 명령 또는 공간 접근 시 (C언어의 포인터가 커널모드의 주소를 가리키는 경우)
    • 계산 결과가 Overflow/Underflow가 날 때 (변수가 표현할 수 있는 범위를 벗어날때)
    • 0으로 나눴을 때

외부 인터럽트 (하드웨어 인터럽트)

  • 주로 하드웨어에서 발생되는 이벤트
    • 전원 이상
    • 기계 문제
    • IO 관련 이벤트
    • Timer 이벤트

시스템 콜 인터럽트

시스템 콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어, cpu에게 실행시켜야 한다.

 

시스템콜 실제 코드 (unix)

  • eax 레지스터에 시스템 콜 번호를 넣고
  • ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고
  • 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨준다.
    • cpu는 사용자 모드를 커널 모드로 바꿔준다 (int라는 opcode가 해당 역할 수행)
    • IDT(Interrupt Descriptor Table) 에서 0x80에 해당하는 주소(함수)를 찾아서 실행한다.
    • system_call() 함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동한다.
    • 해당 시스템콜 함수 실행 후 다시 사용자 모드로 변경하고 다음 코드를 실행한다.
mov eax, 1 // 시스템 콜 번호
mov ebx, 0 // 시스템 콜 인자
int 0x80 // 소프트웨어 인터럽트 명령

 

인터럽트와 IDT

인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있다.

컴퓨터 부팅시 운영체제가 IDT (Interrupt Descriptor Table)에 운영체제 내부 코드(커널모드/커널영역)를 기록한다.

 

리눅스의 인터럽트 번호

  • 0~31: 예외상황 인터럽트 (일부는 정의되지 않음)
  • 32~47: 하드웨어 인터럽트 (주변장치 종류/갯수에 따라 변경 가능)
  • 128: 시스템 콜

 

정리

인터럽트와 프로세스

  1. 프로세스 실행 중 인터럽트 발생
  2. 현 프로세스 실행 중단
  3. 인터럽트 처리 함수 실행 (운영체제)
  4. 현 프로세스 재실행

댓글