[OS] Interrupt

👑 Interrupt

인터럽트 (Interrupt)는 하드웨어 또는 소프트웨어 이벤트가 발생할 때 CPU의 현재 작업을 중단하고

즉시 그 이벤트를 처리하기 위한 메커니즘이다. 이는 주로 I/O 장치나 타이머 등의 요청을 처리하기 위해

사용된다. 한 가지 예로, 시분할 시스템에서는 time slice가 끝날 때 마다 Timer Interrupt

발생시켜 현재 프로세스의 작업을 중지시키고, 스케줄링을 실행시켰다.


💡 종류

  • 하드웨어 인터럽트 (Hardware Interrupt)

    • 외부 장치(예: 키보드, 마우스)에서 발생하며, 하드웨어 신호를 통해 CPU에 인터럽트를 요청한다.


  • 소프트웨어 인터럽트(Software Interrupt) == 트랩 (Trap)

    • 소프트웨어에서 발생하며, 주로 예외 상황(예: 0으로 나누기)이나 시스템 호출을 위해 사용된다.


💡 주요 특성

  • 비동기(Asynchronous) 이벤트 처리

    • 인터럽트는 비동기적으로 발생한다.

    • 즉, 현재 실행 중인 프로그램의 흐름과 관계없이 언제든지 발생할 수 있다.


  • 중첩 처리(Nested Processing)

    • 인터럽트는 중첩되어 발생할 수 있다.

    • 즉, 하나의 인터럽트가 처리되는 도중에 또 다른 인터럽트가 발생할 수 있다.

    • 이러한 상황에서 시스템은 우선 순위에 따라 인터럽트를 처리한다.

    • 예를 들어, 높은 우선 순위의 인터럽트가 낮은 우선 순위의 인터럽트보다 먼저 처리된다.


💡 동작 방식

  • 인터럽트 발생

    • 주변 장치에서 이벤트가 발생하면, 해당 장치는 CPU에 인터럽트 신호를 보낸다.

    • User mode에서 Kernel modemode change가 발생한다.


      사용자 모드(User Mode) : 프로그램이 일반적인 응용 프로그램 코드로 실행되는 모드이다.
      커널 모드(Kernel Mode) : 운영체제의 핵심 기능을 수행하기 위한 모드로,
                              하드웨어 자원에 대한 완전한 접근 권한을 가진다.
    


  • 현재 작업 중단 및 Context 저장

    • CPU는 현재 실행 중인 명령어를 완료하고, 인터럽트를 받아들인다.

    • 현재 작업의 상태(PC, 레지스터 값 등)를 저장하여 나중에 작업을 재개할 수 있도록 한다.


  • 인터럽트 벡터를 통해 핸들러 호출

    • CPU는 IVT을 참조하여, 해당 ISR(=인터럽트 핸들러)을 찾는다.

    • ISR(= 인터럽트 핸들러)는 인터럽트 요청을 처리하는 코드를 포함하고 있다.

    • IDT(Interrupt Descriptor Table) = IVT (Interrupt Vector Table)

    • IVT : 각 인터럽트 번호에 대응하는 ISR(Interrupt Service Routine) 주소를 갖는 테이블


  • 인터럽트 처리

    • ISR은 인터럽트 서비스 작업의 최소한의 긴급한 부분을 수행한다.

    • 예를 들어, 데이터 수신이나 장치 상태 확인 등 즉각적인 처리가 필요한 작업을 수행한다.

    • ISR은 또한 나중에 처리할 필요가 있는 나머지 작업(bottom half)을 표시(mark)한다.

    • 이 작업은 인터럽트 처리의 하단부로, 덜 긴급한 작업을 의미한다.


  • 새로운 인터럽트가 발생하면 반복

    • ISR 실행 중에 새로운 인터럽트가 발생하면, 커널은 위 단계를 반복하여 새로운
      인터럽트를 처리한다


  • ISR 완료 후 특별 코드 블록 실행

    • ISR 및 다른 모든 중첩된 ISR이 완료되면, 커널은 Special code block을 실행한다.

    • 이 코드 블록은 다음 작업을 수행한다.

      • 모든 표시된(bottom halves) 인터럽트 처리의 하단부를 실행한다.
      • 완료된 프로세스를 준비 상태로 설정한다.
      • 스케줄러를 호출한다.


  • 스케줄러가 적절한 작업 선택

    • 스케줄러에 의해 다음 작업이 선택된다.

      • 인터럽트된 작업이 다시 선택될 경우 : 저장된 context를 복원하고 인터럽트된 작업을 재개
      • 그 외의 경우 : 문맥 전환(Context Switch)을 수행하여 다른 작업을 실행


🚩 To Do After System Call/Interrupt

시스템 호출이나 인터럽트가 발생한 후, 운영체제는 여러 작업을 수행해야 한다.

Linux 운영체제는 시스템 호출이나 인터럽트가 완료된 후에 실행되는 Special code block을 가지고 있다.

이 코드 블록은 남은 작업을 완료하고 시스템 상태를 점검하는 역할을 한다.

  • 남은 인터럽트 서비스 루틴 수행

    • 인터럽트 처리의 상단부에서 즉시 처리되지 않은 작업(하단부 작업)이 남아 있을 수 있다.

    • 이 작업들은 후속 처리로 예약되어 있고, 이 특별 코드 블록에서 수행된다.

  • 처리해야 할 Signal 확인

    • 프로세스에 대기 중인 Signal이 있는지 확인하고, 있으면 처리한다.
  • 스케줄러 호출 필요 여부 확인

  • 스케줄러 호출 및 프로세스 전환

    • 스케줄러가 호출되면, 현재 프로세스를 준비 상태(Ready state)로 전환하고,
      다음 실행할 프로세스를 선택하여 활성화한다.

    • 이 과정은 문맥 전환(Context Switch)을 포함한다. 즉, CPU는 현재 프로세스의 상태를
      저장하고, 선택된 새로운 프로세스의 상태를 복원하여 실행을 시작한다.


💡 예시

키보드를 사용자가 눌렀을 때

  1. 키보드를 누르면 키보드 장치는 인터럽트를 발생시켜 CPU에 알린다.

  2. CPU는 현재 작업을 중단하고, 키보드 인터럽트를 처리하는 핸들러를 호출한다.

  3. 인터럽트 핸들러는 키보드 입력을 읽어와 메모리에 저장하거나, 해당 입력을 처리한다.

  4. 인터럽트 처리가 완료되면 CPU는 원래의 작업을 재개한다.


Time Slice

운영체제는 주기적으로 time slice를 설정하여 특정 시간 간격마다 timer interrupt

발생하도록 한다. 이 인터럽트는 프로세스 스케줄링과 같은 주기적인 작업을 수행하는 데 사용된다.


👑 Trap

트랩 (Trap)이란 CPU에 의해 발생하는 인터럽트 (Interrupt)이다.

주로 비동기 (Asynchronous) 소프트웨어적인 이벤트로 인해 발생하며, 커널은 트랩을

인터럽트와 같은 방식으로 처리한다.

Categories:

Updated:

Leave a comment