쉽게 말하자면 interrupt는 하드웨어와 OS 간의 상호작용 수단이다.
우선 사건(event)가 발생하면 하드웨어나 소프트웨어로부터 발생한 interrupt에 의해 신호가 보내진다.
**event는 일반적으로 I/O를 뜻한다.
**하드웨어는 언제든 system bus를 통해 CPU에 신호를 보내 interrupt를 발생시킬 수 있다.
(system bus는 main communication path로 주요 요소들과 연결되어있다.)
**소프트웨어는 시스템호출(system call )을 통해 interrupt를 발생시킬 수 있다.
System call은 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널함수를 호출하는 것을 의미한다.
소프트웨어로 생긴 인터럽트는 Trap이라고 한다.
일반적으로 CPU가 interrupted 되면
즉시 하던 일을 멈추고 고정된 위치(fixed location)으로 execution을 전환한다.
(fixed location이란 그 interrupt에 관한 서비스 루틴의 start address를 말한다)
그리고 interrupt service routine이 시작된다.
실행이 완료되면 다시 CPU는 interrupt 되어서 멈춘 연산을 다시 진행한다.
** 다시 돌아오려면 현재 실행 되고 있는 프로그램의 주소를 저장한다.
현재 수행중인 작업을 중단하고 인터럽트가 먼저 작업을 수행할 수 있게 한다.
Interrupt transfers control to the interrupt service routine generally, through the interrupt vector, which contains the addresses of all the service routines
Interrupt architecture must save the address of the interrupted instruction
interrupt는 컴퓨터 구조에서 아주 중요한 역할을 한다.
각각의 컴퓨터는 고유의 interrupt mechanism을 가지고 있다. (물론 공통 부분도 있다.)
interrupt는 제어권을 알맞은 interrupt service routine에게 넘긴다.
이러한 제어권 관리를 하는 것은 interrupt-specific handler라고 한다.
그렇지만 interrupt는 매우 빠른 속도와 빈번하게 처리되어야 한다.
그래서 차라리 A table of pointers ( interrupt 주소) 를 쓰는게 낫다고 사람들은 생각했다.
A table of pointers 는 하위 메모리(low memory)에 저장되었다.
그리고 다양한 장치들의 interrupt service routine들의 주소를 저장했다.
이러한 주소들의 배열을 우린 interrupt vector (= A table of pointers) 라고 부른다.
얘네 주소들은 unique number로 indexed 되어있다.
즉, interrupt service routine 의 주소가 unique number에 indexed 되어있다.
++ 이와 관련된 용어 중 vectored interrupt가 있다.
the purpose of a vectored interrupt mechanism is to reduce the need for a single interrupt handler to search all possible sources of interrupts to determine which one needs service.
위의 설명과 비슷하다 참고만 하자
만약 interrupt routine이 프로세서 state를 수정하게 될 때에는 현재 상태를 저장하고 반환하기 전에 상태를 다시 받아온다.
interrupt service가 끝나면, 저장되었던 return address가 다시 program counter에 load되고 interrupted computation은 아무 일 없다는 듯이 다시 수행된다.
**** 그리고 다른 종류의 interrupt가 있는데 알아두자
A trap or exception is a software-generated interrupt caused either by an error or a user request.
사용자 프로그램의 운영체제 서비스 실행 요청에 의해 유발되는 소프트웨어에 의해 생성된 인터럽트이다.
Interrupt는 실제로 수행은 어떻게 될까?
CPU는 interrupt- request line 이라는 것을 가지고 있다.
CPU가 controller가 이 line을 통해 신호를 보낸 것을 감지했다면
interrupt number를 읽고 interrupt-handler routine으로 jump한다.
** interrupt vector를 통해서
(jump는 주소를 찾아서 간다 라고 보면 되겠다.)
interrupt handler는 지금의 상태를 저장하고, interrupt 의 원인을 알아내고, 필요한 수행을 하고, 다시 CPU에게 processor state를 interrupt 전과 같이 반환한다.
다시 말하자면
device controller는 line을 통해서 raise an interrupt
CPU는 interrupt를 catch하고 interrupt handler한테 dispatch한다.
handler는 interrupt를 clear한다.
그림을 보고 부족한 설명 대체한다.
1. 프로그램이 OS에게 I/O Controller에게 정보를 보내라고 인터럽트. (Trap)
2-3. Controller가 해당 요청을 받아서 I/O 받음
4. I/O 끝나면 요청이 끝났기에 인터럽트(Hardware)
5. CPU가 인터럽트를 받고 handler에게 전달
6-7. 해당 routine이 끝나면 CPU가 다시 작업
효과적인 interrupt handling이 수행되려면 3가지 정도 고려해봐야한다.
1. ability to defer interrupt handling during critical processing
2. efficient way to dispatch to the proper interrupt handler
3. OS can distinguish between high- and low-priority interrupts
그런데 대부분의 CPU들은 interrupt request line이 2개가 있다
하나는 nonmaskable interrupt, 다른 하나는 maskable
nonmaskable은 복구가 불가능한 메모리 에러를 막기위한 event가 저장되어있는 interrupt를 말한다.
maskable은 interrupt되지 말아야 할 중요한 작업의 실행 전에 interrupt를 꺼질 수 있게 해주는 것을 말한다.
device의 수가 많아서 생기는 문제를 해결하기 위해
interrupt chaining을 쓴다.
즉 interrupt handler 리스트의 head를 가리키는 것이다.
예를 들면 interrupt가 발생했을 때 하려는 서비스를 찾을 때까지 head부터 내려오며 확인하는 것이다.
요약하자면 interrupt는
비동기식(asynchronous) 이벤트를 다루기 위해서 쓰는 것이다.
device controller와 hardware fault는 interrupt를 발생시킨다.
작업을 효율적으로 하고 싶다면 interrupt priorities를 만들어서 관리해야 한다.
Asynchronous와 Sychronous를 비교하고 알아보자
비동기와 동기라고 볼 수 있는데
동기식은
한 문자 단위가 아니라 미리 정해진 수 만큼의 문자열을 한 묶음으로 만들어서 일시에 전송하는 방법이다.
이 방법에서는 데이터와는 별도로 송신측과 수신측이 하나의 기준 클록으로 동기신호를 맞추어 동작한다.
수신측에서는 클록에 의해 비트를 구별하게 되므로, 동기식 전송을 위해서는 데이터와 클록을 위한 2회선이 필요하다.
송신측에서 2진 데이터들을 정상적인 속도로 내 보내면, 수신측에서는 클록의 한 사이클 간격으로 데이터를 인식하는 것이다.
비동기식은
정보의 송신 및 수신을 위해 사용되는 클록이 상대국과 독립적으로 운용되면서 송신될 정보가 있을 때마다 정보의 시작/정지(start-stop)를 수신 측에 알려 주는 정보 전송 형태.
이 방식은 다양한 정보 속도를 사용할 수는 있으나 전송 성능이 나쁘고 전송 대역이 커지는 단점이 있다.
(쓰는 이유 다른 장비와 속도를 맞출필요가 없다.)
(대신 데이터가 언제 올지 모르니까 데이터의 시작과 끝을 규정해줘야한다. ex) interrupt )
정리하자면 2가지 종류의 인터럽트가 있다.
하드웨어 인터럽트 (Hardware Interrupt)
일반적으로 이야기 하는 인터럽트. 각종 I/O 디바이스에서 발생한다.
하드웨어 인터럽트는 CPU 외부의 디스크 컨트롤러나 주변 장치로부터 요구되는 것으로, 운영체제의 처리를 요하는 상황을 알리기 위해 전기적인 신호를 사용해 구현된다.
소프트웨어 인터럽트 (Software Interrupt)
시스템 코드 호출, 실행 중 예외상황 (Exception) 시 발생한다.
소프트웨어 인터럽트는 외부가 아닌 CPU 내부에서 자신이 실행한 명령이나 CPU의 명령 실행에 관련된 모듈이 변화하는 경우 발생한다.
프로그램 실행 중 프로그램 상의 처리 불가능한 오류나 이벤트를 알리기 위한 경우 발생하는데, 이를 트랩(trap) 또는 예외(exception)라 부른다.
또한 프로그램 내에서 특별한 서비스를 요하거나 감시(supervisor)를 목적으로 의도적으로 프로그램이 발생시킨 특별한 명령어에 의해 발생되기도 한다.
'컴퓨터(Computer Science) > 운영체제(Operation System)' 카테고리의 다른 글
Deadlock, 교착상태란? [운영체제] (0) | 2020.05.27 |
---|---|
Readers and Writers Problem, 동기화 [운영체제] (0) | 2020.05.21 |
Bounded-Buffer Problem(Producer-Consumer Promlem), 동기화[운영체제] (0) | 2020.04.22 |
저장구조, 입출력 구조, 메모리 특징[운영체제] (0) | 2020.04.14 |
Operating System - 컴퓨터 시스템 구조 [운영체제] (0) | 2020.04.13 |