주변장치와 입출력 장치는 CPU나 메모리와 달리 인터럽트라는 메커니즘을 통해 관리된다.
인터럽트를 하는 이유는???
그 이유는 입출력 연산이 CPU 명령 수행속도보다 현저히 느리기 때문이다.
CPU는 비싼데 오래걸리는 입출력 연산을 기다리며 CPU가 쉬게 만들 수 없어서
연산 결과가 나올 때 까지 다른 일을 하라고 시키는 것인데,
입출력이 완료되면 다시 CPU를 불러와 해당 작업을 이어가게 한다.
이때 CPU에게 완료되었음을 알려주는 것이 인터럽트이다.
- 하드웨어 장치가 CPU에게 어떤 사실을 알려주거나 CPU의 서비스를 요청해야 할 경우, CPU 내에 있는 인터럽트 라인을 세팅하여 인터럽트를 발생시킨다. (프로그램이 명령을 수행하기 위해서는 CPU를 할당받아야 함)
- CPU는 매번 프로그램 카운터가 가리고 있는 곳의 명령을 수행한 뒤, 다음 명령을 수행하기 직전에 인터럽트 라인이 세팅되었는지 체크한다.
- 이를 통해 인터럽트가 발생했으면 CPU는 현재 수행 중이던 프로세스를 멈추고 운영 체제의 인터럽트 처리 루틴으로 이동하여 인터럽트 처리를 수행한다.
인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉘는 경우도 있다.
하드웨어 인터럽트
- 일반적인 인터럽트
- 하드웨어 컨트롤러가 CPU의 서비스를 요청하기 위해 발생시키는 인터럽트
하드웨어 인터럽트가 발생하는 예
1. 기계검사 인터럽트
- 프로그램을 실행하는 도중 갑작스런 정전이나 컴퓨터 자체 내에서 기계적인 문제가 발생한 경우
2. 외부 인터럽트
- 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
3. 입출력 인터럽트
- 입출력의 종료나 입출력의 오류에 의해 CPU의 기능이 요청되는 경우
4. 프로그램검사 인터럽트
- 프로그램 실행 중 보호된 기억공간 내에 접근하거나 불법적인 명령 수행과 같은 프로그램의 문제가 발생한 경우
소프트웨어 인터럽트
- 소프트웨어 인터럽트는 외부가 아닌 CPU 내부에서 자신이 실행한 명령이나 CPU의 명령 실행에 관련된 모듈이 변화하는 경우 발생
- 프로그램 실행 중 프로그램 상의 처리 불가능한 오류나 이벤트를 알리기 위한 경우 발생하는데, 이를 트랩 또는 예외라 부른다.
- 또한 프로그램 내에서 특별한 서비스를 요구하거나
- 감시를 목적으로, 의도적으로 프로그램이 발생시킨 특별한 명령어에 의해 발생되기도 한다.
1. 예외 상황(Exception)
- 프로그램이 허용되지 않은 연산을 수행하려고 할 때, 자동적으로 발생한다. 운영체제는 예외 상황이 발생했을 때, CPU의 제어권을 획득해 이 상황에 대한 조치를 취한다.
- ex) 0으로 나누는 연산, 자신의 주소 공간을 넘어서는 메모리 참조 등
- 예외 상황에 대한 처리 루틴을 자신의 코드 영역에 가지고 있음
2. 시스템 콜(System Call)
- 사용자 프로세스가 운영체제의 서비스를 요청하기 위해 커널의 함수를 호출하는 것이다.
- 사용자 프로세스가 직접 특권 명령을 수행할 수 없으므로 특권 명령을 수행하려 할 때, 시스템 콜을 사용한다.
시스템 콜이나 예외 상황은 모두 사용자 프로세스로부터 CPU의 제어권이 운영 체제에게 이양되어 처리되는데 이 과정에 인터럽트 라인을 세팅하여 인터럽트를 발생시킨 후 제어권이 넘어가게 되므로 이들도 넓은 의미에서는 인터럽트의 범주에 포함시킨다.
단지 발생시키는 주체가 하드웨어 장치가 아닌 소프트웨어이므로 이들을 소프트웨어 인터럽트라고 부른다.
인터럽트 발생 처리 과정
A 프로그램이 CPU를 할당받고 명령을 수행하고 있는데 인터럽트가 발생하면 A는 현재 수행중인 명령의 위치를 저장해놓는다. 그 후, 운영 체제 내부 코드인 인터럽트 처리 루틴으로 넘어가서 인터럽트 처리를 하고 다시 돌아와 A의 이전 작업 지점부터 수행을 계속 이어나가게 된다.
그렇다면, 인터럽트가 발생했을 때 수행중이던 프로세스의 정보는 어디에 저장될까?
-> 진행 중이던 A 프로세스의 정보는 프로세스 제어 블록(PCB: Process Control Block)에 저장한다. 그리고 인터럽트 처리를 모두 마치면 프로그램 A의 PCB에 저장된 주소를 복원시켜 원래 수행하던 일을 재개하게 된다.
인터럽트 벡터
- 여러가지 인터럽트에 대해 해당 인터럽트 발생시 처리해야 할 루틴의 주소를 보관하고 있는 테이블.
- 일종의 함수를 가리키는 포인터
인터럽트 핸들러
- 실제 인터럽트를 처리하기 위한 루틴으로 인터럽트 서비스 루틴이라고도 한다.
- 운영체제 코드 부분에는 각종 인터럽트 별로 처리해야 할 내용이 이미 프로그램되어 있으며, 이 부분을 인터럽트 서비스 루틴 또는 인터럽트 핸들러라고 한다.
PCB
- 커널의 데이터 영역에 존재하며 각각의 프로세스마다 고유의 PCB가 있다.
- 인터럽트 발생 시 프로세스의 어느 부분이 수행중이었는지를 저장한다.
(수행중이던 memory 주소, 레지스터값, 하드웨어 상태 ...)
Reference.
'🔥 > OS' 카테고리의 다른 글
[운영체제] IPC Inter-Process Communication (0) | 2021.09.09 |
---|---|
[운영체제] 시스템 콜 System Call (0) | 2021.08.31 |
[운영체제] 프로세스 주소 공간 (0) | 2021.08.25 |
[운영체제] 프로세스와 스레드의 차이 (0) | 2021.08.18 |
[운영체제] CPU 스케줄러 (0) | 2021.08.11 |