프린세스 다이어리

[OS] 인터럽트란? 인터럽트 발생 상황과 내부 동작 방식 본문

운영체제, 컴퓨터 구조

[OS] 인터럽트란? 인터럽트 발생 상황과 내부 동작 방식

개발공주 2021. 10. 5. 15:06
728x90

1. 인터럽트란

 

CPU가 프로세스 a를 실행 중일 때, 파일 읽기의 끝이 나서 block 상태에서 running 상태로 돌아가야 한다고 가정해 보자. 그럼 누가 CPU에게 파일 읽기가 끝났다고 알려줄까? 바로 인터럽트 기술이 기본적으로 OS에 구현되어 있기 때문에 가능하다. 인터럽트는 일종의 이벤트로, CPU에게 정보를 알려주는 기술이다. 이전 글에서 CPU가 실행 중인 프로세스를 강제로 중단하고 다른 프로세스로 갈아타게 만드는 걸 스케줄러가 담당한다고 하였는데, 그 스케줄러 코드를 실행하게 하는 것이 인터럽트다.

 

2. 인터럽트 발생 상황 예시

 

CPU가 코드를 한 줄 한 줄 읽는데 집중하다가 인터럽트가 필요하면 즉시 실행을 멈춘다. 이때 실행을 멈춰야 하는 3가지 주요 상황이 있다.

 

2-1. 입출력 하드웨어에 문제/이벤트가 발생했을 때

 

외부 인터럽트, 하드웨어 인터럽트라고 하고 파일 처리가 끝났을 때나 하드웨어 전원이 이상이 있거나, 발열이 심하거나 하는 경우 CPU의 동작을 멈춰버린다. 

 

2-2. 예외상황이 발생했을 때

 

내부 인터럽트, 소프트웨어 인터럽트라고도 하고 프로그램 내부에서 예외상황이 발생했을 때 처리한다. 흔히 0으로 나누는 exception이나, 포인터로 잘못 커널 모드를 접근했을 때, 계산 결과가 overflow / underflow 가 되었을 때 등의 상황이다.

 

2-3. 타이머 인터럽트

 

CPU가 실행중인 프로세스를 다른 프로세스로 변경하고 싶으면, 타이머 인터럽트를 CPU에게 알려준다. 멀티프로그래밍 실현을 위해 프로세스는 1초에 100번 이상 변경이 되는데 그 단위 기간마다 스케줄링을 해주는 것이다. 선점형 스케줄러를 위해 필요한 인터럽트다.

 

3. 인터럽트 내부 동작 방식

 

프로세스 전환이나 실행시간 만료로 인한 인터럽트가 발생했을 때, CPU는 프로세스를 중단하고 다른 프로세스로 갈아탄다. 그걸 가능하게 하는 신호는 '시스템 콜(System call)이라고 칭한다. 시스템 콜은 커널 모드에서 직접적으로 OS에 명령을 내릴 수 있는 함수이기 때문에 일반적으로 프로그래밍을 할 때의 '사용자 모드'에서 '커널 모드'로 들어간 다음에 실행을 해야 한다.

 

 

IDT(Interrupt Descriptor Table)에는 이벤트 번호와 실행코드 주소가 매칭 되어 있다. 그래서 인터럽트가 발생하면 IDT를 확인하여 시스템 콜에 해당하는 번호(0x80)를 받아와 시스템 콜을 실행시키는 것이다. 사용자/커널 모드를 오가면서 프로세스를 중지시키고 재시작하는 모습을 다음과 같이 그림으로 나타낼 수 있다. 수시로 위아래로 왔다 갔다 하는 모양이고 이는 1초에 100번 이상 수행된다. 

 

 

정리하면 다음과 같다. 

 

1. 인터럽트 발생

2. 현 프로세스 실행 중단

3. 커널 모드에서 IDT 확인 후 인터럽트 해당 번호 실행

3. 사용자 모드로 돌아와 다음 코드 진행

728x90
Comments