인터럽트 - CPU 비동기 처리 원리
우리는 입출력 장치를 통해 컴퓨터를 사용하고, 이 처리들은 CPU를 통해 이루어진다.
CPU 자원은 한정되어 있는데 이 CPU가 수많은 작업들을 빠르게 처리하려면 어떻게 해야할까?
이에 대한 답을 찾기위해 우리가 CPU를 사용하는 과정을 알아보고,
어떻게 CPU를 효율적으로 사용할 수 있는지 공부해보자.
∎ 입력이 CPU에 닿는 법
⦁ 우리가 사용하는 입출력 장치는 장치 컨트롤러를 통해 CPU, 공유 메모리와 연결된다.
(장치 컨트롤러는 하드웨어 통로이다.)
⦁ 하드웨어인 장치 컨트롤러를 응용 프로그램에서 사용하기 위해서는 이를 제어하는 소프트웨어가 필요하고, 이를 장치 드라이버라고 한다.
⦁ 예를 들어 사용자가 응용 프로그램에서 입력 장치를 통해 데이터를 입력하면, 입력 장치 드라이버는 입력 장치 컨트롤러의 레지스터에 이를 기록하고, 장치 컨트롤러는 이를 검사하여 버스를 통해 메모리로 이동시킨다.
⦁ 그리고 장치 컨트롤러가 작업을 마치고 나면 CPU에게 '작업이 완료되었음'을 알린다.
∎ CPU에게 작업 완료를 알리는 이유
그 이유는 CPU가 하던 일을 멈추고, 이 일을 처리해주기 바라기 때문이다.
이 과정을 인터럽트라고 한다.
인터럽트를 하기 위해서는 먼저 장치의 다음할 일을 적은 인터럽트 서비스 루틴(ISR)을 생성하고, 생성된 ISR의 주소를 인터럽트 벡터 테이블에 기록해야한다.
∎ DB 테이블과 인덱스 활용
여기서 데이터베이스 수업시간에 배우는 데이터 테이블과 데이터의 인덱스가 활용된다.
⦁ CPU는 현재 진행중인 일을 끝마치면 다음 인터럽트를 찾아 실행해주어야 하는데, 일정한 규칙이 있지 않으면 다음 인터럽트가 무엇인지 찾기 어렵고 오래걸린다.
⦁ 이를 해결하기 위해서 우리는 데이터베이스의 테이블과 인덱스를 활용할 수 있고, 여기서는 ISR의 주소를 인덱스로 사용해 테이블에 저장할 수 있다.
⦁ 또, 문제는 인터럽트 벡터 주소로 지정할 수 있는 주소의 개수는 한정적인데, 인터럽트를 원하는 장비는 주소의 개수보다 많다는 것이다.
이 문제를 해결하기 위해 우리는 체이닝 기법을 사용할 수 있다.
인터럽트 핸들러 목록을 묶은 리스트를 생성하고, 이 리스트의 주소를 테이블에 저장하는 것이다.
⦁ 이렇게 데이터베이스의 테이블과 인덱스, 체이닝 기법을 사용하여 인터럽트 테이블을 구성하고, CPU는 빠르게 다음 인터럽트를 찾을 수 있게 되었다.
이 과정으로 우리는 지금 필요한 입,출력 작업을 바로 시작할 수 있고
이는 CPU를 비동기적으로 사용한다고 말한다.
∎ 인터럽트의 단점
인터럽트가 일어나는 경우는 입력이나 출력이 발생했을 때, 그리고 에러가 발생했을 때이다.
만약 에러가 발생했는데 입력이나 출력이 우선순위가 높아지면 에러를 처리하지 못해 시스템에 문제가 생길 수 있다.
이 문제를 해결하기 위해 마스킹 가능한 인터럽트와 마스킹 불가능한 인터럽트를 나눠 테이블에 우선순위 레벨을 정해주는 것이다.
마스킹 가능하다는 의미는 처리를 거부할 수 있다는 의미로 후순위로 미룰 수 있는 인터럽트를 의미한다.
마스킹이 불가능한 인터럽트는 에러 발생에 관련된 인터럽트로 이 인터럽트들에 높은 우선순위를 부여하여, CPU 처리를 제어할 수 있게 된다.
∎ 보조저장장치의 인터럽트
비휘발성 메모리인 보조저장장치는 많은 데이터를 담고 있다. 그래서 CPU가 작업을 위해 접근할 때 오버헤드가 발생할 수 있다.
이 때문에 보조저장장치에 있는 프로그램을 실행할 때에는 보조저장장치가 스스로 자신의 버퍼에서 메인 메모리로 '데이터 블록 전체'를 적재한다. 이를 DMA (직접 메모리 액세스)라고 부른다.
∎ 느낀점
지금까지 우리의 입,출력이 어떻게 CPU에서 빠르게 처리될 수 있는지 알아보았다.
CPU는 컴퓨터의 모든 정보를 처리해주는 장치로 이를 사용할 때 장치들을 적절히 구성하고 우선순위를 매기는 일은 매우 중요하다.
앞으로도 한정된 자원을 어떻게 효율적으로 사용할 것인지에 대해 꾸준히 공부해야겠다.