인터럽트 (interrupt)

2020. 1. 26. 17:24컴퓨터공학기초 및 이론/운영체제

인터럽트란? CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 CPU에 알려서 처리하는 기술 

가령 선점형 스케쥴러를 구현할 때, 프로세스 running중에 스케쥴러가 이를 중단시키기 위해서는 스케쥴러 코드가 실행되어야함, 이 때 스케쥴러 코드가 실행되어야 한다는 것을 cpu에 알리는 것이 인터럽트의 역할.

또한 IO Device를 이용하면서 프로세스가 blocking 상태였다가 IO 사용이 끝난뒤에 다시 ready 상태로 돌아가야할 때에도 IO Device를 체크하여 CPU에게 알리는 것 또한 인터럽트의 역할

즉, 인터럽트는 예외 상황을 핸들링 하는 것, CPU가 프로그램을 실행하는 도중에 입출력 하드웨어 등의 장치나 또는 예외상황이 발생할 경우 CPU가 해당 처리를 할 수 있도록 CPU에 알려줘야 함.

인터럽트 처리 예

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

  * 입출력 하드웨어 등의 장치 이슈 발생

  - 파일 처리가 끝났다는 것을 운영체제에 알려주기 // 운영체제는 해당 프로세스를 block에서 ready로 상태 변경

  * 예외 상황이 발생

  - 0으로 나누는 계산이 발생(있을 수 없는 일)해서, 예외 발생을 운영체제에 알려 해당 프로세스 실행 중지/에러 표시

- 인터럽트는 일종의 이벤트로 불리며 이벤트에 맞게 운영체제가 처리한다

주요 인터럽트 예시

1. 0으로 나누는 코드 실행시

#include <stdio.h>

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

2. 타이머 인터럽트

일정시간(아주 짧은시간)마다 하드웨어로부터 인터럽트를 운영체제에 알려주는 방식, 선점형 스케쥴러를 위해 필요(시분할)

3. 입출력 인터럽트

프린터/키보드/마우스/저장매체등에서 운영체제에 알리는 방식

인터럽트의 종류

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

  *주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용시 발생

    - 0 으로 나눴을 때, 사용자 모드에서 허용되지 않은 명령 또는 공간 접근시, 계산 결과가 Overflow/Underflow 날 때

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

  * 주로 하드웨어에서 발생되는 이벤트(프로그램 외부)

    -전원 이상, 기계 문제, 키보드 등 IO 관련 이벤트, Timer 이벤트

시스템 콜 인터럽트

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

- 시스템 콜 실제 코드

  * eax 레지스터에 시스템 콜 번호를 넣고, ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고, 소프트웨어 인터럽트 명령을 호출하면서 0X80(미리 정해져있음 운영체제마다) 값을 넘겨줌

mov eax, 1 // 숫자는 시스템 콜 번호
mov ebx, 0
int 0x80 // 소프트웨어 인터럽트 명령

1. CPU는 사용자 모드를 커널모드로 바꿔줌

2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행함

3. system_call() 함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동

4. 해당 시스템콜 함수 실행 후, 다시 커널모드에서 사용자모드로 변경하고, 다시 해당 프로세스 다음 코드 진행

인터럽트는 미리 정의되어 각각 번호와 실행코드를 가리키는 주소가 IDT에 기록되어 있다. 컴퓨터 부팅시 운영체제가 기록하며 운영체제 내부에 있는 코드이다. 즉, 항상 인터럽트 발생시 IDT를 확인하며, 인터럽트에 해당하는 번호 명령어에 따라 IDT에 매핑되어 있는 대로 처리한다.

프로세스와 인터럽트를 오가며 user mode와 kernel mode가 계속 바뀌는 것을 알 수 있다

또한 선점형 스케쥴러 구현에 따른 타이머 인터럽트의 경우, 운영체제가 타이머 인터럽트 발생 횟수에 따라 프로세스를 바꿔주거나 하는 식으로 활용된다.