인터럽트(Interrupt) 운영체제 1-2

이도훈·2025년 2월 20일
0

운영체제

목록 보기
2/6
post-thumbnail

인터럽트의 정의

📌 인터럽트CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다. 갑자기 키보드 입력과 같은 이벤트가 발생하면 인터럽트를 걸어 인터럽트 서비스 루틴(ISR)을 실행한다.

  • 언뜻 보면 컴퓨터 구조의 분기 명령과 비슷하다고 볼 수 있는데 분기는 함수 호출과 같이 예기치 못한 상황이 아니고 동기적으로 일어나지만 인터럽트는 예기치 못하게 즉, 비동기적으로 일어난다.
  • 예를 들어서 설명해 보자. 키보드의 키를 하나 누르면, 눌려진 키 코드 값이 키보드 버퍼에 입력된 후 CPU에 인터럽트가 걸린다. 그럼 현재 처리하던 작업에 대한 정보를 수집하여 저장한 뒤에 인터럽트 서비스 루틴(Interrupt Service Routine)을 수행한다.

인터럽트 발생 상황

1️⃣ 하드웨어 인터럽트 (외부 인터럽트) → 외부 장치 요청

📌 I/O 장치, 타이머, 외부 신호에 의해 발생

  • I/O 인터럽트 → 키보드 입력, 마우스 클릭, 프린터 완료 등
  • 타이머 인터럽트 → 특정 시간 간격마다 발생 (운영체제에서 CPU 스케줄링 등에 사용)
  • 전원 장애 인터럽트 → 전원 문제 발생 시 시스템 안전 종료
  • 외부 신호 인터럽트 → 네트워크 패킷 수신, 하드웨어 장치의 특별한 요청

2️⃣ 소프트웨어 인터럽트 (내부 인터럽트) → CPU 내부에서 발생

📌 프로그램 실행 중 예외 상황이 발생하면 CPU가 자동 처리

  • 예외(Exception) 인터럽트 → 0으로 나누기, 오버플로우 발생
  • 잘못된 명령어 실행 → 존재하지 않는 명령어를 실행하려 할 때
  • 시스템 호출(Syscall) → 프로그램이 운영체제 기능(파일 읽기, 메모리 할당 등)을 요청할 때
  • 페이지 폴트(Page Fault) → 프로세스가 메모리에 없는 페이지를 참조할 때

인터럽트 처리 과정

1️⃣ 인터럽트 발생 (Interrupt Occurs)

  • 하드웨어(키보드 입력, 타이머, 입출력 완료 등) 또는 소프트웨어(예외, 시스템 호출)에서 인터럽트 신호가 발생

2️⃣ 현재 작업 상태 저장 (Context Saving)

  • 현재 실행 중이던 프로그램의 상태를 저장
  • PC(프로그램 카운터): 현재 실행 중인 명령어의 다음 주소 저장
  • 레지스터 값: 현재 작업을 나중에 다시 수행할 수 있도록 저장
  • 저장 위치: 보통 스택(Stack) 또는 특수 레지스터

3️⃣ 인터럽트 서비스 루틴(ISR) 실행 (Execute ISR)

  • CPU가 해당 인터럽트의 ISR(Interrupt Service Routine)을 실행

4️⃣ 원래 상태 복원 (Context Restoration)

  • ISR이 끝나면 저장했던 PC와 레지스터 값을 복원
  • CPU는 원래 실행 중이던 프로그램으로 돌아감

5️⃣ 원래 프로그램 실행 재개 (Resume Execution)

  • 인터럽트 발생 전에 수행 중이던 프로그램을 그대로 이어서 실행

인터럽트 사용 이유

  • CPU가 I/O작업이 끝날 때 까지 기다릴 필요 없이 다른 작업을 할 수 있음. 입력 상황이 발생되면 인터럽트를 보내고, CPU는 현재 작업을 계속 수행하고 입력이 완료되어 ENTER을 누르게 되면 다시 인터럽트를 보내 현재 작업을 잠시 중단한 뒤 인터럽트 서비스 루틴(ISR)을 수행함.
  • 실시간 응답 처리가 가능
  • 멀티태스킹 지원
  • 오류 처리 및 안정성 유지

인터럽트가 포함된 명령어 사이클

  • CPU(처리기)는 인터럽트 발생 여부 검사
  • 인터럽트가 발생하지 않았으면 지금 수행중인 프로그램의 다음 명령어 반입
  • 인터럽트가 있으면, 현재 프로그램의 실행을 멈추고, 인터럽트 처리 루틴 실행

인터럽트 발생 시 메모리와 레지스터의 상태변화


(a) 위치 N의 명령어 실행 후 인터럽트 발생

  • 프로그램 카운터(CP)에 사용자 프로그램에서 다음 실행할 명령어의 주소인 N+1 저장. 스택 포인터에는 제어스택의 주소인 T가 저장됨
  • 인터럽트 서비스 루틴이 시작되면 제어스택에 N+1과 범용 레지스터 값들을 저장해놓고 초기화 시킨 후 스택 포인터는 프로그램 카운터와 범용 레지스터 값을 뺀 M인 T-M의 값이 들어가게 되어 인터럽트 서비스 루틴을 실행하게 됨

(b) 인터럽트로부터 복귀

  • 인터럽트 서비스 루틴이 전부 실행된 복귀 주소는 Y+L이기 때문에 프로그램 카운터가 Y+L+1이 되면 기존의 사용자 프로그램의 다음 주소인 N+1이 저장되어있던 제어스택의 주소에서 N+1 을 갖고와 프로그램 카운터가 N+1로 되돌아오고, 범용 레지스터 값도 돌아옴. 스택 포인터도 T-M에서 T로 변하게 되어 처음 인터럽트 발생 전 상황으로 돌아가게 된 것을 볼 수 있음

0개의 댓글