- CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치 또는 예외상황이 발생하여 처리가 필요할 경우 CPU에게 알려 처리할 수 있도록 하는 것
→ CPU가 어떤 프로그램을 순차적으로 수행하는 중에 외부로부터 인터럽트 요구가 들어오면, CPU는 원래 프로그램의 수행을 중단하고 인터럽트를 먼저 처리함. 후에 인터럽트 처리가 끝나면 원래의 프로그램으로 복귀하여 수행을 계속 함.
→ 인터럽트를 발생시키기 위해서는 CPU 내에 있는 인터럽트 라인을 세팅함. - 하드웨어 인터럽트
- 하드웨어가 발생시키는 인터럽트
- CPU가 아닌 다른 하드웨어 장치가 CPU에 어떤 사실을 알려주거나 CPU 서비스를 요청해야할 경우 발생
- 소프트웨어 인터럽트
- 소프트웨어가 발생시키는 인터럽트
- 소프트웨어가 스스로 인터럽트 라인을 세팅'
인터럽트 종류
- 외부 인터럽트 : 보통 외부 입출력장치에 의해 발생
- 전원 이상 인터럽트(Power Fail Interrupt) : 정전, 파워 이상 등의 경우
- 기계 착오 인터럽트(Machine Check Interrupt) : CPU의 기능적인 오류의 경우
- 외부 신호 인터럽트(External Interrupt) : 타이머 인터럽트(자원이 할당된 시간이 다 끝난 경우), 키보드 인터럽트(
Ctrl
+Alt
+Del
), 외부장치 인터럽트 - 입출력 인터럽트(I/O Interrupt) : 입출력 장치가 데이터 전송을 요구하거나 다음 동작이 수행되어야 할 경우, 입출력 데이터에 이상이 있는 경우
- 내부 인터럽트 : 잘못된 명령이나 잘못된 데이터를 사용할 때 발생, Trap이라고도 함
- 프로그램 검사 인터럽트(Programm Check Interrupt) : 0으로 나눈 경우, Overflow/Underflow, 기타 예외 경우
- 소프트웨어 인터럽트 : 프로그램 처리 중 명령 요청에 의해서 발생
- SVC(SuperVisor Call) : 사용자가 프로그램을 실행시키거나 감시프로그램을 호출하는 동작을 수행한 경우, 복잡한 입출력 처리를 한 경우
📌 인터럽트 우선순위
전원 이상(Power Fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) >
명령어 잘못 > 프로그램 검사(Program Check) > SVC(SuperVisor Call)
✅ 인터럽트 우선순위 판별법
- Polling (소프트웨어적 방법)
- 인터럽트 요청 플래그를 차례로 비교해 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 수행
- 특징
- 속도가 빠른 장치에 높은 등급을 부여
- 우선순위 변경이 쉬움
- 많은 인터럽트가 있을 경우 하드웨어적인 방법에 비해 우선순위 판단 속도가 느림
- Interrupt (하드웨어적 방법)
- MCU 자체가 하드웨어적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식
- 인터럽트를 요청할 수 있는 장치와 CPU 사이에 장치번호를 식별할 수 있는 버스를 직렬/병렬로 연결
- Daisy Chain
- 인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결
- 우선순위가 높은 장치를 상위에 두고 차례로 배치
- 병렬 우선순위 부여
- 각 장치별 우선순위를 판별하기 위한 Mask Register에 bit를 설정
- Mask Register상 우선순위가 높은 서비스 루틴 수행 중 우선순위가 낮은 bit들을 비활성화 시킬 수 있음
- 반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리됨
인터럽트 처리 과정
요청
→중단
→보관
→처리
→재개
- 인터럽트 요청
- 프로그램 실행 중단
- 현재 실행중이던 Micro Operation까지 수행
- 현재 실행중인 프로그램 상태 보관
- Interrupt Vector를 읽어 ISR 주소값을 얻음
- ISR로 점프 (이 때, PC 값은 자동 대피,저장됨)
- 현재 진행중인 프로그램의 레지스터를 대피함
- 인터럽트 서비스 루틴 처리
- 인터럽트 원인을 파악하고 실질적인 작업 수행
- 서비스 루틴 수행 중, 우선순위가 더 높은 인터럽트가 발생하면 재귀적으로 1~5 과정 수행
- 상태 복구
- 해당 작업을 다 처리하면, 대피시킨 레지스터를 복원
- ISR끝에 RETI명령어에 의해 인터럽트 해제
- 명령어가 실행되면, PC값을 복원하여 이전 실행 위치로 복원
인터럽트 구성요소
- 발생원(Source) : 누가 인터럽트를 요청했는지
- 우선순위(Priority) : 2개 이상의 요청 시 어떤 서비스를 먼저 실행할 것인지? (중요도)
- 인터럽트 벡터(Interrupt Vector) : 서비스 루틴의 시작 번지는 어디인지
✅ Interrupt Vector
: 인터럽트가 발생했을 때 해야할 일이 무엇인가를 정해놓은 것으로 인터럽트 서비스 루틴(ISR)의 시작 주소
✅ IDT(Interrupt Descriptor(=Vector) Table)
: 미리 정의되어 있는 인터럽트들의 번호와 실행 코드를 가리키는 주소들이 저장되어 있는 테이블
- 컴퓨터 부팅 시 운영체제가 IDT에 인터럽트들을 기록하고,
- 인터럽트 발생 시 IDT를 확인해 Interrupt 번호에 해당하는 함수를 호출해서 인터럽트를 처리하게 됨
✅ Interrupt Handler
: 인터럽트가 발생하면 이를 핸들링하기 위한 함수가 호출되는데 이를 인터럽트 핸들러라고 함
: 함수 형태로 존재하며 커널 내부의 IRQ(Interrupt ReQuest) 서브 시스템을 통해 호출
: 인터럽트 핸들러의 최소 요구 조건은 인터럽트를 받았다는 사실을 인터럽트를 발생시킨 하드웨어에 알려줘야 한다는 것
✅ Interrupt Context
: 현재 실행 중인 프로세스가 현재 인터럽트를 처리 중이라는 것을 의미
'CS > OS' 카테고리의 다른 글
[CS] PCB & Context Switching (0) | 2024.02.01 |
---|---|
[CS] 시스템 콜(System Call) (0) | 2024.02.01 |
[CS] 프로세스 주소 공간 (0) | 2023.10.28 |
[CS] 프로세스와 스레드 (1) | 2023.10.28 |
[CS] 운영체제 (0) | 2023.10.28 |