인터럽트란? (Interrupt)
CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것을 말한다.
CPU가 어떤 프로그램을 순차적으로 수행하는 중에 외부로부터 인터럽트 요구가 들어오게 되면, CPU는 원래 프로그램의 수행을 중단하고, 인터럽트를 먼저 처리해준다. 인터럽트 처리가 끝나면 원래의 프로그램으로 복귀한다.
인터럽트가 필요한 이유?
하나의 CPU에서는 매 순간 하나의 프로그램만 실행시킬 수 있다. 그렇기 때문에 현재 CPU를 할당받아 실행되고 있는 프로그램이 I/O 처리와 같이 수행하는데 오래 걸리는 작업을 할 때에도 CPU를 점유하고 있다면, CPU라는 자원을 낭비하게 된다. 따라서 운영체제는 자원의 효율적 관리라는 목표를 달성하기 위해, 인터럽트라는 방식을 사용한다.
인터럽트는 프로그램이 당장 처리해야 하는 작업이 발생하면, 다른 처리를 하도록 일시 정지시킨 뒤, CPU를 다른 프로그램에게 할당하여 자원을 낭비하지 않도록 만든다. 이러한 인터럽트가 없다면, 응용프로그램이나 운영체제는 입출력 작업을 시킨 후 입출력 완료되었는지 계속 검사히면서 기다려야하기 때문에(폴링(polling)) CPU 활용률이 떨어진다.
인터럽트 서비스 루틴 (ISR)
인터럽트 핸들러라고도 불린다. 인터럽트가 접수되면 각각의 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴(커널이 실행)
운영체제는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터(interrupt vector)를 가지고 있다. 인터럽트 백터란 인터럽트 종류마다 번호를 정해서 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키는 자료구조를 말한다. 인터럽트 백터를 따라가면 실제 처리해야 할 코드는 인터럽트 처리 루틴(Interrupt Service Routine) 또는 인터럽트 핸들러(Interrupt handler)라고 불리는 다른 곳에 정의된다.
인터럽트 벡터 테이블 (IDT)
인터럽트 벡터 테이블(Interrupt Vector Table)이란 여러가지 인터럽트에 대해 해당 인터럽트 발생시 처리해야 할 루틴의 주소를 보관하고 있는 테이블을 의미한다.
인터럽트 처리 과정
- 인터럽트가 발생하며 운영체제가 제어권을 받는다.
- 운영체제는 인터럽트 받은 현재의 프로세스 상태를 저장한다. → PCB에 저장
- 운영체제는 인터럽트의 발생 원인을 찾아 지정되어 있는 루틴으로 제어권을 넘겨준다.
- 인터럽트 처리 루틴(ISR)이 인터럽트를 처리한다.
- 인터럽트가 걸렸던 이전 프로세스의 상태로 복구된다.
- 인터럽트가 걸렸던 시점 이후부터 프로세스가 실행된다.
인터럽트 종류
인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.
하드웨어 인터럽트
하드웨어가 발생시키는 인터럽트로, CPU가 아닌 다른 하드웨어 장치가 cpu에 어떤 사실을 알려주거나 cpu 서비스를 요청해야 할 경우 발생시킨다.
- 입출력 인터럽트 (I/O interrupt) : 입출력 작업의 종료나 입출력 오류에 의해 CPU의 기능이 요청됨
- 정전,전원 이상 인터럽트(Power fail interrupt) : 전원 공급의 이상
- 기계 착오 인터럽트(Machine check interrupt) : CPU의 기능적인 오류
- 외부 신호 인터럽트(External interrupt) : I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
소프트웨어 인터럽트
소프트웨어가 발생시키는 인터럽트이다. 소프트웨어(사용자 프로그램)가 스스로 인터럽트 라인을 세팅한다.
- 예외 상황(Exception) : 프로그램이 허용되지 않은 연산을 수행하려고 할 때, 자동적으로 발생한다. 운영체제는 예외 상황이 발생했을 때, CPU의 제어권을 획득해 이 상황에 대한 조치를 취한다. ex) 0으로 나누는 연산, 자신의 주소 공간을 넘어서는 메모리 참조등
- 시스템 콜(System Call): 사용자 프로세스가 운영체제의 서비스를 요청하기 위해 커널의 함수를 호출하는 것. 사용자 프로세스가 직접 특권 명령을 수행할 수 없으므로 특권 명령을 수행하려 할 때, 시스템 콜을 사용.
특권 명령 : 특권 명령은 보안이 필요한 명령으로 입출력 장치, 타이머 등의 장치를 접근하는 명령이다. 특권 명령은 항상 운영체제만이 수행할 수 있다.
사용자가 만들어내는 프로그램은 불안정하고 보안성이 부족할 수 있기 때문에 사용자 공간에서 커널 공간의 코드에 접근하지 못하게 하기 위해 다음과 같이 두가지 CPU 모드를 둔다.
- 사용자 모드 : 사용자, 프로그램이 접근할 수 있는 범위를 두고 범위 내에서 동작을 한다.
- 커널 모드 : 컴퓨터의 자원들이 운영체제의 제어 하에 동작하며 특권 명령을 포함한 모든 종류의 명령을 사용할 수 있게 된다.
시스템 콜과 인터럽트
시스템 콜은 인터럽트를 발생시켜 동작한다.
시스템 콜은 커널의 함수를 호출하는 과정이므로, 주소 공간 자체가 다른 곳(커널의 code영역)으로 이동해야하기 때문에 프로그램이 인터럽트 라인에 인터럽트를 세팅하는 명령을 통해 이루어진다.
CPU가 인터럽트 라인을 검사하고 인터럽트가 발생한 것을 감지하면, 현재 수행중인 사용자 프로그램을 잠시 멈추고 CPU의 제어권을 운영체제에게 양도한다.(kernel mode) 그리고 이때 하드웨어적으로 모드 비트가 1에서 0으로 자동으로 세팅되어 특권 명령을 수행할 수 있게 된다.
인터럽트 처리 중 또 다른 인터럽트가 발생한다면?
원칙적으로 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것은 허용하지 않는다. 이는 데이터의 일관성을 유지하기 위해서인데, 예를 들어 인터럽트가 발생해서 운영체제 커널에 정의된 데이터를 변경하고 있는 상황에 또 다른 인터럽트가 발생해서 같은 데이터를 수정하게 된다면, 데이터가 원래 의도하지 않았던 값으로 변경될 수 있다.
예외상황 : 현재 인터럽트 처리 루틴보다 훨씬 급하고 중요하게 처리해야 할 인터럽트가 발생하는 경우, 현재 처리 중이던 인터럽트 코드의 수행 지점을 커널 스택에 저장한 뒤, 우선적으로 처리할 인터럽트를 처리하고 이전에 실행 중이던 인터럽트 코드 부분으로 되돌아와 남은 부분을 처리한다.
References
https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8
'TIL' 카테고리의 다른 글
[TIL] 데이터베이스 정규화 (0) | 2024.08.12 |
---|---|
[TIL] STOMP 개념 (2) | 2024.07.28 |
[TIL] SSL/TLS (0) | 2024.07.07 |
[TIL] CORS 문제와 해결법 (1) | 2024.07.01 |
[TIL] Spring의 의존성 주입 방법 (1) | 2024.06.23 |