본문 바로가기
개발공부 개발새발/OS

OS ) 인터럽트

by 휴일이 2024. 12. 17.

인터럽트

일반적인 컴퓨터 작업을 생각해보자.

입출력 작업을 시작하기 위해,

  1. 장치 드라이버는 장치 컨트롤러의 적절한 레지스터(각 장치의 레지스터, CPU 레지스터 아님)에 값을 적재.
  2. 장치 컨트롤러가 레지스터 내용을 검사해서 수행할 작업을 결정.
  3. 장치 컨트롤러가 장치의 로컬 버퍼로 데이터 전송을 시작하고, 완료되면 장치 드라이버에게 완료됐음을 알림.
  4. 읽기 요청이라면 데이터 또는 데이터에 대한 포인터를 반환.
    • 쓰기라면 쓰기 완료나 장치 사용중 같은 상태 정보 반환.
→ 그런데 어떻게 컨트롤러가 장치 드라이버에게 작업을 완료했다는 사실을 알릴까? : 인터럽트

인터럽트

하드웨어는 시스템 버스를 통해 CPU 에 신호를 보내 인터럽트를 발생시킨다.

→ 시스템 버스 : 주요 구성 요소 사이의 주요 통신 경로.

인터럽트 발생 시

  1. CPU 가 하던 일을 중단.
  2. 즉시 “고정된 위치”로 실행을 옮김.
    • 인터럽트 서비스 루틴의 시작 주소
  3. 인터럽트 서비스 루틴이 실행되면 CPU 가 인터럽트 되었던 연산을 재개.

인터럽트 서비스 루틴

인터럽트 서비스 루틴을 실행한다는 건 → 인터럽트 정보를 조사한다는 것.

  • 인터럽트 고유의 핸들러를 호출하는 것이다.

ISR 은 테이블에 적재되어 있다.

  • 인터럽트는 빠르게 처리되어야 한다.
  • 인터럽트 서비스 루틴(ISR) 은 빠른 처리를 위해 인터럽트 루틴에 대한 포인터들의 테이블을 사용한다.
  • 포인터들의 테이블은 “하위 메모리” 에 저장된다.
    • 메모리 주소의 낮은 위치, 즉 0번지.
    • 100개 정도 있음.
  • 테이블에는 여러 장치에 대한 인터럽트 서비스 루틴의 주소가 들어있다.

인터럽트 벡터

인터럽트 서비스 루틴 주소의 배열

  • 인터럽트가 실행되면 인터럽트 벡터에서 고유 번호로 색인하여 인터럽트 서비스 루틴의 주소를 찾는다.
  • 하나의 인터럽트 핸들러가 모든 인터럽트 소스를 검색할 필요를 줄이기 위해 만들어졌다.

인터럽트 후 정보 복원

당연히 인터럽트된 모든 정보를 저장해야, 인터럽트를 처리한 후 이 정보를 복원할 수 있다.

  • 인터럽트 루틴이 처리기(레지스터)의 값을 변경할 필요가 있다면
    • 명시적으로 현재 상태를 저장하고
    • 복귀하기 전, 상태를 복원해야 한다.
  • 즉, 인터럽트를 서비스 한 후
    • 저장되어있던 복귀 주소를 프로그램 카운터에 적재하고
    • 인터럽트에 의해 중단되었던 연산이 인터럽트가 발생하지 않았던 것처럼 실행되어야 함.

인터럽트 구현

인터럽트가 일어나면

  1. CPU 는 인터럽트 요청 라인(intterupt request line) 으로 하나의 명령어 실행을 완료할 때마다 이 선을 감지 함.
  2. CPU 가 컨트롤러가 인터럽트 요청 라인에 신호를 보낸 것을 감지. → 인터럽트 번호를 읽고 인터럽트 벡터의 인덱스를 사용하여 “인터럽트 핸들러 루틴” 으로 점프.
  3. 인터럽트 핸들러 루틴이 있는 인덱스와 관련 된 주소에서 인터럽트 실행.

인터럽트 처리기

  1. 작업 중에 변경될 상태를 저장.
  2. 인터럽트 원인 확인.
  3. 필요한 처리 수행.
  4. 상태 복원.
  5. return_from_interrupt 명령어로 CPU 를 인터럽트 이전 상태로 되돌림.

요약

  • 장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언하여 인터럽트 발생(raise)
  • CPU 가 인터럽트를 포착(catch) 하여 인터럽트 핸들러로 dispatch
  • 핸들러는 장치를 서비스하여 인터럽트를 지운다(clear).
💡 하지만 최신 운영체제에서는 더욱 정교한 인터럽트 처리 기능이 필요한데…

 

인터럽트 컨트롤러의 하드웨어 역할

  1. 중요한 처리 중에는 인터럽트 연기.
  2. 장치의 적절한 인터럽트 핸들러로 효율적으로 디스패치 해야 됨.
  3. 우선 순위가 높고 낮은 인터럽트를 구분하고, 적절한 긴급도로 대응할 수 있도록 다단계 인터럽트 필요.

인터럽트 요청 라인의 종류

  • 마스크 불가능 인터럽트 → 복구할 수 없는 메모리 오류와 같은 우선순위 높은 이벤트.
  • 마스킹 가능 인터럽트 → 장치 컨트롤러의 요청 같은 우선순위가 낮은 인터럽트.

인터럽트 체인

사실 컴퓨터에는 인터럽트 벡터의 주소 개수보다 많은 장치(인터럽트 처리기)가 있다. 그래서 인터럽트 체인을 이용한다.

  • 인터럽트 벡터의 각 원소는 인터럽트 핸들러 리스트의 헤드를 가리킨다.

우선순위 레벨

  • CPU 는 모든 인터럽트를 마스킹하지 않고도 우선순위가 낮은 인터럽트의 처리를 연기함.
  • 또한, 우선 순위가 높은 인터럽트가 낮은 인터럽트의 실행을 선점할 수 있음.

요약

  1. 인터럽트는 최신 운영체제에서 비동기 이벤트를 처리하기 위해 사용 함.
  2. 장치 및 하드웨어 오류로 인해 인터럽트가 발생하기도 하고, 이런 가장 긴급한 작업을 먼저 수행하기 위해 인터럽트 우선순위 시스템을 사용 함.
  3. 시스템 성능을 좋게 하기 위해 인터럽트 벡터 같은 것으로 효율적인 인터럽트 처리를 함.
728x90