CS 지식/운영체제

인터럽트 - CPU를 비동기적으로

윤씅 2024. 8. 9. 20:09

 

우리는 입출력 장치를 통해 컴퓨터를 사용할 수 있고, 이 처리들은 CPU를 통해 이루어진다.
CPU 자원은 한정되어 있는데, 이 CPU가 수많은 작업들을 빠르게 처리하려면 어떻게 해야할까?
이에 대한 답을 찾기위해 우리가 CPU를 사용하는 과정을 알아보고, 어떻게 CPU를 효율적으로 사용할 수 있는지 공부해보자.

 

 

∎  입출력 작업이 CPU로

우리가 사용하는 입출력 장치는 장치 컨트롤러를 통해 CPU, 공유 메모리와 연결된다.

장치 컨트롤러는 하드웨어 통로이다.


하드웨어인 장치 컨트롤러를 응용 프로그램에서 사용하기 위해서는 이를 제어하는 소프트웨어가 필요하고, 이를 장치 드라이버라고 한다.

 

예를 들어 사용자가 응용 프로그램에서 입력 장치를 통해 데이터를 입력하면 입력 장치 드라이버는 입력 장치 컨트롤러의 레지스터에 이를 기록하고, 장치 컨트롤러는 이를 검사하여 버스를 통해 메모리로 이동시킨다.

 

그리고 장치 컨트롤러가 작업을 마치고 나면 CPU에게 '작업이 완료되었음'을 알린다.

CPU에게 작업 완료를 알리는 이유는 CPU가 하던 일을 멈추고, 이 일을 처리해주기 바라기 때문이다.
이 과정을 인터럽트라고 한다.

 

 

∎  인터럽트

인터럽트를 하기 위해서는 먼저 장치의 다음할 일을 적은 인터럽트 서비스 루틴(ISR)을 생성하고, 생성된 ISR의 주소를 인터럽트 벡터 테이블에 기록해야한다.

 

여기서 데이터베이스 수업시간에 배우는 데이터 테이블과 데이터의 인덱스가 활용된다.

CPU는 현재 진행중인 일을 끝마치면 다음 인터럽트를 찾아 실행해주어야 하는데, 일정한 규칙이 있지 않으면 다음 인터럽트가 무엇인지 찾기 어렵고 오래걸린다.
이를 해결하기 위해서 우리는 데이터베이스의 테이블과 인덱스를 활용할 수 있고, 여기서는 ISR의 주소를 인덱스로 사용해 테이블에 저장할 수 있다.

 

또, 문제는 인터럽트 벡터 주소로 지정할 수 있는 주소의 개수는 한정적인데, 인터럽트를 원하는 장비는 주소의 개수보다 많다는 것이다.

이 문제를 해결하기 위해 우리는 체이닝 기법을 사용할 수 있다. 인터럽트 핸들러 목록을 묶은 리스트를 생성하고, 이 리스트의 주소를 테이블에 저장하는 것이다.

이렇게 데이터베이스의 테이블과 인덱스, 체이닝 기법을 사용하여 인터럽트 테이블을 구성하고, CPU는 빠르게 다음 인터럽트를 찾을 수 있게 되었다.
이 과정으로 우리는 지금 필요한 입,출력 작업을 바로 시작할 수 있고, 이는 CPU를 비동기적으로 사용한다고 말한다.

 

 

∎  인터럽트의 단점

인터럽트가 일어나는 경우는 입력이나 출력이 발생했을 때, 그리고 에러가 발생했을 때이다.

만약 에러가 발생했는데 입력이나 출력이 우선순위가 높아지면 에러를 처리하지 못해 시스템에 문제가 생길 수 있다.

 

이 문제를 해결하기 위해 마스킹 가능한 인터럽트와 마스킹 불가능한 인터럽트를 나눠 테이블에 우선순위 레벨을 정해주는 것이다.

마스킹 가능하다는 의미는 처리를 거부할 수 있다는 의미로 후순위로 미룰 수 있는 인터럽트를 의미한다. 마스킹이 불가능한 인터럽트는 에러 발생에 관련된 인터럽트로 이 인터럽트들에 높은 우선순위를 부여하여, CPU 처리를 제어할 수 있게 된다.

 

 

∎  보조저장장치의 인터럽트

비휘발성 메모리인 보조저장장치는 많은 데이터를 담고 있다. 그래서 CPU가 작업을 위해 접근할 때 오버헤드가 발생할 수 있다.

이 때문에 보조저장장치에 있는 프로그램을 실행할 때에는 보조저장장치가 스스로 자신의 버퍼에서 메인 메모리로 '데이터 블록 전체'를 적재한다. 이를 DMA (직접 메모리 액세스)라고 부른다.

 

 

∎  느낀점

지금까지 우리의 입,출력이 어떻게 CPU에서 빠르게 처리될 수 있는지 알아보았다.

CPU는 컴퓨터의 모든 정보를 처리해주는 장치로 이를 사용할 때 장치들을 적절히 구성하고 우선순위를 매기는 일은 매우 중요하다.
앞으로도 한정된 자원을 어떻게 효율적으로 사용할 것인지에 대해 꾸준히 공부해야겠다.