오늘은 인터럽트에 대해 공부해보자!
인터럽트, Interrupt
프로그램을 실행하는 도중에 예기치 않은(cpu의 점유를 빼앗기는) 상황이 발생할 경우 작업을 즉시 중단하고, 발생된 상황을 우선 처리한 후 실행중이던 작업으로 복귀하여 처리하는 것
ex) 입출력, 우선순위 연산 등의 발생
- 하드웨어 장치가 CPU에게 어떤 사실을 알려주거나 CPU의 서비스를 요청해야할 경우, CPU내에 있는 인터럽트 라인을 세팅하여 인터럽트를 발생시킨다
- CPU는 매번 PC registrer가 가리키는 명령어를 수행한 뒤, 다음 명령을 수행하기 전에 인터럽트 라인을 확인한다
- 인터럽트가 발생하면 (= 인터럽트 라인이 세팅되어 있으면) CPU는 현재 수행중이던 프로세스를 멈추고 운영체제의 인터럽트 처리 루틴(= ISR, interrupt service routine)으로 이동하여 처리한다
- 인터럽트 라인은 CPU에, 인터럽트 처리 루틴은 운영체제에 위치함!
이러한 인터럽트는 크게 두 종류로 설명할 수 있다!
하드웨어 인터럽트 (외부 인터럽트)
일반적으로 인터럽트를 이르는 말
하드웨어 컨트롤러가 CPU의 서비스를 요청하기 위해 발생시키는 인터럽트
Maskable interrupt, Non-maskable interrupt 가 있다.(Interrunpt Mask가 가능)
Maskable interrupt
- Interrupt Mask(인터럽트가 발생하였을 때 요구를 받아들일지 말지 지정하는 것)가 가능
- 인텔CPU 에서 INTR pin으로 신호가 들어옴
Non-maskable interrupt
- Interrupt Mask가 불가능
- 거부, 무시할 수 없음 (매우 중요함)
- 정전, 하드웨어 고장 등 어쩔수없는 오류
- 인텔 CPU에서 NMI pin으로 신호가 들어옴
하드웨어 인터럽트 종류
- 입출력 인터럽트 (I/O interrupt)
- 입출력 작업의 종료나 입출력 오류에 의해 CPU의 기능이 요청됨
- 정전,전원 이상 인터럽트(Power fail interrupt)
- 기계 착오 인터럽트(Machine check interrupt)
- 외부 신호 인터럽트(External interrupt)
- I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
소프트웨어 인터럽트 (내부 인터럽트)
- CPU 내부에서 자신이 실행한 명령이나 CPU의 명령 실행에 관련된 모듈이 변화하는 경우 발생
- trap 또는 exception 이라고도 함
- 프로그램의 오류에 의해 생기는 인터럽트
예외 상황 (exception)
- 프로그램이 허용되지 않은 연산을 수행하려 할 때, 자동적으로 발생
- 0으로 나누는 경우
- OverFlow/UnderFlow 등
- 운영체제는 예외 상황이 발생했을 때, CPU의 제어권을 획득해 이 상황에 대한 조치를 취한다! (예외 상황에 대한 처리 루틴을 자신의 코드 영역에 가지고 있음)
시스템 콜 (system call)
- Supervisor Call
- 운영체제가 제공하는 서비스에 대한 프로그래밍 인터페이스 = System Call
- System Call 을 실행시키기 위한 CPU 명령어 = Supervisor Call
- 사용자 프로세스가 운영 체제의 서비스를 요청하기 위해 커널의 함수를 호출하는 것
- 사용자 프로세스가 직접 특권 명령을 수행할 수 없으므로 시스템 콜을 사용
- 예) 어떠한 문서를 불러오려 할 때, 문서는 컴퓨터 저장장치에 저장되어 있고 하드웨어 자원을 관리하는 것은 운영체제이다. 사용자 프로세스는 하드웨어에 저장되어 있는 문서를 불러올 수 없으므로 커널의 도움을 받기 위해 시스템 콜을 호출하게 된다.
시스템 콜, 예외 상황 모두 사용자 프로세스에서 운영체제 로 CPU의 제어권이 이동하여 처리됨, 이 과정에 인터럽트 라인을 세팅하여 인터럽트를 발생시킨 후 제어권이 이동한다 (= Interrupt)
그럼, 이러한 인터럽트가 발생하면, 그걸 처리하는 과정은 무엇일까?
인터럽트 발생 처리 과정
프로세스 A가 CPU할당 및 명령을 수행하던 중 인터럽트 라인이 세팅되어 있는 것을 확인 (인터럽트가 발생) 하면,
- A는 현재까지 수행중이던 프로세스 상태를 PCB에 저장한다.
- PCB 에는 수행중이던 메모리 주소, 레지스터 값, 하드웨어 상태 등의 정보가 저장된다.
- 인터럽트 처리 후 실행할 명령어의 주소를 PC(Program Counter) 에 저장 해 두고
- CPU 에 위치한 인터럽트 벡터를 읽고 해당 인터럽트 처리 루틴(ISR) 으로 넘어가 루틴을 실행한다 (인터럽트를 처리)
- ISR 끝에 IRET 명령어에 의해 인터럽트가 해제된다
- 루틴이 끝나면 A는 다시 CPU를 할당 받고 저장해 둔 PC 레지스터 값을 읽어 해당 지점부터 다시 명령을 수행한다~!
인터럽트 벡터, Interrupt Vector
- 여러가지 인터럽트에 대해 인터럽트 발생 시 처리해야할 루틴의 주소를 보관하고 있는 테이블
- 일종의 함수를 가리키는 포인터이다!
- CPU 에 위치
인터럽트 서비스 루틴, ISR
- 실제 인터럽트를 처리하기 위한 루틴으로, 인터럽트 핸들러 이라고도 한다
- 운영체제의 코드 부분에는 각종 인터럽트 별로 처리해야 할 내용이 이미 프로그램되어 있다, 커널이 실행
함께 알아둘 내용
사용자 정의 함수 & 라이브러리 함수 & 커널 함수
- 사용자 정의 함수 : 프로그래머가 직접 작성한 함수
- 라이브러리 함수 : 누군가 작성 해 놓은 함수, 호출해서 사용만 함
- 커널 함수 : OS 커널에 정의 된 함수
유저 모드 & 커널 모드
-
커널 모드
PC (Program Counter)가 운영체제가 존재하는 부분을 가리키고 잇다면, 현재 운영체제의 코드를 수행중, 'CPU가 커널모드에서 수행 중' 이라고 함
-
유저 모드
PC (Program Counter)가 사용자 프로그램이 존재하는 메모리 위치를 가리킬 경우, 사용자 프로그램을 수행 중, 'CPU가 유저모드 or 사용자 모드에서 수행 중' 이라고 함
커널에서 중요 자원을 관리함, 접근 제한을 위해 모드를 분리 시켜 놓음
인터럽트 우선순위
전원 이상 > 기계 고장 > 외부 신호 > 프로그램 인터럽트> SuperVisor Call (System Call)
Reference
[OS기초] 인터럽트 제대로 이해하기
[OS] Interrupt 인터럽트란?