본문 바로가기

CS Study/Operating System

Interrupt 란? 인터럽트 프로세스, 인터럽트 우선순위

1. 인터럽트

CPU당 하나의 Task(Process/Thread)만 실행할 수 있기 때문에, 사용자에게 멀티 태스킹을 지원하기 위해서는 Task를 Switching하며 구동되어야 합니다. 이때 Task간 Switching하는 과정에서 발생하는 요청을 인터럽트라고 합니다.

 

또는 CPU가 프로그램을 실행하고 있을 때, 입출력 장치나 예외상황이 발생하여 처리가 필요할때 프로세서에게 알려 처리할 수 있도록 하는 것을 의미합니다.

 

  1. I/O Device와 커뮤니케이션
    저장매체에서 데이터 처리를 완료한뒤 프로세스를 깨워야할때 인터럽트가 필요합니다. (block -> ready)
  2. 예외 상황 핸들링
    0으로 나누려는 연산의 경우 알 수 없기 때문에 인터럽트가 필요합니다. 이때는 Process를 Kill 해줍니다.
  3. 타이머 인터럽트
    선점형 스케쥴러를 위해 필요합니다. 하드웨어로부터 일정 시간마다 타이머 인터럽트로 OS에게 알려줍니다.

2. Context Switching

'왜 Context Switching이 필요한가요?'

CPU는 한번에 하나의 Task만 수행할 수 있습니다. 다른 Task를 처리하려면 현재 진행중인 Task가 끝날때까지 기다려야 합니다. 이때 Interrupt 요청에 의해 빠른 속도로 Task를 바꿔가며 실행하면 사람의 눈으론 실시간으로 보이게 되는 멀티 태스킹을 지원하는것처럼 보이게 됩니다.

멀티 프로세서 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존 프로세스의 상태 또는 레지스터의 값을 저장하고, CPU가 다음 프로세스를 실행하도록 새로운 프로세스의 상태 또는 레지스터의 값을 교체하는 작업을 Context Switching 이라고 합니다.

 

Context Switching 과정에서 CPU는 아무런 일을 하지 못합니다. 따라서 context switching이 잦아지면 오히려 오버헤드가 발생해 성능이 떨어질 수 있습니다.

 

다음과 같은 인터럽트 요청이 왔을때 Context Switching이 발생합니다

 

  • I/O request
  • time slice expired (CPU 사용이 만료되었을때)
  • fork a child(자식 프로세스를 만들때)
  • wait for an interrupt (인터럽트 처리를 기다릴때)

2.1. Context Switching 과정

 

현재 실행하고 있는 Task의 PCB 정보를 저장합니다. PCB는 Process Statck, Ready Queue 자료구조로 관리가 됩니다. 이때 PCB에서는 주로 프로세스의 상태, Program Counter, Register, Process number 와 같은 정보를 저장합니다.

 

다음 실행할 Task의 PCB 정보를 읽어 Registier에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행할 수 있습니다.

 

2.2. 프로세스 vs 스레드 Context Switching

프로세스에서 컨텍스트 스위칭이 일어났을 경우, PCB 구조상 공유하는 데이터가 없으므로 캐시가 지금껏 쌓아놓은 데이터들이 무너지고 새로 캐시 정보를 불러와야하기 때문에 시스템에 부담이 갑니다. 반면, 스레드 컨텍스트 스위칭은 스레드가 바뀌어도 공유하는 데이터가 있기 때문에 프로세스 컨텍스트 스위칭에 비해 빠릅니다.

 

 

3. 하드웨어 인터럽트

  • 전원이상
  • 기계문제
  • time interrupt : 선점형 스케쥴러 위해 필요하다. H/W로 부터 일정시간마다 타이머 인터럽트를 OS에 알려준다. 일정 시간마다 process를 교체하겠다. ex) 수시로 timer interrupt가 발생하면 OS가 timer interrupt 횟수를 기억했다가 5번이상이다! 이럴때 현재 프로세스를 중지하고 다른 프로세스를 실행한다.

4. 소프트웨어 인터럽트

  • Exception : 프로그램이 오류를 범한 경우로 CPU가 명령어를 실행하다가 비정상적인 상황을 감지할 때 발생한다. ex) 0으로 나누기, overflow/underflow 발생, 권한 없는 메모리 참조 등
  • System Call : 프로그램이 커널 함수를 호출하는 경우 발생하는 인터럽트

5. 인터럽트 프로세스

인터럽트 기능이 없다면?
특정한 어떤 일을 할 시기를 모르기 때문에 계속 체크를 해야한다. (이를 Polling 이라고 한다.)

  1. 프로세스 실행 중, 인터럽트 발생

  2. 현재 실행중인 프로세스 중단 ← CPU는 한번에 하나의 명령밖에 처리하지 못한다!

  3. 현재의 프로그램 상태를 보존한다. (PCB, PC 등등)

  4. 인터럽트 처리 루틴 실행 : 인터럽트를 요청한 장치를 식별한다.

  5. 인터럽트 원인을 파악하고 실질적인 작업을 수행하는 인터럽트 서비스 루틴을 실행한다. 이때 만약, 우선순위가 더 높은 인터럽트가 발생하면 재귀적으로 1~5번 과정을 수행한다. 인터럽트 처리 함수 실행 (커널모드)

  6. 상태 복구 :인터럽트 발생시 저장해둔 Program Counter를 다시 복구한다.

  7. 중단된 프로그램 실행 재개 : Program Counter값을 이용하여 이전에 수행중이던 프로세스를 재실행한다.

6. 인터럽트 우선순위 판별 방법

일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선 순위가 높다.

 

  • 전원 공급 이상
  • CPU의 기계적인 오류
  • 외부 신호에 의한 인터럽트
  • 입출력 전송 요청 및 전송 완료 / 전송 오류
  • 명령어 오류
  • 슈퍼바이저 호출

6.1. 소프트웨어적인 방법(Polling)

  • 인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 실행한다.
  • 많은 인터럽트가 있을 경우 하드웨어적인 방법에 비해 우선순위 판단 속도가 느리다.
  • Polling 의 주기가 짧으면 성능에 부담이 가고 주기가 길어지면 실시간성이 떨어진다

6.2. 하드웨어적 방법(Vectored Interrupt)

  • 인터럽트를 요청할 수 있는 장치와 CPU사이에 장치번호를 식별할 수 있는 버스를 직렬/병렬로 연결한다.
  • 인터럽트 벡터는 인터럽트를 발생할 장치가 분기할 곳에 대한 정보이다.
  • 소프트웨어적인 방법에 비해 비경제적이다.

6.2.1 Daisy Chain

인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결하여 우선순위가 높은 장치를 상위에 두어 차례대로 배치한다.

6.2.2. 병렬(Parallel) 우선순위 부여 방식

  • 인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
  • 각 장치별 우선순위를 판별하기 위한 Mask Register에 bit를 설정한다.
  • Mask Register상 우선순위가 높은 서비스 루틴 수행중 우선순위가 낮은 bit들을 비활성화 시킨다.
  • 따라서 우선순위가 높은 인터럽트가 낮은 인터럽트 수행중에도 우선 처리된다.