CS/Operating System
[Operating System] Interrupt(인터럽트)
hanseongbugi
2024. 4. 4. 17:20
Interrupt(인터럽트)?
- 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알리는 것
- 지금 수행 중인 일보다 더 중요한 일(입출력, 우선 순위 연산 등)이 발생하면 그 일을 먼저 처리하고 나서 하던 일을 계속해야한다.
- 외부/내부 인터럽트는 CPU의 하드웨어 신호에 의해 발생
- 소프트웨어 인터럽트는 명령어의 수행에 의해 발생
- 외부 인터럽트
- 입출력 장치, 타이밍 장치, 전원 등 외부적인 요인으로 발생
- 예) 전기신호, 기계 착오, 외부 신호, 입출력
- 내부 인터럽트
- Trap으로 부르며, 잘못된 명령이나 데이터를 사용할 때 발생
- 예) 0으로 나누기가 발생, 오버플로우, 명령어를 잘못 사용한 경우(Exception)
- 소프트웨어 인터럽트
- 프로그램 처리 중 명령의 요청에 의해 발생한 것 (SVC 인터럽트)
- 사용자가 프로그램을 실행시킬 때 발생
- 소프트웨어 이용 중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 동작이 실행된다.
인터럽트 처리 과정
- 프로그램이 실행되다 인터럽트가 발생한 경우
- 현재 수행 중인 프로그램을 멈추고, 상태 레지스터와 PC등을 스택에 잠시 저장한 후 인터럽트 서비스 루틴으로 간다.
- 잠시 저장하는 이유는 인터럽트 서비스 루틴이 끝난 후 다시 원래 작업으로 복귀해야 하기 때문
- 만약 인터럽트 기능이 없다면, 컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크를 해야한다.
- 이를 폴링(Polling)이라고 한다.
- 폴링을 하는 시간에는 원래 하던일에 집중할 수가 없게 되어 많은 기능을 제대로 수행하지 못한다는 단점이 있었다.
- 컨트롤러가 입력을 받아들이는 방법(우선순위 판별방법)에는 두가지가 있다.
- 폴링 방식
- 사용자가 명령어를 사용해 입력 핀의 값을 계속 읽어 변화를 알아내는 방식
- 인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾아 이에 맞는 인터럽트 서비스 루틴을 수행한다. (하드웨어에 비해 속도 느림)
- 인터럽트 방식
- MCU 자체가 하드웨어적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식
- Daisy Chain
- 병렬 우선순위 부여
- 인터럽트 방식은 하드웨어로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속하게 대응하는 것이 가능하다.
- 따라서 실시간 대응이 필요할 때는 필수적인 기능이다.
- 즉, 인터럽트는 발생시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법이다.
인터럽트 서비스 루틴(ISR : Interrupt Service Routine)
- 인터럽트가 발생하면 처리하기 위한 루틴인 ISR이 실행된다.
- 주 프로그램 작업 수행 중 인터럽트 발생
- 주 프로그램 상태 레지스터와 PC 등을 스택에 잠시 저장
- 인터럽트 서비스 루틴으로 점프, 처리
- 다시 주 프로그램 작업 복귀
이중 동작 모드
- 사용자와 OS는 시스템 자원을 공유하기 때문에 사용자에 제한을 두지 않으면 사용자가 메모리 내 주요 자원을 망가뜨릴 위험이 있다.
- 따라서 사용자의 시스템 자원을 막는 보호 장치가 필요하고, 이 것이 이중 동작 모드이다.
- 이중 동작 모드는 사용자가 접근할 수 없는 커널 모드, 접근할 수 있는 사용자 모드로 나뉜다.
- 커널 모드는 supervisor mode, system mode, privileged mode로 불린다.
- 프로세스는 사용자 모드에서 실행되다가 OS에게 시스템 사용을 요청하면 커널 모드로 전환되어 요청된 시스템을 실행한 후 다시 사용자 모드로 전환한다. (시스템 콜)
- 시스템 콜은 하나의 인터럽트로 취급된다.
- 커널 모드와 사용자 모드를 구분하기 위해서는 mode bit가 사용되며 0이 커널 모드, 1이 사용자 모드이다.
- OS는 일부 명령들을 특권 명령으로 지정하고 커널 모드에서만 실행되게 하며 사용자 모드에서 실행하려고 하면 trap을 건다.
출처
https://github.com/gyoogle/tech-interview-for-developer
https://velog.io/@pppp0722/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt%EB%9E%80