인터럽트 핸들링

YangJiWon·2020년 9월 15일
0

인터럽트 핸들링

인터럽트 핸들링이란 인터럽트가 발생한 경우에 처리해야 할 일의 절차를 의미합니다.

인터럽트도 앞서 설명한 함수 호출과 유사한 메커니즘으로 처리하게 됩니다.

예를 들어,
프로그램 A가 수행되고 있을 때 인터럽트가 발생하면 A의 현재 상태를 저장하게 됩니다.
현재 상태란 현재 CPU가 수행중이던 메모리 주소를 포함해 몇 가지 부가적인 정보(레지스터 값)들을 의미합니다.
이것을 모두 저장한 후에야 인터럽트 처리가 이루어질 수 있습니다.

PCB

  • 운영 체제 커널 영역에는 현재 시스템 내에서 수행되는 프로그램들을 관리하기 위한 자료 구조인 프로세스 제어 블록을 두고 있습니다.

  • PCB 중 일부분은 인터럽트가 발생했을 때 프로그램의 어느 부분이수행되던 중이었는지를 정하기 위한 자료 구조로 사용됩니다.

  • 저장되는 내용으로는 현재 수행중이던 메모리 주소와 레지스터 값, 그리고 하드웨어 상태 등이 있습니다.

다시 핸들링 부분으로 돌아가자면, 프로그램 내부의 함수 호출시 그 복원 지점에 대한 정보는 각 프로그램의 주소 공간 중 스택 부분에 저장됩니다.

한편, 인터럽트 처리 루틴은 운영 체제 커널 프로그램 중 일부이고 커널 역시 함수 구조로 이루어져 있으므로 인터럽트 처리 코드가 수행되는 도중에는 함수 호출이 이루어질 수 있어 스택의 이용이 필요합니다.

즉, 인터럽트 처리 루틴으로 넘어와서 함수 호출이 이루어질 경우에는 각 프로세스별로 독자적인 커널 스택을 사용하게 됩니다. 디시 말하면 직전에 인터럽트당한 프로세스의 독자적인 커널 스택에 함수 호출 및 리턴과 관련된 정보를 저장하게 됩니다.

인터럽트가 발생 했을 때, 메모리에서 일어나는 과정

  1. 프로그램 A가 수행 중에 인터럽트가 발생
  2. 현재까지 수행된 지점을 프로세스 제어 블록에 저장
  3. 인터럽트 처리 루틴으로 와서 커널 코드를 수행
  4. 이 때 이루어지는 함수 호출은 프로세스 A의 커널 스택을 사용
  5. 인터럽트 처리가 끝마쳐진 후에는 프로세스 제어 블록에 저장된 주소로 되돌아가서 중지된 작업의 나머지 부분 수행

인터럽트 처리 중에 또 다른 인터럽트가 발생했을 때

  • 원칙적으로는 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용하지 않습니다.
    그 이유는 인터럽트 처리 중에 다른 인터럽트를 처리하게 되면 데이터의 일관성이 유지되지 않는 경우가 발생할 수 있기 때문입니다.
    하지만 인터럽트마다 중요도가 다르기 때문에 상대적으로 낮은 중요도를 가진 인터럽트 작업 수행 중에 중요도가 더 높은 인터럽트가 발생하는 것을 허락할 필요가 있습니다.
  1. A라는 프로그램이 수행되다가 인터럽트가 발생하면 인터럽트 처리 루틴 내에서의 함수 호출 및 리턴 정보는 A의 커널 스택에 저장
  2. 요청된 인터럽트에 대한 처리를 수행하던 중에 또 다른 인터럽트 발생
  3. 인터럽트 처리 중 발생하는 함수 호출 및 리턴과 관련된 정보를 A의 커널 스택에 또 다시 저장
  4. 스택에서 함수를 호출한 후 호출된 함수가 또 다른 함수를 호추할 때와 마찬가지로 중요도가 높은 인터럽트를 먼저 처리하고난 후, CPU를 점령당한 이전의 인터럽트로 돌아가서 하던 작업을 처리하게 됨

정리하자면,
인터럽트 처리 중에 인터럽트가 발생한다고 해도 이전 인터럽트 발생했을 때의 프로그램 스택에 이전 인터럽트 정보를 저장하게 됩니다.

소프트웨어 인터럽트

  • 통상적으로 인터럽트라고 하면 하드웨어 인터럽트를 의미하고, 소프트웨어 인터럽트는 트랩이라는 용어라고 불립니다.

  • 소프트웨어 인터럽트의 예로는 예외 상황(exception), 시스템 콜(system call) 등이 있습니다.

  • 예외 상황이란 프로세스가 0으로 나누는 연산 등 불가능한 작업을 시도하거나, 자신의 메모리 영역 바깥을 접근하려는 시도를 할 때 이에 대한 처리를 위해 발생시키는 인터럽트를 말합니다.

  • 시스템 콜이란 프로그램이 자신이 작성하지 않은 코드를 운영 체제로부터 서비스받기 위해 발생시키는 인터페이스
    즉, 응용프로그램의 요청에 커널에 접근하기 위한 인터페이스
    예를 들면, 실제 printf()함수를 사용할 때 printf() 함수는 궁극적으로 운영 체제 내에 정의된 write()라는 시스템 콜을 호출합니다.

  • 일반적인 함수 호출과 시스템을 콜을 비교하자면,
    함수 호출이란 자신이 작성한 함수 또는 라이브러리에서 정의된 함수를 호출하는 것을 말하고, 시스템 콜이란 운영 체제에 정의된 함수를 호출하는 것을 말합니다.

  • 소프트웨어 인터럽트는 하드웨어 인터럽트처럼 CPU에 인터럽트 라인을 세팅하여 발생시키는 인터럽트가 아니라 프로그램 수행 도중 직접 CPU에 인터럽트 라인을 세팅하여 발생시키게 됩니다.

profile
데이터데이터데이터!!

0개의 댓글