[운영체제/OS/전자계산기] 인터럽트(Interrupt)
인터럽트
인터럽트의 필요성은 중앙 처리 장치와 주변 장치의 차이에 따른 효율적인 시스템 자원의 활용과 기계적 장애로 인하여 실행하던 프로그램을 완료하지 못했을 때, 처음부터 다시 하지 않고 중단된 위치로 복귀되어 이상 없이 계속해서 프로그램이 진행되도록 하는데 있다
인터럽트의 원인
- 정전, 데이터 전달 과정의 오류, 기계 장치의 장애
- 타이머, 외부 프로세스 등의 요청
- 컴퓨터 조작원의 의도적인 동작
- 보호된 기억 공간의 접근, 불법적인 명령어의 수행
- 0으로 나누기, 오버플로우/언더플로우 발생
- 페이지 폴트, 캐시 미스 발생
- 입출력 장치에서 CPU에게 기능 요청 시
- SVC(SuperVisor Call) 인터럽트
인터럽트 작업 순서
-
인터럽트 요청
인터럽트 발생 장치로부터 인터럽트 기능을 요청 -
현 상태 보존
현재 실행 중이던 프로그램의 상태를 안전한 장소에 보관 -
인터럽트 판별
인지 신호를 발생시켜 인터럽트의 원인을 판별하고 그것을 처리하는 인터럽트 서비스 루틴을 시작 -
인터럽트 취급
인터럽트 서비스 루틴으로 해당 인터럽트에 대한 조치를 취한다 -
인터럽트 복귀
인터럽트 요청 시 보관되었던 상태를 이용하여 원래 프로그램이 계속되도록 한다
인터럽트 발생 시 CPU의 처리사항
PC
의 내용- 프로그램에서 사용한 모든 레지스터의 내용
- 플래그 상태 조건 내용
- 스택의 내용(인터럽트 요인이 받아들여졌을 때는 CPU가 확인할 필요가 없다) 또는 메모리 0번지의 내용
인터럽트 서비스 루틴(ISR, Interrupt Service Routine)
인터럽트 핸들러라고도 부르며, 인터럽트 접수에 의해 발생되는 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴이다
인터럽트 핸들러는 인터럽트 원인에 따라 각각 존재하고 인터럽트 핸들러가 작업을 마치는 데 걸리는 시간도 다양하다.
인터럽트 핸들러는 커널에 존재하고 응용 프로그램에는 넣지 않는다. 초기의 DOS는 인터럽트 핸들러를 응용 프로그램과 결합하여 작성하였지만, 윈도우가 본격적인 운영체제를 갖추면서 커널에서 처리하게 되었다
인터럽트 벡터 테이블(IVT, Interrupt Vector Table)
여러가지 인터럽트에 대해 해당 인터럽트 발생시 처리해야 할 루틴의 주소를 보관하고 있는 공간을 의미
인터럽트 종류
발생 위치
에 따른 구분
외부 인터럽트
예상할 수 없는 시기에 프로세스 외부인 주변 장치에서 처리를 요청하는 인터럽트를 의미
인터럽트 이름 | 내용 |
---|---|
전원 이상(Power Fail) 인터럽트 | - 정전, 파워 이상 |
기계 착오(Machine Check) 인터럽트 | - CPU의 기능적인 오류 |
외부(External) 인터럽트 | - 현재 운영 중인 운영체제 소속이 아닌 외적인 요인으로부터 발생 - 인터럽트 시계에 의해 프로세스가 시간 할당량이 종료된 경우 - 웹 서버나 프린트 서버를 운영하고 있는 상태에서 외부로부터 인터럽트 처리 신호가 왔을 경우 |
입출력(I/O) 인터럽트 | - 하드웨어적 인터럽트로 입출력 채널 확인, 준비, 할당, 완료 시에 발생 - 프로세스 실행 상태에서 I/O를 처리하기 위해 대기 상태로 전이되고 필요한 I/O를 요구할 때 발생(키 입력 및 프린터 출력하는 경우 등) |
내부 인터럽트
예상된 시기에 어떤 기능을 발휘하도록 하기 위해 프로세스 내부에서 발생하는 인터럽트를 의미하며 트랩(Trap
)이라고도 한다
트랩 : 어떤 프로세스가 특정 시스템 기능을 사용하려고 할 때 그 기능을 운영체제에게 요청하는 것으로 내부 인터럽트가 여기에 속한다
인터럽트 이름 | 내용 |
---|---|
프로그램 검사(Program Check) 인터럽트( =Trap) | - 프로그램 명령어를 수행하는 과정에서 부분적으로 발생하는 문제들에 의해 발생 - 데이터 연산 과정에서 Overflow나 Underflow 상태 시 - 나눗셈에서 분모가 0인 경우 - 기억 장치의 제한된 영역을 사용하는 명령 등 - 프로그램이 정상 수행되지 않고 시스템이 중지하거나 오류메시지를 출력하고 운영체제로 복귀하는 경우 |
발생 주체
에 따른 구분
하드웨어 인터럽트
- 타이머 인터럽트
- I/O 인터럽트
- 머신 체크 인터럽트
- 정전 인터럽트
소프트웨어 인터럽트
인터럽트 이름 | 내용 |
---|---|
SVC(SuperVisor Call) 인터럽트 | - 운영체제의 제어 프로그램인 감시 프로그램을 호출하면 SVC 인터럽트가 발생. - 운영체제에서 중추적인 역할을 하는 감시 프로그램의 호출은 사용자로부터 운영체제를 보호하거나 입출력 수행 루틴 호출, 기억 장치 할당 루틴, 오퍼레이터와의 대화 등을 위해 발생하는 인터럽트 |
프로그램 인터럽트 | - 페이지 폴트 인터럽트, 캐시 미스 인터럽트 (프로그램의 오류와 상관없이 발생하며 인터럽트 발생 시 상태 보존이 필요하다) 0으로 나누기 인터럽트, 오버플로우/언더플로우 인터럽트, 불법적인 명령어 사용 인터럽트, 보호 공간 접근 인터럽트 (프로그램의 오류로 발생하며 인터럽트 발생 시 상태 보존이 필요 없다) |
일반적으로 소프트웨어 인터럽트보다 하드웨어 인터럽트가, 내부 인터럽트 보다 외부 인터럽트가 우선 순위가 높다
인터럽트 요청 신호
컴퓨터 내의 자원들이 인터럽트 요청 회선을 통하여 CPU에 요청 신호를 전달하게 된다
단일 인터럽트 신호 요청 회선(Polled
Interrupt)
인터럽트 요청이 가능한 장치를 CPU와 단일 회선으로 연결한 방식으로 인터럽트를 요청한 장치 판별 과정이 필요
- 복귀 주소인 PC의 값을 메모리 0번지나 스택에 저장
- 인터럽트 요구가 있는 장치를 찾기 위해 하나 하나 검색해가는 방식으로 속도가 느리다
고유 인터럽트 신호 요청 회선(Vector
Interrupt)
CPU에 있는 인터럽트 레지스터의 각 비트에 고유의 회선을 연결하는 방식
- 하드웨어 신호가 발생하면 인터럽트 서비스 루틴으로 분기하는 명령들로 구성된 인터럽트 벡터를 이용하여 바로 인터럽트 서비스 루틴을 실행시킨다
- 장치마다 고유한 인터럽트 요청 신호 회선을 가지므로 인터럽트를 요청한 장치 판별 과정이 필요없다
인터럽트 처리 루틴(Interrupt Processing Routine)
CPU가 인터럽트 요청을 받은 상태에서 수행 중이던 명령어의 수행을 완료한 후,
- 현 상태 보관
- 인터럽트의 원인 판별
- 인터럽트의 취급 루틴 호출
- 원상태로 복귀 등을 수행한다
인터럽트 요청을 받아 인터럽트 취급 루틴을 호출하는 데까지 걸리는 시간을 인터럽트 반응 시간이라고 한다
인터럽트 처리 루틴의 기능
- 인터럽트를 인지하고 현 상태를 보존
- 인터럽트의 원인 판별
- 다른 인터럽트 발생을 방지
- 해당 인터럽트에 맞게 인터럽트 처리 루틴 시작을 지시
- 인터럽트 처리가 완료되면 인터럽트 처리 시 보존시켰던 PC 및 제어 상태 데이터를 PC와 제어 상태 레지스터에 복구
복귀 주소 보관 방법
- 프로그램에서 사용하지 않는 0번지에 기억
- 스택에 저장
인터럽트 원인 판별
고유 인터럽트 요청(벡터 인터럽트) 신호 회선을 사용하는 경우는 장치마다 고유한 인터럽트 요청 신호 회선을 가지므로 인터럽트 요청한 장치 판별 과정이 필요없지만, 단일 인터럽트 요청 신호 회선을 사용하는 경우는 다음과 같은 판별 과정이 필요하다
- 소프트웨어에 의한 판별(
Polling
)
인터럽트 요청을 받았을 때 프로그램에 의해 각각의 장치 플래그를 검사하여 어느 장치에서 발생하였는가를 판별하는 방식- 프로그램으로 처리하기 때문에 인터럽트 반응 속도가 느리다
- 프로그램의 변경이 쉽기 때문에 융통성이 있다
- 하드웨어적인 장비가 없기 때문에 경제적이다
- 비교적 큰 정보를 교환하는 시스템에 적합
- 우선순위 변경이 비교적 쉽다
- 하드웨어에 의한 판별(
Daisy Chain
)
인터럽트 요청 장치를 인터럽트 우선순위에 따라 직렬로 연결하고 CPU의 신호를 인지하여 자신의 장치 번호를 CPU에 보냄으로써 요청한 장치를 판별하는 방식- 인터럽트 반응 속도가 풀링방식에 비해 빠르다
- 융통성이 없고 하드웨어 비용이 많이 든다
인터럽트 취급 루틴(Interrupt Service Routine)
인터럽트마다 조치가 달라질 수 있으므로 각각의 인터럽트마다 어떻게 처리할 것인가를 인터럽트 서비스 루틴으로 만들어 두었다가 요청에 맞게 처리해주는 역할 수행
- 인터럽트에 대한 조치를 취하는 과정
- 조치가 끝나면 인터럽트 처리 루틴으로 복귀
인터럽트 우선순위 체제
인터럽트 우선순위
여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행 중 인터럽트가 발생한 경우 우선순위 판별이 필요
- 전원 이상 - 정전 인터럽트
- 기계 착오 - 기계 이상에 의해서 발생한 인터럽트
- 외부 신호 - 타이머, 조작원, 외부 프로세서, I/O 장치 등의 요청에 의해서 발생한 인터럽트
- 입출력
- 프로그램 검사 - 불법적인 연산자, 보호 공간 접근, 0으로 나누기, 오버플로우/언더플로우 인터럽트
- SVC - 제어 프로그램 호출 인터럽트
우선순위 인터럽트 운영 방식
-
근착 우선 처리(
LCFS
, Last Come First Service)
가장 마지막에 인터럽트를 요청한 장치가 최고 우선순위로 처리하는 방식 -
선착 우선 처리(
FCFS
, First Come First Service)
제일 먼저 인터럽트를 요청한 장치가 최고 우선순위로 처리하는 방식 -
Masking Scheme
한 인터럽트가 서비스 중이면 하위 순위의 인터럽트는 Disable by Masking에 의해 요청하지 못하게 하고 높은 순위의 인터럽트를 허용하도록 하는 방법
차단 불가능 인터럽트(NMI, Non-Maskable Interrupt)
인터럽트 마스크의 영향을 받지 않는 우선순위가 가장 높은 인터럽트로 정전 인터럽트나 심각한 하드웨어 이상 인터럽트가 여기에 속하며 이 경우는 하드웨어적으로 따로 구성하여 사용자가 임의로 Enable/Disable 할 수 없도록 한다
차단 가능 인터럽트(MI, Maskable Interrupt)
프로그램 실행 중에 인터럽트 요청이 들어왔을 경우 소프트웨어로 제어가 가능한 인터럽트를 의미
Polling(폴링, 소프트웨어적 방법)
인터럽트 순위가 가장 높은 장치로부터 가장 낮은 장치 순으로 비교 순서를 정해놓고 우선순위를 부여하는 방식
- 회로가 간단, 우선순위의 변경이 용이
- 검사할 때의 CPU의 자원이 필요해 반응 시간이 느리다
Vectored Interrupt(하드웨어적 방법)
하드웨어 회로에 의해 우선순위를 부여하는 것으로 CPU와 인터럽트를 요청할 수 있는 장치 사이에 장치 번호에 해당하는 버스를 연결하여 요청 장치의 번호를 CPU에게 알려주는 방식
-
데이지 체인(Daisy Chain) 우선순위 부여 방식
어디에 인터럽트가 발생했는지 확인하는 회로를 인터럽트 순위가 가장 높은 장치로부터 가장 낮은 장치순으로 직렬로 연결하는 하드웨어적 방법으로 INTR, INTA 선에 장치들을 우선순위에 따라 순서대로 연결하는 방식.다른 방법에 비해 구성이 간단하나, 단순한 구조 때문에 CPU 가까이 연결된 장치에 비해 멀리있는 장치는 인터럽트 요청이 지연될 가능성이 존재
-
인터럽트 요청 체인 방식
직렬연결 회로에서 CPU의 인터럽트 인지신호를 최초로 받은 장치가 가장 우선순위가 높도록 설계하여 우선순위를 부여하는 방식 -
인터럽트 우선순위 체인 방식
인터럽트 요청을 하는 장치 중에서 가장 우선순위가 높은 장치만이 장치번호 버스를 이용하여 장치번호를 보낼 수 있도록 회로를 설계하여 우선순위를 부여하는 방식
-
-
병렬 우선순위 부여 방식
인터럽트 요청 회선이 여러 개로 이루어진 경우로 우선순위를 병렬로 처리할 수 있는 경우이다. 이 방식은 현재 취급 중인 인터럽트와 요청된 인터럽트를 비교하여 요청된 인터럽트의 우선순위가 높은 경우는 우선순위가 높은 인터럽트를 처리하고 그렇지 않은 경우는 취급 중인 인터럽트를 처리하는 방식- 인터럽트를 요청한 장치를 쉽게 찾을 수 있다
- 하드웨어 구성이 매우 복잡
- 인터럽트 처리 루틴없이 인터럽트 취급 루틴이 시작된다
- 처리 중인 인터럽트보다 우선순위가 낮은 것을 비활성화시키는 마스크 레지스터를 가지고 있다
- CPU가 가지고 있는 인터럽트 포트 수에 의해서 연결할 수 있는 장치의 수가 제한
가변-우선순위 방식(Dynamic-Priority Scheme)
-
회전 우선순위(Rotating Priority)
중재 동작이 끝날 때마다 모든 마스터들의 우선순위가 한 단계씩 낮아지고, 가장 우선순위가 낮았던 마스터가 최상위 우선순위를 가지도록 하는 방법 -
임의 우선순위(Random Priority)
각 중재 동작이 끝날 때마다 우선순위를 임의로 결정하는 방법 -
동등 우선순위(Equal Priority)
모든 마스터들이 동등한 우선순위를 가지며, FIFO(First-In-First-Out) 알고리즘을 사용하여 우선순위를 결정하는 방법 -
최소-최근 우선순위(LRU, Least-Recently Used)
최근 가장 오랫동안 버스를 사용하지 않은 버스 마스터에게 최상위 우선순위를 할당하는 방법
문맥 교환(Context Switching)
다중 프로그래밍 시스템에서 CPU가 할당되는 프로세스를 변경하기 위하여 현재 CPU를 사용하여 실행되고 있는 프로세서의 상태 정보를 저장하고 제어권을 인터럽트 서비스 루틴(ISR
)에게 넘기는 작업을 의미
CPU는 하나의 프로세스 정보만을 기억한다. 여러 개의 프로세스가 실행되는 다중 프로그래밍 환경에서 CPU는 각각의 프로세스의 정보를 저장했다 복귀하는 일을 반복한다. 프로세스의 저장과 복귀는 프로세스의 중단과 실행을 의미한다. 프로세스의 중단과 실행 시 인터럽트가 발생하므로, 문맥 교환이 많이 일어난다는 것은 인터럽트가 많이 발생한다는 의미이다.
프로세스들 시간 할당량은 시스템 성능의 중요한 역할을 한다. 시간 할당량이 적을수록 사용자 입장에서는 여러 개의 프로세스가 거의 동시에 수행되는 느낌을 갖지만 인터럽트의 수와 문맥 교환의 수가 증가한다. 프로세스의 실행을 위한 부가적인 활동을 오버헤드라고 하는데, 이 또한 문맥 교환 수가 같이 늘어나게 된다
- 시간 할당량 감소 :
- 문맥 교환 수, 인터럽트 횟수, 오버헤드 증가
- 여러 개의 프로세스가 동시에 수행되는 느낌을 받는다
- 시간 할당량 증가 :
- 문맥 교환 수, 인터럽트 횟수, 오버헤드 감소
- 여러 개의 프로세스가 동시에 수행되는 느낌을 갖지 못한다
프로세스 제어 블록(PCB, Process Control Block)
여러 개의 프로세스를 수행하는 다중 프로그래밍 환경 하에서 각 프로세스를 구분하기 위한 프로세스 정보 블록
항목 | 상세 내용 |
---|---|
① 프로세스 식별자 | 프로세스들을 구분할 수 있는 태그/명칭/고유 이름 |
② 프로세스 현재 상태 | 프로세스의 현재 상태 |
③ 프로그램 카운터(PC,계수기) | 다음에 실행되는 명령어의 주소 |
④ 프로세스 우선순위 | 프로세스의 우선순위에 대한 정보 기억 |
⑤ 프로세스가 적재된 기억 장치 부분을 가리키는 포인터 | 프로세스가 시작되는 기억 장치의 시작 번지 |
⑥ 프로세스에 할당된 자원을 가리키는 포인터 | 프로세스 처리 중에 필요한 자원의 정보를 갖고 있는 기억 장소의 시작 번지 |
⑦ 처리기(CPU) 레지스터 정보 | CPU 내 범용 레지스터(AX/BX/CX/DX), 데이터 레지스터(SP/BP/SI/DI), 세그먼트 레지스터(CS/DS/ES/SS) 등이 갖고 있는 값 |
⑧ CPU의 각종 레지스터 상태를 가리키는 포인터 | CPU에 1비트로 구성된 상태 레지스터의 비트열 값 |
⑨ 계정 정보 | CPU 사용 시간의 정보, 각종 스케줄러에 필요한 정보 |
⑩ 기억 장치 관리 정보 | 프로그램이 적재될 기억 장치의 상한치/하한치/페이지 테이블 등의 정보 |
⑪ 입출력 정보 | 프로세스 수행 시 필요한 주변 장치, 파일들의 정보 |
⑫ 부모 프로세스를 가리키는 포인터 | 자신을 생성한 상위 프로세스의 번지 |
⑬ 자식 프로세스를 가리키는 포인터 | 자신이 생성한 하위 프로세스의 번지 |
댓글남기기