Skip to content

Commit

Permalink
Update 2024-10-25-os.md
Browse files Browse the repository at this point in the history
  • Loading branch information
yulmwu committed Nov 4, 2024
1 parent 94c1891 commit 1433622
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions _posts/fast/2024-10-25-os.md
Original file line number Diff line number Diff line change
Expand Up @@ -686,6 +686,41 @@ CPU의 제어장치에서 하나의 명령어를 처리할 때 마다 각각의

이를 해결하기 위해 인터럽트를 발생시켜 이러한 작업을 효율적으로 처리할 수 있다. 키보드는 언제 눌릴 지 모르기 때문에 이러한 인터럽트는 비동기 인터럽트로 분류한다.

인터럽트는 아래와 같은 순서로 처리된다.

1. CPU에게 **인터럽트 요청 신호**를 보낸다.
2. CPU는 하나의 명령어 사이클이 끝나고, 명령어를 인출하기 전에 인터럽트 요청 신호를 확인한다.
3. 만약 인터럽트 요청이 확인됐다면, **인터럽트 플래그** 레지스터를 통해 인터럽트를 받아들일지 말지 결정한다.
4. 만약 인터럽트를 받아들일 수 있다면, 지금까지의 작업을 스택에 백업하고, **인터럽트 벡터**를 참조하여 **인터럽트 서비스 루틴**을 실행한다.
5. 인터럽트 서비스 루틴이 끝나면, 백업한 작업을 복구하고 다시 실행한다.

##### 인터럽트 요청 신호, 인터럽트 플래그

**인터럽트 요청 신호**는 이름 그대로 인터럽트를 요청하는 신호이다.

CPU가 인터럽트 요청을 받아들이기 위해선 플래그 레지스터 중 하나인 **인터럽트 플래그**에서 인터럽트를 받아들일 수 있다고 해야 인터럽트를 받아들일 수 있다.

다만 일부 인터럽트(컴퓨터 강제 종료 등)는 인터럽트 플래그를 무시하고 실행될 수 있다. 이 처럼 막을 수 없는 인터럽트는 non-maskable interrupt라고 부르기도 한다.

##### 인터럽트 서비스 루틴, 인터럽트 벡터

**인터럽트 서비스 루틴**은 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리해야 될지 정의한 코드이다.
인터럽트 서비스 루틴 또한 하나의 프로그램이기 때문에, 메모리에 저장되어 있다.

만약 어떠한 인터럽트가 발생했을 때, 인터럽트 서비스 루틴을 실행하기 위해 PC(Program Counter)를 해당 메모리 주소으로 이동해야 하는데, 이러한 인터럽트 서비스 루틴의 정보(메모리 주소 등)가 저장된 것이 **인터럽트 벡터**이다.

인터럽트 서비스 루틴으로 이동하기 위해선 현재 작업(레지스터 등에 저장된 데이터 포함)을 어딘가에 백업해둬야 하는데, 이는 메모리 상의 스택 영역에 저장된다. 인터럽트를 마치면 다시 백업된 메모리 주소로 돌아온 다음 레지스터 등의 데이터를 복구한다.

---

그렇다면 키보드를 눌렀을 때를 예를 들어 과정을 설명해보자.

어떠한 키를 눌렀을 때 CPU에게 키를 눌렀다는 인터럽트 요청 신호를 보낸다. CPU는 하나의 명령어를 처리하고 인터럽트 요청 신호를 확인하는데, 인터럽트 요청 신호가 있다면 인터럽트 플래그를 확인하여 처리가 가능한지 여부를 결정한다.

만약 가능하다면 현재 작업을 스택에 백업해두고, 인터럽트 벡터에서 키보드 입력과 관련한 인터럽트 서비스 루틴을 찾는다. 이 인터럽트 서비스 루틴엔 키보드 키를 눌렀을 때 어떤 작업을 처리할것인지가 저장되어있다.

처리가 완료되면 다시 원래 주소로 돌아와 복구한 다음 명령어를 계속 이어나간다.

### 2-1-6. 코어

### 2-1-7. 병렬 처리
Expand Down

0 comments on commit 1433622

Please sign in to comment.