인터럽트(Interrupt)
인터럽트는 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 일시 중단하고, 발생된 상황을 우선 처리한 후 실행 중이던 작업으로 복귀하여 계속 처리하는 것을 말한다.
즉, 인터럽트는 어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키고 다른 작업을 처리한다.
인터럽트가 발생되면 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수가 실행된다.
인터럽트가 필요한 이유
선점형 스케줄링 알고리즘을 보면 어떤 프로세스가 Running 상태에서 다른 프로세스로 교체하기 위해 스케줄러가 작업을 중단시키게 된다.
프로세스가 스스로 결정하는 것은 진행 중에 I/O 장치 혹은 다른 작업을 진행해야 해서 Block 상태가 되는 것과 프로세스가 종료되서 Exit 상태가 되는 것으로 Running 상태에서는 스케줄러에 의해 강제로 Ready 상태가 된다.
이를 통해서 알 수 있는 것은 프로세스가 스스로 중단을 할 수 없고 스케줄러에 의해서 강제로 중단되는데 이 때 필요한 기능이 인터럽트이다.
인터럽트의 동작 및 처리
인터럽트가 발생하면 CPU는 운영체제에게 제어권을 주고 커널 영역 내에서 해당 인터럽트의 처리를 위해서 정의된 코드를 찾는다.
운영체제는 쉽게 찾아가기 위해 인터럽트 벡터라는 것을 가지고 있는데 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 구조이다.
실제 처리해야 할 코드는 인터럽트 처리루틴(ISR, Interrupt service routine) 또는 인터럽트 핸들러라고 부르게 되는데 해당 인터럽트 핸들러는 여러가지 인터럽트에 대해 각각 처리해야 할 업무들을 정의해 놓는다.
인터럽트 핸들러를 통해서 처리해야 할 업무가 완료되면 다시 인터럽트 발생하기 전에 수행하고 있었던 프로세스로 다시 돌아가게 된다.
그렇다면 어떻게 인터럽트가 발생하기 전에 수행되고 있던 프로세스를 알 수 있을지 생각해 볼 필요가 있다.
먼저 현재 실행하던 프로그램(인터럽트가 발생하기 전에 실행 중인 프로세스)으로 복귀할 때 필요한 정보(Context)를 저장한다.
그다음 인터럽트를 요청한 소스를 확인하고 해당 인터럽트 핸들러를 실행할 수 있도록 준비한다.
인터럽트의 종류
인터럽트 간에는 우선순위가 있고 우선순위에 따라 실행되며 또한, 인터럽트는 하드웨어 인터럽트, 소프트웨어 인터럽트 두 가지로 구분할 수 있다.
하드웨어 인터럽트 / 외부 인터럽트
키보드를 연결한다거나 마우스를 연결하는 일 등의 IO 디바이스에서 발생하는 인터럽트를 의미한다.
인터럽트 라인이 설계된 이후 순차적인 인터럽트 실행을 중지하고 운영체제에 시스템콜을 요청해서 원하는 디바이스로 향해 디바이스에 있는 작은 로컬 버퍼에 접근하여 작업을 수행하게 된다.
- 타이머 인터럽트
프로세스에 할당된 시간이 지나면 다른 프로세스를 수행할 수 있게 인터럽트를 거는 것이다.
입출력 장치 중에서 타이머라는 장치가 있는데 해당 장치가 일정 시간이 지나면 CPU한테 다른 프로세스를 작업하도록 시킨다.
타이머 인터럽트는 보통 10ms마다 인터럽트를 걸어서 다른 프로세스로 문맥교환이 일어난다.
- I/O 인터럽트
I/O 인터럽트는 입출력 장치에 의해서 일어나는 인터럽트로 키보드로 어떤 것을 작성하거나 프린터에서 출력을 한다던지 이러한 작업에서 I/O 인터럽트가 발생한다.
- 전원 이상 인터럽트
갑자기 전원 공급이 중단되면 CPU에 인터럽트를 걸어서 현재 작업 중이던 프로세스를 대피시킨다.
소프트웨어 인터럽트 / 내부 인터럽트
CPU가 명령어를 수행하고 있다가 자신이 처리할 수 없는 명령이면 자기 자신한테 인터럽트를 건다.
트랩이라고도 불리며 프로세스 오류 등으로 프로세스가 시스템 콜을 호출할 때 발동한다.
- Exception 인터럽트(Trap)
트랩이라고 불리는 인터럽트로 대표적으로 0으로 나누는 비정상적인 작업을 시도하거나 오버플로우/언더플로우와 같이 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 처리하는 인터럽트이다.
CPU가 명령어를 수행하다가 처리할 수 없는 예외상황을 만나면 자기 자신을 인터럽트 걸어서 커널의 처리 루틴으로 간다.
- 시스템 콜 인터럽트
시스템 콜 인터럽트는 운영체제에 서비스를 요청하기 위해 인터럽트를 걸고 커널 모드로 전환하는 시스템 콜을 의미한다.
시스템 콜도 내부적으로 인터럽트와 같은 방식으로 동작하게 되므로 하나의 인터럽트로 취급된다.
- 이중 동작 모드(Dual-Mode Operation)
사용자와 OS는 시스템 자원을 공유하기 때문에 사용자에 제한을 두지 않으면 사용자가 메모리 내 주요 자원을 망가뜨릴 위험이 있다.
따라서 사용자의 시스템 자원을 막는 보호 장치가 필요하게 되는데 이 것이 이중 동작 모드이다.
이중 동작 모드는 사용자가 접근할 수 없는 커널 모드, 접근할 수 있는 사용자 모드로 나뉜다.
프로세스는 사용자 모드에서 실행되다가 OS에게 시스템 사용을 요청하면 커널 모드로 전환되어 요청된 시스템을 실행한 후 다시 사용자 모드로 전환한다.
커널 모드와 사용자 모드를 구분하기 위해 modebit를 사용하게 되며 0은 커널 모드, 1은 사용자 모드로 구분된다.
OS는 커널 모드에서만 실행될 수 있는 명령어를 미리 지정해놓고 실행하게 되며 사용자 모드에서 해당 명령어를 실행하려고 하면 trap을 건다.
'CS > OS' 카테고리의 다른 글
운영체제 - PCB와 Context Switching (0) | 2024.06.27 |
---|---|
운영체제 - 시스템 콜 (0) | 2024.06.26 |
운영체제 - CPU 스케줄링 알고리즘 (0) | 2023.10.26 |
운영체제 - 프로세스와 스레드 (0) | 2023.10.24 |
운영체제 - 메모리 (2) | 2023.10.23 |