앞서 컴퓨터 시스템의 동작원리에 대해 간단히 알아보았는데,  여기서 인터럽트(Interrupt) 가 나왔다.

인터럽트의 동작원리는 간단히 말해 A라는 프로그램이 CPU를할당받아 명령을 수행하고 있는데, 인터럽트,즉 방해를 받아 A를 저장해놓은 후 일처리를 하고 다시 돌아와 A를 마저 수행하는 것이다. 이때 어디까지 일을 하고갔는지를 저장하기위해 운영체제는 고유의 자료구조를 가지고 있는데 우리는 이것을 프로세스제어블록, 즉 PCB(Process Control Block)이라 부른다.

 

인터럽트에는 하드웨어 인터럽트와 소프트웨어 인터럽트가 존재하는데,  일반적으로 인터럽트는 하드웨어 인터럽트, 즉, 하드웨어 컨트롤러가 CPU의 서비스를 요청하기위해 발생시키는 것을 의미한다.

이러한 인터럽트를 알아보기 전에 우리는 간단히 컴퓨터 시스템의 작종 개요를 알 필요가 있다.

 

흔히 CPU는 컴퓨터의 두뇌라고 불리지만, 인간의 뇌처럼 스스로 생각하고 판단하는 능력은 없다. 그저 계산하고, 처리할 뿐이다. 이때, CPU가 현재 수행해야 할 메모리 주소의 명령을 담고있는 레지스터를 '프로그램 카운터'라고 부른다.

한편 컴퓨터 동작이 CPU에 의해 이루어 지는것만은 아니다. 프로그램이 수행되는 중에 디스크에서 파일을 읽어오기도 하고, 키보드로부터 입력을 받거나 처리결과를 화면에 출력하기도 한다. 이러한 명령을 일반명려이 아닌 특권명령으로 분류한다. 이때, 사용자프로그램은 특권명령을 직접 수행할수는 없다! 따라서 운영체제에게 특권명령의 대행을 요청하게 된다.이것을 시스템 콜(System call) 이라고 하는 것이다.

 

결국 프로그램이 시스템콜을 하게되면 운영체제는 자신의 커널영역으로 들어가 시스템콜 처리코드를 수행하게 되고, 

만약 디스크에서 자료를 읽어오는 시스템 콜이라면, CPU가 컨트롤 레지스터를 세팅해 디스크 컨트롤러에게 디스크를 읽어오라는 명령을 내린다. 그러면 디스크 컨트롤러는 디스크로부터 데이터를 읽어와서 자신의 로컬 버퍼에 저장하게 된다. 이작업이 완료되면 디스크 컨트롤러가 CPU에게 인터럽트를 발생시켜 입출력이 완료되었음을 알린다. 이는 소프트웨어 인터럽트의 일종이다.

 

 

컴퓨터 시스템의 하드웨어 구조 및 프로그램이 메모리에 적재되는모습

 

 

프로그램이 아닌 주변 하드웨어가 CPU에게서비스를 요청할 때에도 비슷한 방식이다. CPU는 메모리 위치의 명령만 계속 수행하고 있으므로, 인터럽트를 사용하면 CPU에게 서비스를 요청할 수 있게 된다. 인터럽트를 발생시키기 위해 장치들은 인터럽트 라인(Interrupt Line)을 세팅하게 되고, CPU는 매번 명령을 수행한 직후 인터럽트 라인을 체크해 서비스 요청이 들어왔는지를 체크하게 된다. 인터럽트에는 다양한 종류가 있기 떄문에 각각의 인터럽트 발생 원인마다 라인을 다르게 해서 구분하게 된다. 인터럽트가 발생하면 CPU는 해당 인터럽트를 처리하기 위한 루틴을 가지고 있고, 그 처리 루틴에 따라 코드를 수행하게 된다.

 

특정 프로세스가 하나의 CPU를 독점하는 것을 막는 운영체제의 '타이머인터럽트'가 그 대표적인 예이다.

이 타이머 인터럽트는 하드웨어 장치로써, 일정시간을 세팅하게 되며 타이머 동작 이후에는 현재 프로세스를 회수해 다른 프로세스에게 이양하게 된다.

 

이렇듯 인터럽트는 넓은 의미에선 하드웨어 인터럽트와 트랩(trap)을 모두 포함한다.

트랩의 종류에는 예외상황과 시스템콜이 있는데, 

예외상황이란 허용되지않은 연산을 수행하려고 할때 자동적으로 발생하는것으로 운영체제는 예외상황이 발생했을때 CPU의 제어권을 획득해 해당상황에 대한 조치를 취한다.

0으로 나누는 연산, 자신의 주소공간을 넘는 메모리 참조등이 해당된다.

 

이러한 상황들은 모두 인터럽트 라인을 세팅하여 인터럽트를 발생시킨 후 제어권이 넘어가게 되므로 이들도 넓은 의미에서는 인터럽트의 범주이다. 단지, 인터럽트를 발생시키는 주체가 하드웨어가 아닌 소프트웨어 이므로 소프트웨어 인터럽트라고 부른다.

 

시스템 콜

 

<<인터럽트 관련 주요 용어>>

-인터럽트 벡터(Interrupt Vertor) : 여러가지 인터럽트에 대해 해당 이넡럽트 발생시 처리해야 할 루틴의 주소를 보관하고 있는 테이블

 

-인터럽트 핸들러(Interrupt Handler) : 실체 인터럽트를 처리하기 위한 루틴

 

 

<<사용자프로그램이 사용하는 함수>>

- 사용자 정의 함수 :  프로그래머가 직접 작성한 함수

- 라이브러리 함수 : 직접 작성하진 않았지만, 누군가 작성해 놓은 함수를 호출해 사용하는 경우

- 커널 함수 : 운영체제 커널의 코드에 정의된 함수(시스템 콜 함수, 인터럽트 처리함수 등이 있다)

 

printf 의 경우 라이브러리 함수이지만, 커널함수호출인 시스템콜을 동반한다.