Interrupt
Interrupt(인터럽트)를 직역하면 방해라고 해석할 수 있는데 인터럽트라는 개념을 받아들이기가 사실 버거웠다. 뭔가 모르게 잘 와닿지 않았던 부분이 있었지만 이해한 내용을 정리해보자. 😭😓
인터럽트는 CPU가 프로그램을 실행하고 있을 때,
입출력 하드웨어 등의 장치나 또는 예외상황이 발생해서 처리가 필요할 경우에 CPU에 알려서 처리하는 기술이다.
인터럽트는 내부 인터럽트와 외부 인터럽트로 나눌 수 있다.
1. 내부 인터럽트
: 주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용시 발생
(예를 들어, 0으로 나눴을 경우/사용자 모드에서 허용되지 않은 명령 또는 공간 접근 시/계산 결과가 Overflow/Underflow가 나는경우)
2. 외부 인터럽트
: 입출력 장치, 타이밍 장치, 전원 등의 외부적인 요인에 의해서 발생하는 인터럽트/주로 하드웨어에서 발생
(예를 들어, 전원 이상/기계 문제/키보드 등 I/O 관련 이벤트/Timer 이벤트)
자, 여기까지는 자명한 사실들이다. 내가 인터럽트 개념에 대해 아리송했던 이유는 인터럽트를 에러(?), 오류(?), 방해(?) 그 사이로 받아들이고 있었기 때문이다.
인터럽트의 종류
Program Interrupt : Generated by some condition that occurs as a result of an instruction execution, such us arithmetic overflow, division by zero, attempt to execute an illegal machine instruction, or reference outside a user's allowed memory space.
Timer Interrupt : Generated by a timer within the processor. This allows the operating system to perform certain functions on a regular basis.
I/O Interrupt : Generated by an 1/O controller, to signal normal completion of an operation, request service from the processor, or to signal a variety of error conditions.
Hardware failure Interrupt : Generated by a failure such as power failure or memory parity error.
인터럽트에는 총 4가지의 종류가 있다.
1. Program Interrupt는 오버플로우가 발생한 경우, 0으로 나눈 경우, 명령어가 잘못된 경우에 발생하고,
2. Hardware failure Interrupt는 하드웨어 장치의 문제 있을 때 발생한다.
=> 이 두 가지의 경우는 어떤 종류든 문제가 있을 때 발생하는 인터럽트이다.
문제가 있을 때 발생하는 두 인터럽트와는 다르게 Timer Interrupt와 I/O Interrupt는 그렇지 않다.
3. Timer Interrupt는 프로그램을 병렬적으로 실행시키기 위해 사용된다. CPU는 매우 빠르기 때문에 여러가지 프로세스를 한 번에 실행시킬 수 있다. 사실 정확히 말하면 한 번에 실행시킬 수 있는 것처럼 보인다. 프로세스들을 조금씩 돌아가면서 실행시키고, 조금씩 실행시키는 시간을 Timer로 계산해서 그만큼씩 CPU가 일을 한다. 이것이 Timer Interrupt이다.
4. I/O Interrupt는 인터럽트 중에서 가장 중요하다.
I/O Interrupt가 있는 이유는 CPU와 I/O 장치의 속도차이 때문이다. 💡
앞서 말했듯이 CPU는 매우 빠르다. 하지만 I/O장치는 그에 비해 현저히 느리다. 따라서 I/O Interrupt가 필요하다.
I/O 인터럽트가 없다고 가정하자. I/O 장치로 write라는 기능을 수행하는 상황을 생각해보자.
CPU는 I/O에게 출력을 준비하라고 지시한다. 그러면 I/O는 출력을 할 준비를 한다. 앞서 말했듯이 CPU에 비해 I/O가 매우매우 느리기 때문에 CPU는 I/O를 기다려줘야 한다. 마침내 I/O가 준비를 마치고 CPU는 write를 수행 완료했다.
CPU는 답답했다. 그래서 I/O가 준비를 하는 동안 자기가 할 일을 하고 있기로 했다. write를 준비하라고 지시하고 자기가 할일을 하고있는다. I/O가 준비를 다 하고, CPU에게 손을 든다. CPU는 하고 있던 일을 멈추고 write를 수행한다. 자 여기에서 I/O가 준비를 다하고 손을 든 순간 I/O 인터럽트가 발생한다 ...!
1 => (write) => 3 => (write) => 5
위 그림을 통해 이해해보자면 좌측은 I/O 인터럽트가 없을 경우이고, 우측은 I/O 인터럽트가 있을 경우이다.
4번은 I/O에게 준비를 하라고 명령하는 과정이고, 5번은 I/O가 write 하도록 하는 과정이다.
I/O 인터럽트가 없다면 좌측 그림처럼 I/O가 준비할 동안 기다려야 한다. (검은색 부분)
우측 그림처럼 인터럽트가 있다면 CPU는 write를 준비하라고 지시하고(4번), 자기 할 일을 하고 있을 수 있다.
준비가 다 되면 출력을 한다.(5번) 이렇게 인터럽트는 오히려 수행시간을 빠르게 할 수 있다.
이렇게 총 4가지의 인터럽트 종류를 보았다. 나는 다수의 구글링을 통해 인터럽트의 개념은 받아들였지만 인터럽트를 문제가 발생했을 때의 관점으로 접근하고 있었기 때문에 타이머 인터럽트에 대해 와닿지 못했던 것이다. 타이머 인터럽트는 정말 "문제가 있을 때 발생하는 인터럽트"가 아니였으니깐 ..
그럼 Pintos로 시점으로 바꿔보자.
Q. 선점 스케줄링을 구현하려면 하드웨어가 꼭 필요한데 그게 뭐죠 ? (from 코치님)
A. 타이머 ...! 입니다.
- Pintos Project 1에서 계속해서 언급되는 인터럽트는 타이머에 의한 인터럽트이다.
- 선점형 스케줄러의 경우 프로세스 running 중에 스케줄러가 이를 중단시키고, 다른 프로세스로 교체하기 위해서 사용된다. 즉, 스케줄러 코드가 실행되서 현 프로세스 실행을 중단시키는 것이 인터럽트이다.
- 스케줄링(Scheduling)을 하기 위해서는, 일정주기(약 10ms)로 발생하는 인터럽트가 필요하다. (1 tick = 10ms)
- Pintos에서는 8254 timer(하드웨어)가 사용된다.
Reference
인터럽트에 대한 내용을 공부하다 보니 끝이 없음을 깨달았다...
'SW사관학교 정글 > PintOS' 카테고리의 다른 글
[PintOS] Threads 다시 보다가 문맥교환(Context Switching) 이해하기 (0) | 2022.12.07 |
---|---|
[PintOS] Project 2: User Programs (Argument Passing, System Calls) (0) | 2022.12.06 |
[PintOS] AWS에서는 되는데 WSL에서 출력 결과가 터지는 경우 (2) | 2022.11.22 |
[PintOS] Project 2: User Programs 큰 그림 그리기 (1) | 2022.11.20 |
[PintOS] Project 1: Threads (Alarm clock, Priority Scheduling) & 회고 (3) | 2022.11.18 |