| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 보안솔루션
- 가상메모리
- 파일시스템
- SQLD
- javascript
- CSS
- ReactNative
- flexbox
- 코딩테스트
- defaultdict
- BFS
- PYTHON
- db
- 부스트캠프
- OOP
- 프로그래밍패러다임
- database
- 챌린지
- 베이직
- 단위테스트
- folium
- parser
- reactnavigation
- pandas
- Graph
- 함수형프로그래밍
- DFS
- 이벤트처리
- display
- sql
- Today
- Total
DevLog
[운영체제] 인터럽트(Interrupt)와 프로그램 제어 흐름 본문
인터럽트(Interrupt)란?
interrupt [ˌɪntəˈrʌpt]
1. (말·행동을) 방해하다[중단시키다/가로막다]
2. (무엇을 잠깐) 중단시키다
3. (계속 이어지는 선·표면·전망 등을) 차단하다[끊다]
영단어 인터럽트(interrupt)의 사전적 정의가 '방해하다', '차단하다' 인 것과 유사하게 컴퓨터 환경에서의 인터럽트 역시 이와 유사한 정의를 갖는다.
CS 측면에서의 `인터럽트`란 컴퓨터 처리기(CPU)가 프로그램을 실행하는 도중 발생하는 여러가지 예외사항을 처리하기 위해 프로그램 작동을 일시적으로 중단시키는 것을 의미한다.
인터럽트 부류
인터럽트를 유발하는 케이스는 크게 네 가지 부류로 나눠볼 수 있다.
1. 프로그램에 의한 인터럽트
프로그램 동작 도중 명령어 수행에 따른 결과로 발생하는 인터럽트.
예시는 다음과 같다.
- 산술연산 오버플로, 0으로 나누기 등 명령어 수행 중에 에러가 발생하는 경우
- 불법적인 기계 명령어 수행을 시도하는 경우 (잘못된 명령어 or 사용자 권한이 없는 명령어)
- 사용자에게 허용된 메모리 공간 밖의 참조 (정해진 프로세스 주소 공간을 넘어갈 시 운영체제에 의해 저지됨)
위와 같은 상황에 의해 명령어를 실행할 수 없는 경우
운영체제는 인터럽트를 발생시켜서 프로그램을 중지하고, 원인에 맞는 인터럽트 처리 후 명령어 수행을 재개한다.
2. 타이머에 의한 인터럽트
CPU 처리기 내부에서 동작하는 타이머에 의해 생성되는 인터럽트.
운영체제의 타임 쉐어링 기능을 정규적으로 수행할 수 있도록 한다.
Time Sharing
3개의 프로그램 A, B, C를 동시에 사용하는 경우를 생각해보자.
사용자의 입장에서는 모든 프로그램이 한 번에 돌아가는 것처럼 느껴지지만, 실제로 각 프로그램이 같은 시간에 "동시에" 실행되는 것은 아니다.
CPU는 기본적으로 한 번에 하나의 프로그램을 실행하다가
일정 시간이 되면(timeout) 잠시 멈추고 다음 프로그램으로 넘어가서 실행하는 것을 반복한다.
즉, 각각의 프로그램은 사용 가능한 시간을 나눠서 할당받은 후, 각자에게 주어진 시간동안만 CPU를 점유한다.
ex) A → B → C → A → B → C → ...
이 때 일정 시간마다 타이머에 의한 인터럽트가 발생하는데,
이는 CPU에 '현재 동작 중인 프로그램을 중지하고 다음 프로그램으로 넘어가라'는 타이밍을 알려주는 역할을 한다.
3. 입출력에 의한 인터럽트
입출력 제어기에 의해 생성되는 인터럽트.
I/O 연산이 정상적으로 종료되었음을 알리거나 연산 도중 발생하는 다양한 에러 조건을 알린다.
* 입출력 제어기 : 호스트 컴퓨터 - 입출력장치 간 데이터 전송 제어, 신호 변환 등 입출력과 관련된 기능을 담당하는 장치
컴퓨터가 처리하는 명령어 중 가장 많은 시간을 잡아먹는 명령은 I/O 연산이다.
→ 입출력 명령어를 수행하는 동안 많은 대기 시간이 발생하기 때문!
이때 인터럽트를 사용하여 I/O 대기 시간동안 놀고 있는 CPU를 다른 프로그램을 실행하는 데에 써먹어줌으로써
CPU 사용률을 최대로 높이고, 전체적인 명령어 수행 시간을 줄일 수 있다.
4. 하드웨어 실패에 의한 인터럽트
전원 결함과 같이 하드웨어적으로 발생하는 에러에 의해 발생하는 인터럽트.
인터럽트 처리 사이클

1. 인터럽트 발생! 💥
2. 현재 CPU에서 실행 중인 명령어의 실행을 완료한다. (명령어 원자성 충족)
3. 다음 명령어 수행을 위해 PC를 자동 증가할 때 인터럽트 여부도 함께 체크한다.
4. 인터럽트가 들어왔다면 처리기가 인터럽트 확인 신호를 보낸다. (접수 완료!)
5. 현재 PSW와 PC 레지스터 정보를 제어 스택에 저장하고, 인터럽트 처리 명령을 위해 새로운 PC 값을 적재한다.
* 제어 스택 : 현재 실행 중인 프로세스와 관련된 정보를 저장하는 메모리 공간
6. 프로세스의 나머지 상태 정보(레지스터 값)도 날아가지 않도록 저장해둔 뒤에 인터럽트 처리를 실행한다.
7. 처리가 완료되면 실행 중이던 프로세스의 상태 정보를 복구한다.
8. 이전 PSW와 PC 값도 복구한 후에 그대로 이어서 실행!
cf. 인터럽트는 항상 명령어와 명령어의 사이에서 발생한다.
명령어의 실행은 원자적이기 때문!
명령어는 항상 실행이 완료되거나 / 아예 실행되지 않거나, 둘 중 하나의 상태를 가져야한다.
따라서 인터럽트가 기계어 명령어 처리 도중에 불쑥 나타나서 명령이 중단되는 경우가 있어서는 안 된다.
인터럽트에 따른 프로그램 제어 흐름

운영체제는 프로그램 제어 과정에 인터럽트라는 개념을 접목시킴으로써 비동기적인 명령어 수행이 가능하게 한다.
싱크로너스 명령과 어싱크로너스 명령
싱크로너스 명령이란 동기(synchronous)적으로 실행되는 명령으로, 앞의 명령이 끝나야 뒤의 명령을 처리할 수 있기 때문에 명령어가 순차적으로 실행되어야 함을 뜻한다.
어싱크로너스 명령이란 비동기(asynchronous) 명령으로, 명령어 실행 순서가 크게 중요하지 않기 때문에 앞의 명령이 끝나기 전이라도 중간에 텀이 발생하면 기다리는 시간 동안 병렬적으로 뒤의 명령을 가져다 수행할 수 있다.
짧은 I/O 대기를 요구하는 프로그램의 경우, 만약 인터럽트 개념이 없다면 싱크로너스하게 입출력 연산이 발생할 때마다 프로세서 대기가 이루어져야 할 것이다. 하지만 입출력 연산과 동시에 인터럽트를 발생시켜 프로세서가 다른 명령어를 처리하게 한다면 비효율적인 대기 없이 CPU가 쉬지 않고 명령어들을 실행하도록 할 수 있기 때문에 전체적인 처리 시간을 단축시킬 수 있다. 인터럽트의 효과가 좋은 셈이다.
반면에 긴 I/O 대기가 발생하는 프로그램의 경우, 앞선 경우와 비슷하게 입출력 연산과 동시에 인터럽트가 발생하여 즉시 다음 명령어가 실행되겠지만, 다음 명령어 처리를 완료한 후에도 여전히 이전 명령의 I/O 대기 시간이 끝나지 않을 수 있다. 이런 경우에는 인터럽트를 활용하여 비동기적으로 명령어를 처리하더라도 여전히 대기 시간을 거쳐야 하므로 상대적으로 인터럽트의 효과가 떨어지게 된다. 하지만 여전히 동기적 실행보다는 약간의 시간을 아낄 수 있을 것이다.
중첩된 인터럽트 처리
만약 인터럽트 X를 처리하는 도중에 새로운 인터럽트 Y가 발생하는 경우에는 어떻게 처리하면 좋을까?
1. 순차적 인터럽트 처리
단순히 인터럽트가 발생한 순서대로 하나씩 처리해나간다.
2. 중첩된 인터럽트 처리
인터럽트에도 내용에 따라 우선순위를 두어 인터럽트 X를 처리하는 도중 새로운 인터럽트 Y를 우선 처리하는 방식.
'CS' 카테고리의 다른 글
| [정보보안] 정보보안의 개념, 기본 용어 톺아보기 (5) | 2024.09.22 |
|---|