인터럽트

김재연·2024년 2월 4일

서론

이 글은 쉽게 배우는 운영체제를 읽고 잊어버리지 않기 위해 기록하는 글입니다.

인터럽트 처리

오늘날의 운영체제는 입출력 시 인터럽트를 이용하여 시스템의 효율을 높입니다.

인터럽트의 개념

인터럽트 처리는 입출력뿐만 아니라 시스템을 보호하는 데 매우 중요한 작업입니다.

컴퓨터를 사용하기 시작한, 초기의 프로그래밍 방식은 프로그램을 위에서부터 한 줄씩 차례로 실행하는 순차적 프로그래밍 방식을 사용했습니다.

순차적 프로그래밍은 지금도 사용되는 가장 일반적인 방식이지만, 특정 문제를 해결하는데에는 굉장히 취약해요.

크롬 웹 브라우저에서 웹을 끄기 위해서 x 버튼을 누른다고 가정해볼게요.

이전 방식이었다면, 이는 버튼이 눌렸는지 안눌렸는지 계속 검사해야하고, 또한, 종료 버튼만이 아니라 다른 버튼도 있었다면 여러가지 버튼이 눌렸는지 눌리지 않았는데 계속 확인하며 분기처리를 해줬어야 했을거에요. (폴링 방식)

하지만, 여기서 x 버튼을 눌렀을 때 이벤트를 발생시킨다면 그럴 필요가 없겠죠.

이를, 이벤트 드리븐 이라고 하고, 이렇게 되면 사용자가 버튼을 눌렀는지 안눌렀는지 주기적으로 확인할 필요가 없어요.

이러한 기법을 인터럽트라고 합니다.

동기적 인터럽트와 비동기적 인터럽트

인터럽트는 프로세스가 실행 중인 명령어로 인해 발생하는 동기적 인터럽트, 실행 중인 명령어와 무관하게 발생하는 비동기적 인터럽트로 나눌 수 있어요.

동기적 인터럽트는 사용자 인터럽트라고도 하며 다음과 같은 종류가 있어요.

  • 프로그램 상의 문제 때문에 발생하는 인터럽트 (예: 다른 사용자의 메모리 영역에 접근하는 경우, 오버 플로나 언더 플로에 의해 발생하는 경우 등)
  • 컴퓨터 작업자가 의도적으로 프로세스를 중단하기 위해 발생시킨 인터럽트(예 ctrl + c)
  • 입출력장치 같은 주변 장치의 조작에 의한 인터럽트
  • 산술 연산 중 발생하는 인터럽트

등이 있고, 비동기적 인터럽트는 하드디스크 읽기 오류, 메모리 불량과 같은 하드웨어적인 오류로 발생하는 인터럽트로, 사용자가 직접 작동하는 키보드 인터럽트, 마우스 인터럽트 등도 있어요.

인터럽트 처리 과정

인터럽트가 처리되는 과정은 단순해요, key - value 형식으로 인터럽트 번호와 함수의 쌍으로 이루어져있어요.

출처 : 쉽게 배우는 운영체제

그림으로 표현하면 다음과 같이 단순하게 표현할 수 있는 것이죠.

시스템에는 많은 인터럽트가 존재하고, 각 인터럽트에는 고유 번호, 인터럽트 번호가 있어요.

윈도우에서는 이를 IRQ 라고 합니다.

출처 : 쉽게 배우는 운영체제

위 그림은 인터럽트가 처리되는 과정을 보여줘요. 그림에서 보이는바와 같이 인터럽트는 동시에 발생하는 경우가 많기 때문에, 하나로 묶어서 처리하는 개념이 인터럽트 벡터에요.

각각 인터럽트 벡터에는 핸들러들이 연결되어 있어요, 인터럽트 벡터가 발생하면 핸들러가 실행되는 것이죠.

그리고 보는 바와 같이 여러개의 요소들이 있고, 여러개의 요소가 1로 바뀌어 동시에 인터럽트가 발생할 수도 있답니다.

인터럽트 처리 과정을 다음과 같이 정리할 수 있어요.

  1. 인터럽트가 발생하면 현재 실행 중인 프로세스는 일시 정지 상태가 된다. 재시작하기 위해 현재 프로세스 관련 정보를 임시로 저장한다.
  2. 인터럽트 컨트롤러가 실행되어 인터럽트의 처리 순서를 결정, 이 때 여러개의 인터럽트가 동시에 발생했다면, 인터럽트의 우선순위를 고려하여 중요한 인터럽트부터 처리
  3. 먼저 처리할 인터럽트 결정되면, 벡터에 등록된 인터럽트 핸들러가 실행됩니다.
  4. 인터럽트 벡터에 연결된 핸들러가 인터럽트 처리를 마치면 프로세스가 다시 실행되거나 종료됩니다. 입출력으로 인한 일시 정지였으면 다시 실행, 메모리 영역 침범이나 오류 같은 경우면 종료됩니ㅏㄷ.

인터럽트와 이중 모드

프로세스는 크게 커널 프로세스와 사용자 프로세스로 나뉩니다.

운영체제와 관련된 커널 프로세스가 실행되는 상태를 커널 모드, 사용자 프로세스가 실행되는 상태를 사용자 모드라고 하는데, 사용자 프로세스가 하드디스크 입출력, 프로세스 생성과 같이 커널의 기능을 사용하려면 시스템 호출을 이용해야 합니다.

사용자 프로세스는 시스템 호출을 요청한 후 대기 상태로 전환되며, 커널 프로세스는 요청 받은 작업을 처리하게 됩니다.

즉, 사용자 모드에서 커널 모드로 전환되는데, 이와 같이 운영체제가 두 모드를 전환하며 일 처리를 하는 것을 이중 모드라고 합니다.

이중 모드는 운영체제가 자원을 보호하기 위해 사용하는 기법인데, 사용자 프로세스가 시스템 자원에 직접 접근하면 문제가 발생할 수 있기 때문에, 사용자프로세스가 커널 모드로 실행되지 못하고, 시스템 호출을 통해서 자원에 접근하게끔 하는 것입니다.

커널이 제공하는 시스템 호출은 사용하기가 매우 어렵고 제한적이기 때문에, 다양한 방법으로 시스템 호출을 사용하기 위해 API 를 제공합니다.

사용자는 시스템 호출을 사용할 수 있고, API 가 준비해놓은 다양한 함수를 이용하여 시스템 자원에 접근할 수 있는 것이죠.

출처 : 쉽게 배우는 운영체제

종합하면 사용자가 커널 모드로 진입하는 경우는 두가지입니다.

첫째, 시스템 호출을 사용한 경우, 둘째, 인터럽트를 발생시킨 경우입니다.

또한, 시스템 호출에 의해 커널모드 진입은 자발적, 인터럽트에 의해 커널 모드로 들어가는 경우는 비자발적입니다.

어떤 프로세스가 인터럽트를 발생시켰다는 것은 잘못된 명령을 수행하여 동기적 인터럽트가 발생한 것이므로 프로세스가 강제 종료되며, 그러므로 사용자 프로세스가 자발적으로 커널 모드에 진입할 수 있는 유일한 수단은 시스템 호출입니다.

결론

쉽게 배우는 운영체제는 참 쉽게 잘 알려주는 것 같아요

profile
끊임없이 '성장'하는 개발자 김재연입니다.

0개의 댓글