Post

In/Out[Interrupt I/O]

인터럽트 기반 입출력

CPU는 장치 컨트롤러에 입/출력 작업을 명령하고, 장치 컨트롤러가 입/출력 장치를 제어하며 입/출력을 수행하는 동안 CPU는 다른 일을 할 수 있습니다.

장치 컨트롤러가 입/출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행합니다.

이렇게 인터럽트를 기반으로 하는 입/출력을 인터럽트 기반 입출력이라고 합니다.

그리고 여기서 알 수 있듯이 입/출력 장치에 의한 하드웨어 인터럽트는 입/출력 장치가 아닌 장치 컨트롤러에 의해 발생한다는 사실 또한 알 수 있습니다.

하지만 입/출력 장치가 한 개가 아닌 여러 개의 입/출력 장치가 있다고 가정을 해보겠습니다.

EX) 마우스,키보드, 모니터

이렇게 여러 개의 입/출력 장치가 동시다발적으로 인터럽트가 발생한 경우에는 어떻게 처리되는지 알아보겠습니다.

인터럽트를 처리하는 방법에는 순서대로 처리하거나 우선순위를 판별하여 처리하는 방법이 있습니다.

먼저 순서대로 처리하는 경우입니다.

순서대로 처리

Interrupt-1

순서대로 처리하는 경우는 간단합니다.

말 그대로 인터럽트가 발생한 순서대로 처리하는 방식입니다.

  1. 프로그램을 실행합니다.

  2. A인터럽트가 발생하면 백업을 한 후, 인터럽트 백터를 참조하여 이에 맞는 인터럽트 서비스 루틴을 찾습니다.

  3. A인터럽트 서비스 루틴을 실행합니다.

  4. A인터럽트 서비스 루틴이 끝나면, 백업 기점으로 복귀하여 다시 프로그램을 실행합니다.

이후에 인터럽트가 다시 발생하면 1 ~ 4번의 작업을 반복합니다.

이렇게 가능한 이유는 CPU가 플래그 레지스터 속 인터럽트 비트를 비활성화 한 해 인터럽트를 처리하는 경우 다른 입/출력 장치에 의한 하드웨어 인터럽트를 받아들이지 않기 때문에 CPU는 이렇듯 순차적으로 하드웨어 인터럽트를 처리하게 됩니다.

하지만 모든 인터럽트를 순차적으로 해결 하는 건 불가능합니다.

인터럽트 중에서도 더 빨리 처리 해야 하는 인터럽트가 존재하기 때문입니다.

즉, CPU는 인터럽트의 우선순위를 고려하여 우선순위가 높은 인터럽트 순으로 여러 인터럽트를 처리 할 수 있습니다.

우선순위

Interrupt-2

우선순위가 있는 경우에는 다음과 같이 처리합니다.

  1. 프로그램을 실행합니다.

  2. A인터럽트가 발생하면 백업을 한 후, 인터럽트 백터를 참조하여 이에 맞는 인터럽트 서비스 루틴을 찾습니다.

  3. A인터럽트 서비스 루틴을 실행합니다.

  4. A인터럽트 서비스 루틴을 실행중, 우선순위가 높은 B인터럽트가 발생한 경우 백업을 해두고 B인터럽트 서비스 루틴을 실행합니다.

  5. B인터럽트 서비스 루틴을 실행합니다.

  6. B인터럽트 서비스 루틴이 종료되면 이전에 백업해두었던 A인터럽트 서비스 루틴으로 복귀합니다.

  7. A인터럽트 서비스 루틴을 실행합니다.

  8. A인터럽트 서비스 루틴이 종료되면 프로그램의 백업 지점으로 복귀합니다.

  9. 백업 지점으로부터 프로그램 실행을 재개합니다.

하지만 만약에 플래그 레지스터 속 인터럽트 비트가 활성화 되어있는 경우나 인터럽트 비트를 비활성화 해도 무시할 수 없는 인터럽트인 NIM이 발생한 경우, CPU는 우선순위가 높은 인터럽트를 처리합니다.

이때 다중 인터럽트를 처리하는 방법은 다양하지만 요즘에는 프로그래머블 인터럽트 컨트롤러인 PIC라는 하드웨어를 사용합니다.

PIC

PIC는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에게 지금 처리해야 할 하드웨어 인터럽트는 무엇 인지를 알려주는 장치입니다.

PIC의 각 핀에는 하드웨어 인터럽트 요청을 보낼 수 있는 약속된 하드웨어가 연결되어 있습니다.

PIC에 연결된 장치 컨트롤러들이 동시에 하드웨어 인터럽트 요청을 보내면 PIC는 이들의 우선순위를 판단하여 CPU에게 가장 먼저 처리 해야 할 인터럽트를 알려줍니다.

과정은 이렇습니다.

  1. PIC가 장치 컨트롤러에서 인터럽트 요청 신호를 받아들입니다.

  2. PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 보냅니다.

  3. CPU는 PIC에 인터럽트 확인 신호를 보냅니다.

  4. PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보냅니다.

  5. CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고, 해당 장치의 인터럽트 서비스 루틴을 실행합니다.

참고로 PIC가 무시할 수 없는 인터럽트인 NMI까지 우선순위를 판별하지 않습니다.

왜냐하면 NMI는 우선순위가 가장 높아 우선순위 판별이 불필요하기 때문입니다.

This post is licensed under CC BY 4.0 by the author.