이 포스트는 널널한 개발자님의 강의를 듣고 작성한 글입니다.
사전적 의미로 '끼어들다', '중단시키다' 정도의 의미를 가지는 말로 프로그램을 실행하는 도중에 예기치 않는 상황이 발생할 경우 현재 실행중인 작업을 멈추고 발생된 상황을 처리한 후 다시 실행중인 작업을 복귀하는 것을 말한다.
인터럽트의 종류는 외부 인터럽트, 내부 인터럽트, 소프트웨어 인터럽트로 나뉠 수 있다.
CPU는 컴퓨터의 핵심적인 부품인데 CPU는 혼자서 작동하지 않고 주기억 장치 RAM과 밀접하게 연결되어 있다. 여기서 CPU가 RAM을 직접 통제할것이냐 아니면 간접적인 방식을 취할 것이냐인데 엄청 오래 전에는 직접 통제를 했지만 지금은 간접적인 방식을 사용하는데 무엇을 이용하여 사용하냐면 메모리 매니저(입출력 관리자)라는 칩을 이용한다. 이럴 때 발생하는게 입출력 인터럽트이다.
여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행 중 인터럽트가 발생했을 경우 우선순위를 따져서 처리.
전원이상 > 기계착오 > 외부신호 > 입출력 > 명령어 잘못 > 프로그램 검사 > SVC
일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보자 우선순위가 높고 내부인터럽트보다 외부 인터럽트가 우선순위가 높다.
저번 포스팅에서 말했던 것처럼 API를 호출하면 write()가 커널 수준에서 System call이 일어나고 Data가 RAM에 들어간다. 이때 인터럽트가 발생하며,
RAM의 Data를 주변기기에 이동시킬 때 인터럽트 발생하며, 이동 후, 끝났다고 인터럽트가 발생한다. 이러는 순간에 너무 많은 단계를 거쳐서 성능이 떨어지고 너무 시간이 오래걸린다.
하지만 고성능을 사면 비동기가 되어서 Driver한테 명령처리를 요구하고 바로 프로세스한테 반환한다. 반환하는 동안 전달된 명령을 주변기기가 처리한다.
과거 이야기를 해보면 xp시절에 위의 그림처럼 수많은 단계를 거쳐야 했다. 이러면 장점이 프로그램이 API에게만 맞추면 직접 주변기기를 제어를 안 해도 되었지만 단계가 많아 성능이 떨어질 수 있었다. 특히 많은 연산이 필요한 프로그램 같은 경우에 그렇다. 게임이 그럴 것이다.
만일 게임을 한다고 가정한다면 게임자체가 동작하는데 느릴 것이다. 이럴 때 API가 직접 System call을 커널에서 안하고 usermode단계에서 실행하고 Driver를 조작가능하게 한 인터페이스를 만들었는데 그게 DirectX다.
DirectX는 I/O 성능을 극단적으로 끌어올랄 수 있는 인터페이스로 예전 GDI 엔진을 사용하던 방식을 Window Vista 이후로 DirectX로 변경이되었다. 이로 인해 이후 윈도우 운영체제는 3DX 가속기능이 없으면 OS가 작동이 안되는 구조로 변하게 되었다.