OS

인터럽트

Debin 2022. 12. 28.
반응형

인터럽트

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

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

오늘날의 프로그래밍에서는 버튼이 눌렸는지 안 눌렸는지 주기적으로 확인하는 대신 버튼이 눌리면 프로세스에 알려주는데,

이를 이벤트 드리븐(Event Driven)이라고 한다.

 

운영체제에서의 입출력 처리도 이와 똑같다.

과거에는 입출력장치가 거의 없었으므로 입출력을 요청하면 운영체제가 주기적으로 입출력장치를 직접 확인해서 처리했다.

이러한 방식을 폴링이라고 한다.

 

하지만 다양한 입출력장치가 개발되어 운영체제가 모든 입출력을 관리하기 어려워지자 이벤트 드리븐 방식과 마찬가지로 입출력을 요청하고 입출력이 완료되면 이벤트를 발생시켜 이 사실을 알리게 되었는데 이를 인터럽트라고 한다.

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

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

 

동기적 인터럽트는 사용자 인터럽트라고도 하며, 아래와 같은 종류가 있다.

 

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

비동기적 인터럽트는 다음과 같다.

 

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

인터럽트 처리과정

인터럽트에는 해당 인터럽트가 발생하면 어떤 일을 할지 정의되어 있다.

즉 인터럽트 번호와 그 번호에 붙어 있는 함수의 쌍으로 이루어져 있다.

예를 들어 윈도우 화면의 최소화 버튼에는 창을 작게 만든 함수가 정의되어 있어 버튼을 누르면 창이 작아진다.

 

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

윈도우에서는 이 번호를 IRQ라고 하며, 시스템에 인터럽트가 발생하면 IRQ로 인터럽트를 식별한다.

 

인터럽트는 한 번에 하나씩 발생하는 것이 아니라 한순간에 여러 개가 발생하기도 한다.

이렇게 동시에 발생하는 인터럽트를 하나로 묶어서 처리하는 개념이 인터럽트 벡터다.

즉 인터럽트 벡터는 인터럽트의 집합이다.

 

인터럽트 처리 과정은 다음과 같다.

 

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

인터럽트와 이중모드

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

운영체제와 관련된 커널 프로세스가 실행되는 상태를 커널 모드,

사용자 프로세스가 실행되는 상태를 사용자 모드라고 한다.

 

사용자 프로세스가 하드디스크 입출력, 프로세스 생성과 같이 커널의 기능을 사용하려면 시스템 호출을 이용하여 커널 프로세스에 작업을 요청해야 한다.

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

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

 

이중 모드는 운영체제가 자원을 보호하기 위한 기법이다.

사용자 프로세스가 시스템 자원에 직접 접근하면 문제가 발생할 수 있기 때문에 커널은 시스템 호출을 통해서만 자원에 접근하도록 제한한다. 즉 사용자 프로세스가 커널 모드에서 실행되지 못하게 한다.

다양한 방법으로 시스템 호출을 사용하기 위해 운영체제는 API를 제공한다.

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

 

즉 사용자가 커널 모드로 진입하는 경우는 두 가지다.

 

  1. 시스템 호출을 사용하는 경우.
  2. 인터럽트를 발생시킨 경우.

시스템 호출에 의해 커널 모드로 진입하는 것은 자신이 원해서 진입하는 것이기 때문에

자발적이지만 인터럽트에 의해 커널 모드로 진입하는 것은 비자발적이다.

 

이상으로 포스팅을 마칩니다. 감사합니다.

반응형

댓글