✔️ 인터럽트란 ?
CPU가 프로그램을 실행하고 있을 때 예외상황이 발생해 처리가 필요할 경우 현재 실행중인 작업을 중단하고 발생된 상황을 처리한 뒤 다시 실행중인 작업으로 복귀하는 것을 말한다.
입출력 연산이 CPU 연산 수행속도보다 현저히 느리기 때문에 사용한다. I/O 연산이 끝난 이후 I/O Device는 인터럽트를 통해 CPU에게 알리고 CPU는 I/O 연산 결과를 이용해 작업을 완료한다.
✔️ 인터럽트의 종류
인터럽트의 종류는 외부 인터럽트, 내부 인터럽트, 소프트웨어 인터럽트로 나뉠 수 있다.
외부 인터럽트
- 전원 이상 인터럽트(Power fail interrupt) : 말그대로 정전, 파워 이상 등
- 기계 착오 인터럽트(Machine check interrupt) : CPU의 기능적인 오류
- 외부 신호 인터럽트(External interrupt)
- 타이머에 의한 인터럽트 : Preemptive개념을 생각하면 된다. 자원이 할당된 시간이 다 끝난 경우
- 키보드로 인터럽트 키를 누른 경우 : 대표적으로 Control + Alt + Delete
- 외부장치로부터 인터럽트 요청이 있는 경우 : I/O 인터럽트 아님!! 다른 개념이다 - 입출력 인터럽트(I/O Interrupt)
- 입출력장치가 데이터 전송을 요구하거나 전송이 끝나 다음 동작이 수행되어야 할 경우
- 입출력 데이터에 이상이 있는 경우
내부 인터럽트
- 잘못된 명령이나 잘못된 데이터를 사용할때 발생하며 Trap이라 부른다.
- 프로그래 검사 인터럽트(Program check interrupt)
- Division by zero
- Overflow/Underflow
- 기타 Exception
소프트웨어 인터럽트 (SVC : SuperVisor Call)
- 사용자가 프로그램을 실행시키거나 감시프로그램(Supervisor)을 호출하는 동작을 수행하는 경우
- 소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.
✔️ 인터럽트 우선순위
전원 이상(Power fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) > 명령어 잘못 > 프로그램 검사(Program Check) > SVC(SuperVisor Call)
✔️ 인터럽트 우선순위 판별법
Polling (소프트웨어적 방법)
인터럽트 요청 플래그를 차례로 비교해 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 수행한다.
특징
속도가 빠른 장치에 높은 등급을 부여한다.
우선순위 변경이 쉽다.
많은 인터럽트가 있을 경우 하드웨어적인 방법에 비해 우선순위 판단 속도가 느리다.
Interrupt (하드웨어적 방법)
MCU 자체가 하드웨적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식
인터럽트를 요청할 수 있는 장치와 CPU 사이에 장치번호를 식별할 수 있는 버스를 직별/병렬로 연결한다.
- Daisy Chain
인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
우선 순위가 높은 장치를 상위에 두고 차례로 배치한다. - 병렬 우선순위 부여
각 장치별 우선순위를 판별하기위한 Mask Register에 bit를 설정한다.
Mask register 상 우선순위가 높은 서비스 루틴 수행 중 우선순위가 낮은 bit들을 비활성화 시킬 수 있다.
반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리된다.
✔️ 인터럽트 동작 순서
- process A는 system call을 통해 인터럽트를 발생시킨다.
- CPU는 현재 진행 중인 명령어를 완료시키고 인터럽트 신호를 확인한다.
- 현재까지 수행중이었던 상태를 해당 process의 PCB(Process Control Block)에 저장한다. (수행중이던 MEMORY주소, 레지스터 값, 하드웨어 상태 등...)
- PC(Program Counter, IP)에 다음에 실행할 명령의 주소를 저장한다.
- 발생한 인터럽트의 번호를 IDT에서 확인하여 ISR 주소값을 얻어 ISR(Interrupt Service Routine)로 점프하여 루틴을 실행한다.
- 해당 코드를 실행한다.
- 해당 일을 다 처리하면, 대피시킨 레지스터를 복원한다.
- ISR의 끝에 IRET 명령어에 의해 인터럽트가 해제 된다.
- IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행 위치로 복원한다.
✔️ 인터럽트 구성 요소
1. 발생원(Source) : 누가 인터럽트를 요청했는지
2. 우선순위(Priority) : 2개 이상의 요청시 어떤 서비스를 먼저 할 것인지 ? (중요도)
3. 인터럽트 벡터(Interrupt Vector) : 서비스 루틴의 시작 번지는 어디인지
📌 Interrupt Vector
인터럽트가 발생했을 때 해야할 일이 무엇인가를 정해놓은 것으로 인터럽트 서비스 루틴(ISR)의 시작주소이다.
📌 IDT (Interrupt Descriptor(=Vector) Table)
미리 정의되어 있는 인터럽트들의 번호와 실행 코드를 가리키는 주소들이 저장되어 있는 테이블
1. 컴퓨터 부팅 시 운영체제가 IDT에 인터럽트들을 기록하고
2. 인터럽트 발생 시 IDT를 확인해 Interrupt 번호에 해당하는 함수를 호출해서 인터럽트를 처리하게 된다.
📌 Interrupt Handler
인터럽트가 발생하면 이를 핸들링하기 위한 함수가 호출되는데 이를 인터럽트 핸들러라고 한다.
함수 형태로 존재하며 커널 내부의 IRQ(Interrupt ReQuest) 서브 시스템을 통해 호출한다.
인터럽트 핸들러의 최소 요구 조건은 인터럽트를 받았다는 사실을 인터럽트를 발생시킨 하드웨어에 알려줘야 한다는 것이다.
📌 Interrupt Context
현재 실행 중인 프로세스가 현재 인터럽트를 처리중이라는 것을 의미한다.
🔗참고
'CS > 운영체제' 카테고리의 다른 글
[운영체제] Process Management (0) | 2022.03.17 |
---|---|
[운영체제] PCB(Process Control Block) & Context Switching (0) | 2022.03.17 |
[운영체제] System Call (0) | 2022.03.14 |
[운영체제] 프로세스 & 스레드 (0) | 2022.03.14 |
[운영체제] 운영체제란..? (0) | 2022.02.16 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!