Interrupt
컴퓨터 작동 중에 예기치 않은 문제가 발생한 경우라도 업무 처리가 계속될 수 있도록 하는 컴퓨터 운영체계의 한 기능을 인터럽트라고 한다.
작동 중인 컴퓨터에 예기치 않은 문제가 발생한 경우 CPU 자체가 하드웨어적으로 상태를 체크하여 변화에 대응하는 것을 말한다. 인터럽트가 발생하면 그 순간 운영체계 내의 제어프로그램에 있는 인터럽트처리루틴(routine)이 작동하여 응급사태를 해결하고 인터럽트가 생기기 이전의 상태로 복귀시킨다.
인터럽트가 발생하는 원인으로는 프로그램을 실행하는 도중 갑작스런 정전이나 컴퓨터 자체 내에서 기계적인 문제가 발생한 경우(기계검사 인터럽트), 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우(외부인터럽트), 입출력의 종료나 입출력의 오류에 의해 CPU의 기능이 요청되는 경우(입출력 인터럽트) 프로그램 실행 중 보호된 공간 내에 접근하거나 불법적인 명령과 같은 프로그램의 문제가 발생한 경우(프로그램 검사 인터럽트) 등이 있다.
프로그래밍 방식에는 인터럽트 방식과 폴링(polling) 방식이 있는데 인터럽트 방식을 사용하면 두 가지 이상의 프로세서를 동시에 수행할 수 있고, 이상현상을 쉽게 파악할 수 있어 훨씬 효율적이다.
폴링방식은 항상 While문 같은 반복문으로 항상 감시하고 있다가 조건에 만족하는 어떠한 일이 일어나면 미리 약속해둔 일을 하는 방식이고, 인터럽트 방식으로는 해당 프로그램을 실행하다가 인터럽트가 발생하는 순간 인터럽트 처리 루틴에 해당하는 일을 처리한 후에 다시 실행하던 프로그램을 실행하는 것이다.
예를들어 ,
폴링(polling)방식은
While(1){
if(조건)
//조건에 해당하는 어떠한 일
} 이라고 한다면.
인터럽트 방식은
int main()
{
프로그램 실행중
. <- 인터럽트 발생
}
void interrupt()
{
//인터럽트 수행
}
이러한 식이다. 폴링 방식은 프로세서가 계속 할당되어 있어야 하기 때문에 속도가 안맞느다거나 속도가 느려지면 해당 발생하는 조건이 발생해도 알아채지 못할 경우가 생기지만, 인터럽트 방식은 해당 프로그램이 목적으로 하는 일을 하다가 인터럽트가 발생하는 순간 처리루틴에 해당하는 일을 하고 다시 원래의 프로그램으로 복귀하는 것이기 때문에 훨씬 효율적이며 리소스를 절약할 수 있다.
인터럽트는 크게 두가지로 구분 하는데 하드웨어 인터럽트, 소프트웨어 인터럽트 로 나뉜다.
하드웨어 인트럽트는 패리퍼럴요청에 의해서 발생되는 인터럽트이고,
소프트웨어 인터럽트는 사용자가 프로그램 내에서 발생하도록 설정 하는 것이다.
※패러퍼럴 => CPU를 제외한 구성요소를 일반적으로 패러퍼럴이라 부른다.
먼저 하드웨이 인터럽트를 살펴보자.
실례로 임베디드 시스템인 휴대폰에서 문자나,카톡을 보내던 도중 전화가 오는 상황이라고 가정하자.
카톡이나,문자를 보내던 도중 전화가 오면 보내던 내용등을 저장을 하고 인터럽트가 호출되며 전화를 끝내면 인터럽트가 종료됨과 동시에 원래 하던 프로그램을 다시 실행하게 된다.
이떄 일어나는 일련을 과정을 보면,
Main Program 실행 -> 인터럽트 발생 -> Main Program의 환경을 PCB에 저장 -> IVT에서 맞는 인터럽트를 찾아 수행 -> 인터럽트 서브 루틴 -> 인터럽트 서브 루틴 종료 -> PCB에서 원래의 Program환경을 Set -> Context Switch가 일어남.
의 과정을 치게 된다.
각각의 패리퍼럴인터럽트 선을 인터럽트 컨트롤러에 연결하고, 프로그램을 플래시메모리에 내장시키면 임베디드 시스템이 작동을 하게 되는 것이다.
이때 인터럽트가 발생되면, 에프아이큐 혹은 아이알큐 모드로 들어 가게 되는데, 둘을 나눠둔 이유는 인터럽트 요청이 동시에 들어왔을 때를 위함인데, 이때는 먼저 처리해야 할 것을 에프아이큐 모드로, 그 후에 해도 되는 인터럽트를 아이알큐 모드에 저장한뒤, 고정 어드레스(IVT : Interrupt Vetor Table)로 가서 해당되는 인터럽트를 찾고, 인터럽트를 실행 시키기 위해 인터럽트 서브 루틴으로 이동한다.
그 다음으로는 소프트웨어 인터럽트이다.
소프트웨어 인터럽트는 주로 System Call을 사용하는 OS에서 정의한 API이다.
OS에는 유저영역과 커널영역이 있는데, 유저영역에 있는 프로세스들은 패리퍼럴을 직접 제어할 수 있는 권한을 가지고 있지 않다. 따라서 패리퍼럴을 제어하려면 운영체제의 도움을 받아야 하는데 프로세스가 운영체제에게 패리퍼럴을 제어하게 끔 도와 달라고 요청하는 것이 System Call이다.
소프트웨어 인터럽트는 유저영역에 있는 프로그램이 System Call을 호출하게 되면, 소프트웨어 인터럽트가 발생되고, 이때 발생 된 인터럽트는 IVT 0x0000 0008번지에 있는 소프트웨어 인터럽트를 찾아 인터럽스 서비스루틴으로 가게된다.
<Interrupt & System Call>
'O.S' 카테고리의 다른 글
Process Scheduling - Priority (0) | 2012.04.19 |
---|---|
Process Scheduling - SJF (0) | 2012.04.19 |
Process Scheduling - FCFS (0) | 2012.04.19 |
Critical Section - 공유메모리 (2) | 2012.04.17 |
Thread (0) | 2012.04.17 |