이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
이전에 Process의 상태와 상태 전이에 대해 포스팅을 했다.
그 중 running → waiting은 Interrupt(time-out)에 의해 상태 전이가 발생하는데, Interrupt에 대해 더 자세히 알아보자.
✅ Interrupt란? 왜 사용할까?
Interrupt(인터럽트)란, 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때,
입출력 하드웨어 등의 장치에 예외사항이 발생하여 처리가 필요한 경우에, 마이크로프로세서(CPU)에게 알려 처리할 수 있도록 하는 것을 말한다.
출처: wikipedia
조금 더 풀어서 이야기해보기 위해, Core가 하나인 CPU를 예로 들어보자.
(최근의 CPU들은 여러 개의 Core를 가지고 있는 Multi-core CPU지만, 설명의 용이성을 위해 위처럼 설정했습니다!)
사용자가 여러 프로그램을 실행시켜 프로세스A, 프로세스B, 프로세스C가 있다고 가정해보자.
현재 CPU에게 프로세스A가 할당되어 실행되고 있다가 사용자의 입력을 받아야하는 상황이 발생한다.
이 때 별도의 처리가 없다면 CPU는 사용자의 입력을 받을 때까지 프로세스A를 계속 붙잡고 있을 것이다.
만일 사용자의 입력을 받을 때까지 아주 오래걸린다면 프로세스B와 프로세스C가 실행되지 못해 사용성이 떨어질 뿐 더러, CPU의 처리량/활용도도 현저히 낮아질 것이다.
만일 Interrupt를 활용하여 프로세스A가 사용자의 입출력을 요구할 때, CPU를 프로세스B 또는 프로세스C에게 할당한다면 CPU를 더 효율적으로 사용할 수 있을 것이다!
이러한 이유로 인해 운영체제는 Interrupt를 통해 프로세스들의 상태를 변경하여 관리한다. (interrupt driven)
✅ Interrupt의 종류
Interrupt의 종류는 크게 Software interrupt(내부 인터럽트)와 Hardware interrupt(외부 인터럽트)로 나눌 수 있다.
🎯 Hardware interrupt (외부 인터럽트)
컴퓨터의 외부기기(키보드, 마우스, 프린터기 등)과 같은 외부 주변장치 등에 의해 비동기적으로 발생되는 interrupt이다.
외부 주변장치가 자신에게 발생한 사건을 운영체제의 Kernel에게 알리는 수단이다.
- Power fail interrupt: 정전, 파워 이상과 같은 경우
- Machine check interrupt: CPU의 기능적인 오류
- Timer interrupt
프로세스가 CPU 자원을 너무 오랫동안 점유하고 있지 못하도록 하기 위해 사용할 수 있는 시간을 제한한다.
프로세스가 작업을 완료하지 못했더라도, 주어진 시간을 초과한다면 interrupt를 발생시킨다. - I/O interrupt
- 입출력장치가 데이터 전송을 요구하거나, 전송이 완료되어 다음 동작이 수행되어야 하는 경우
- 입출력 데이터에 이상이 있는 경우
🎯 Software interrupt (내부 인터럽트)
소프트웨어 인터럽트는 특정 event가 발생했을 때 interrupt을 발생시켜 신호를 보내며, exception(trap)과 SVC interrupt가 있다.
0으로 나누는 경우 혹은 OS의 요청과 같은 소프트웨어적인 오류 로 인해 발생하거나, System call을 위해 소프트웨어적인 요청을 하여 발생한다.
- Exception(trap) interrupt
프로세스를 실행하던 중, 0으로 나누는 비정상적인 작업을 시도하거나, Overflow/Underflow 또는 기타 예외 경우에 발생한다.
메모리 영역 바깥에 접근하려는 시도와 같이 권한이 없는 작업을 시도할 때, CPU가 처리할 수 없으므로 Exception interrupt가 발생한다.
- SVC interrupt
Supervisor Call의 줄임말로서, System call의 호출을 필요로 할 때 발생한다.
프로그램 처리 중 명령의 요청에 의해서 발생하며, 대표적으로 사용자가 프로그램을 실행시킬 때 발생한다.
✅ Interrupt의 처리 방법
- 인터럽트 발생
- 프로그램 실행 중단: 현재 실행 중이던 명령어까지 수행한 후, 실행을 중단
- 현재 프로그램의 상태 보존
인터럽트 처리 후, 현재의 프로그램으로 복귀하기 위해 PC(Program Counter)의 값을 PCB에 저장한다. - 인터럽트 처리 루틴 실행
인터럽트를 요청한 장치를 식별 - 인터럽트 서비스 루틴(ISR) 실행
인터럽트 원인을 파악하고 실질적인 작업을 수행하는 단계이다.
서비스 루틴을 실행하던 중, 우선순위가 더 높은 interrupt가 발생하면, 1~5 과정을 재귀적으로 수행한다. - 상태 복구
인터럽트 발생 시 저장해 둔 PCB의 PC(Program Counter) 정보를 활용하여, 프로세스가 이전에 실행했던 위치로 복원한다. - 중단된 프로그램의 실행 재개
PCB에 저장해 둔 값들을 활용하여, 이전에 실행했던 프로세스의 실행을 재개한다.
✅ Interrupt 우선순위
- 전원 이상(Power fail)
- 기계 착오(Machine Check)
- 외부 신호(External)
- 입출력(I/O)
- 명령어 오류
- 프로그램 검사(Program check)
- SVC(SuperVisor Call)
대체로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선 순위가 높고, 내부 인터럽트보다 외부 인터럽트의 우선순위가 더 높다.
✅ Interrupt 우선순위 판별 방법
🎯 Polling (소프트웨어적인 방법)
사용자가 명령어를 사용 해 입력 핀의 값을 계속 읽어 변화를 알아내는 방식
인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트를 찾고, 이에 해당하는 인터럽트 서비스 루틴(ISR)을 수행한다.
많은 인터럽트가 발생한 경우, 하드웨어적인 방식에 비해 우선순위 판단 속도가 느리지만,
회로가 간단하고 융통성이 있으며(우선순위 변경이 쉽다) 별도의 하드웨어가 필요없다는 장점이 있다.
🎯 Vectored Interrupt (하드웨어적인 방법)
- Daisy chain
우선순위가 높은 장치를 상위에 두고, 우선순위 차례대로 배치 - Parallel(병렬) 우선순위 부여 방식