뜌릅
인터럽트 - 운영체제 본문
인터럽트란?
OS에서 인터럽트란 매우 중요합니다.
우리가 마우스를 움직이거나 키보드로 타자를 칠때, 컴퓨터는 이를 즉각 수용하여 모니터 화면에 띄어 주어야 합니다.
이런 즉각적인 일을 하기 위해서는 기존의 하던일을 중단하고 IO로 들어온 요청을 수행해야 한다.(놀고있는 CPU 코어가 있다면 그 친구가 할수도 있긴합니다. 하지만 OS는 멀티프로그래밍을 지향하기 때문에 어떠한 일을 수행하고 있을 가능성이 큽니다.)
이러한 인터럽트는 CPU의 사용성을 증대시키는 방안으로 활용되었습니다. 예를들어 작업중에 DISK에서 새로운 데이터를 가져와야 하는 경우, 운영체제의 특성상 CPU가 직접 접근을 못하므로 IO 컨트롤러에게 대리로 시키게 됩니다. 그동안 작업은 대개 중단됩니다.
디스크 IO 컨트롤러(윈도우에서 작업관리자의 성능카테고리에 있는 디스크가 디스크 IO 컨트롤러의 사용량을 보여주는 녀석입니다.) 는 디스크에서 정보를 찾고 메모리에 복사하여 CPU에게 알려주게 됩니다.( 사실 IO는 메모리에 직접 접근이 불가능하므로 DMA라는 디바이스가 대신 처리후 인터럽트를 통해 CPU에게 알려주게 됩니다. )
이때 Interrupt 신호를 통해 CPU에게 작업이 끝났다는 것을 알려줍니다.
중요한 Instruction을 처리해야 할 경우가 있을수 있습니다. 그 경우 CPU Flag의 Interrupt disabled 영역을 1로 처리시 그 시간동안 Interrupt 요청을 하는것도 끝났다는 신호를 받는 것도 방지할수 있습니다.
반대로 매우 중요한 Interrupt일수도 있습니다. nonmaskable interrupt이라고 하는데 이 경우 Flag가 1로 되어있어도 무시하고 Interrupt 신호를 CPU에 전달합니다.
인터럽트의 진행 과정
인터럽트 요청을 보내는 진행과정은 어떻게 될까요??
아래의 그림과 같이 진행이 됩니다.
디바이스 컨트롤러 혹은 하드웨어 시스템이 인터럽트를 해야할 상황을 야기하게 되면 프로세서는 일단 현재 진행중인 Instruction을 끝냅니다. 프로세서는 그후 인터럽트의 신호를 보내기 위해 승인을 합니다. (아직 요청 보내지 않음.)
승인이 되었다면 프로세서는 기존의 PSW(Processor Status Word, 여러가지 Flag들이 존재함.)와 PC(Program Counter, 다음에 실행될 Instruction address을 저장하는 곳)을 Control Stack에 저장하고 인터럽트 프로세스에 맞게 새로 업데이트 합니다.
위와같은 과정을 통해 인터럽트 요청 프로세스에 요청을 하고 나면 다시 기존 Control Stack에 저장되어있는 PSW와 PC을 불러와서 복구합니다.
아래의 그림은 같은 내용을 한번더 설명한 것입니다.
N 지점에서 Instruction을 실행하고 있던 중에 인터럽트가 발생한 경우입니다.
그림과 같이 기존의 PC와 레지스터를 Control Stack에 저장하고 Restore을 할수 있게 Stack Pointer도 업데이트 합니다.
Restore과정은 역순으로 동일합니다.
또 재귀적으로 Interrupt가 발생할 경우도 동일하게 진행됩니다.
하지만 원래의 Instruction위치로 돌아오지 않을 경우도 존재합니다.
바로 멀티프로그래밍이란 개념과 관련이 있는데, 인터럽트가 CPU의 효율성을 증대했음에도, 더 효율성을 증대할수있었고 이를 위해 실행해야 할 프로그램이 있다면 스케줄러에 따라 우선순위를 판단하여 Instruction 순서들을 바꾸게 됩니다. 이때 Interrupt중에 순서가 바뀌게 되면 기존의 Instruction이 아닌 새로운 PC을 푸시하여 프로그램을 진행하게 됩니다.
인터럽트의 분류
내부 인터럽트:
내부 인터럽트는 CPU 내부에서 발생하는 인터럽트를 의미합니다. 이는 주로 소프트웨어의 오류나 예외 상황에서 발생합니다. 예를 들어, 0으로 나누는 연산을 수행하거나 메모리를 할당받지 못한 상황 등에서 내부 인터럽트가 발생할 수 있습니다.
하드웨어 인터럽트:
하드웨어 인터럽트는 외부 장치에서 발생하는 것으로, 주로 입/출력 장치 혹은 타이머 등 외부 장치에서 발생합니다. 예를 들어, 키보드에서 키를 누르거나 마우스를 클릭하는 것이 하드웨어 인터럽트에 속합니다. 이런 인터럽트는 운영체제가 직접 관리하며, 대부분의 경우 운영체제의 인터럽트 핸들러에 의해 처리됩니다.
소프트웨어 인터럽트:
소프트웨어 인터럽트는 프로그램이 실행 중인 상태에서 발생하는 인터럽트를 말합니다. 이런 인터럽트는 주로 프로그램의 실행 오류, 예외 상황, 명령의 실행 요청 등으로 인해 발생합니다. 소프트웨어 인터럽트는 프로그램 실행 중에 예기치 않은 상황이 발생할 경우, 운영체제에게 도움을 요청하기 위해 사용됩니다.
폴링과의 차이점
둘다 외부로부터 입력을 읽어오는 방식이다.
인터럽트는 입력이 들어올 시기를 모르는 경우 사용이 되고
폴링은 입력을 받는 주체가 주기적으로 입력이 들어왔는지 확인하는 것이다.
따라서 인터럽트의 경우 실시간 처리같은 이른바 카카오톡의 경우 인터럽트가 애용된다.
반면에 네트워크 라우터가 패킷을 받아들이는 경우 인터럽트를 사용하게 되면 오버헤드때문에 CPU사용률이 급감할수가 있다. (인터럽트 수행중에 또 인터럽트가 발생하므로 비효율적이게 된다. by context switiching)
마찬가지로 큰 용량의 데이터를 다운하게 되는경우 또한 폴링 방식이 더 우월하다.