정의
프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요하다고 CPU에 알리는 것
지금 수행 중인 일보다 더 중요한 일(입출력, 우선 순위 연산 등)이 발생하면 그 일을 먼저 처리하고 나서 하던 일을 계속해야한다.
주 프로그램이 실행되다가 인터럽트가 발생했다. 현재 수행 중인 프로그램을 멈추고, 상태 레지스터와 PC 등을 스택에 저장한 뒤에 인터럽트 서비스 루틴으로 간다. 인터럽트 처리가 완료 되었다면, 마지막에 실행되던 주소로 점프하고, 주 프로그램을 실행한다.
이때, 인터럽트 기능이 없었다면, 컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크를 해주어야 될 것이다. 이러한 방식을 폴링이라고한다.
폴링
대상을 주기적으로 감시하여 상황이 발생하면 해당 처리 루틴을 실행해 처리한다. 폴링은 주기적으로 마이크로프로세서가 상태를 파악하기 위해 장치의 레지스터를 읽어야한다. 이 작업이 진행되는 동안 다른 장치는 체크가 힘들다. 그리고 이러한 작업은 장치의 상태를 읽는데 마이크로프로세서의 자원이 낭비된다.
컨트롤러가 입력을 받아들이는 방법(우선순위 판별방법)
- 폴링 방식 : 사용자가 명령어를 사용해 입력 핀의 값을 계속 읽어 변화를 알아내는 방식으로 인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾아 이에 맞는 인터럽트 서비스 루틴을 수행한다. (하드웨어에 비해 속도가 느리다.)
- 인터럽트 방식 : MCU 자체가 하드웨어적으로 변화를 체크하여 변화시에만 일정한 동작을 하는 방식 (Daisy Chain, 병렬 우선순위 부여)
인터럽트 방식은 하드웨어로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속하게 대응하는 것이 가능하다. 따라서, 실시간 대응이 필요할 때는 필수적인 기능이다. 즉, 인터럽트는 발생시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법이다.
인터럽트 발생 처리 과정
- 인터럽트 요청이 들어왔다.
- 현재 진행 중인 기계어 코드를 완료한다.
- CPU의 특수레지스터 중, 하이로인터럽트 마스크 비트를 보고 마스크 되면 인터럽트를 무시한다.
- 인터럽트 벡터를 읽어 ISR 주소 값을 얻는다.
- ISR로 점프한다. 이때 PC(Program Counter) 값은 자동 대피 저장된다.
- 현재 진행중인 프로그램의 레지스터를 대피한다.
- 해당 코드를 실행한다. (서비스 루틴 수행 중, 우선순위가 더 높은 인터럽트가 발생하면 재귀적으로 1 ~ 5 과정을 수행함)
- 해당 일을 다 처리하면, 대피시킨 레지스터를 복원한다.
- ISR의 끝에 IRET 명령어에 의해 인터럽트가 해제된다.
- IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행 위치로 복원한다.
보통 ISR로 들어가면서 CPU 코어의 인터럽트 마스크 비트를 자동 설정하고 시작되기 때문에 다른 인터럽트 처리는 대기 상태로 되는 경우가 일반적이다. 따라서, ISR 내에서 다른 인터럽트를 처리하고 싶을 경우 이 마스크 비트를 해제 해야 한다.
인터럽트 핸들러
CPU에서 인터럽트가 접수되면, 해당 인터럽트 핸들러의 코드의 위치를 찾고 실행에 옮긴다. 실행 중이던 레지스터와 PC를 보관함으로써 CPU의 상태를 보존한다. 인터럽트가 핸들링이 완료되면 이전의 상태로 복귀된다.
인터럽트 벡터
인터럽트 요청이 발생했을 때, CPU는 인터럽트 소스가 무엇이며, 해당 인터럽트 ISR이 어디에 적재되어있는지를 확인해야한다. 이 때, CPU는 인터럽트 벡터를 활용한다.
- 여러 종류의 인터럽트에 대한 ISR의 시작 주소
- 인터럽트 벡터 테이블 : 주기억장치의 특정 영역에 여러 개의 인터럽트에 대한 인터럽트 벡터를 모아놓은 영역
인터럽트의 종류
- 하드웨어 인터럽트
- 일반적인 인터럽트
- 하드웨어 컨트롤러가 CPU의 서비스를 요청하기 위해 발생시키는 인터럽트
- 운영체제의 타이머 인터럽트
- 각 프로그램들이 공평한 시간동안 CPU를 할당 받을 수 있도록 세팅된 시간동안 CPU를 사용하고, 사용 시간이 종료되면 인터럽트를 발생시킴
- 일반적인 인터럽트
- 소프트웨어 인터럽트 (Trap: 트랩)
- 예외 상황 (Exception)
- 프로그램이 허용되지 않은 연산을 수행하려 할 때, 자동으로 발생하는 인터럽트
- 예외 상황에 대한 처리 루틴을 자신의 코드 영역에 가지고 있음
- 예) 0으로 나누기, 권한 없는 메모리 참조 등..
- 시스템 콜 (System Call)
- 프로세스가 운영체제의 서비스를 요청하기 위해 커널의 함수를 호출하는 경우 발생하는 인터럽트
- 사용자 프로세스가 직접 특권 명령을 수행할 수 없으므로 특권 명령을 수행하려 할 때, 시스템 콜을 사용한다.
- 예외 상황 (Exception)
🐯소프트웨어 인터럽트 ⁉️
시스템 콜이나 예외 상황은 모두 사용자 프로세스로부터 CPU의 제어권이 운영체제에게 이양되어 처리되는데 이 과정에 인터럽트 라인을 세팅하여 인터럽트를 발생시킨 후 제어권이 넘어가게 되므로 이들도 넓은 의미에서는 인터럽트의 범주에 포함시킨다. 단지 인터럽트를 발생시키는 주체가 하드웨어 장치가 아닌 소프트웨어 이므로 이들을 소프트웨어 인터럽트라 부른다!
인터럽트 우선순위
정전, 전원 이상 인터럽트 → 기계 고장 인터럽트 → 외부 인터럽트 → 입출력 인터럽트 → 프로그램 검사 인터럽트 → SVC(SuperVisor Call)
❓면접 질문
답변 다듬기 전!!!!
Q1. 인터럽트란 무엇인가요?
인터럽트란 프로세스 실행 중에 예외상황이 발생하여 처리가 필요한 경우 CPU에게 알려 처리할 수 있도록 하는 것을 말합니다.
Q2. 인터럽트와 시스템 콜의 차이에 대해서 설명해주세요.
시스템 콜이나 예외 상황은 모두 사용자 프로세스로부터 CPU의 제어권이 운영체제에게 이양되어 처리되는데 이 과정에 인터럽트 라인을 세팅하여 인터럽트를 발생시킨 후 제어권이 넘어가게 되므로 이들도 넓은 의미에서는 인터럽트의 범주에 포함시킨다. 단지 인터럽트를 발생시키는 주체가 하드웨어 장치가 아닌 소프트웨어 이므로 이들을 소프트웨어 인터럽트라 부른다! 대체로 하드웨어 인터럽트를 인터럽트라고 부른다!
Q3. 한컴오피스 "한글"을 클릭 후 빈 화면에 커서가 깜빡이고 있다. 이때, Hello World를 작성하면 컴퓨터 내부에서 어떤 일이 발생하는가?
1) 키보드에서 사용자 입력이 들어오면 키보드 컨트롤러가 인터럽트를 발생시켜 CPU에게 키가 입력되었다는 사실을 알려준다.
2) CPU는 현재 수행중이던 작업의 상태를 저장하고 인터럽트 요청을 처리하기 위해 OS내에 정의된 키보드 인터럽트 처리 루틴을 찾아간다.
3) 키보드 인터럽트 처리 루틴은 키보드로부터 입력받은 내용을 메모리의 특정 부분에 저장해 해당 프로그램에게 키보드 입력이 들어왔음을 알리며 인터럽트 처리를 완료한다.
4) 인터럽트 처리가 끝나면 인터럽트가 발생하기 직전 상태를 복구시켜 중단되었던 작업을 재개한다.
Q4. 인터럽트와 트랩의 차이점
인터럽트는 하드웨어적 흐름의 변화로, 프로그램의 외부(I/O 장치, 디스크 등)에서 발생하며, 발생 시점이 일정하지 않기 때문에 비동기적이다.
트랩은 소프트웨어적 흐름의 변화로, 소프트웨어 인터럽트라고도 한다. 프로그램 내부에서 일어나는 에러이다. 발생 시점이 프로그램의 일정한 지점이기 때문에 동기적이다. (고정된 영역에서 일어남)
Q5. 폴링과 인터럽트?
폴링이 대상을 주기적으로 감시하여 상황이 발생하면 해당처리 루틴을 실행해 처리한다면,
인터럽트는 상대가 마이크로프로세서에게 일을 처리해달라고 요청하는 수단이다.
인터럽트 방식은 하드웨어로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속하게 대응하는 것이 가능하다. 따라서, 실시간 대응이 필요할 때는 필수적인 기능이다.
•─────⋅참고 자료⋅─────•
아브라함 실버스카츠, [운영체제 10th Edition], 퍼스트북 (2020)