인터럽트
일반적인 컴퓨터 작업을 생각해보자.
입출력 작업을 시작하기 위해,
- 장치 드라이버는 장치 컨트롤러의 적절한 레지스터(각 장치의 레지스터, CPU 레지스터 아님)에 값을 적재.
- 장치 컨트롤러가 레지스터 내용을 검사해서 수행할 작업을 결정.
- 장치 컨트롤러가 장치의 로컬 버퍼로 데이터 전송을 시작하고, 완료되면 장치 드라이버에게 완료됐음을 알림.
- 읽기 요청이라면 데이터 또는 데이터에 대한 포인터를 반환.
- 쓰기라면 쓰기 완료나 장치 사용중 같은 상태 정보 반환.
→ 그런데 어떻게 컨트롤러가 장치 드라이버에게 작업을 완료했다는 사실을 알릴까? : 인터럽트
인터럽트
하드웨어는 시스템 버스를 통해 CPU 에 신호를 보내 인터럽트를 발생시킨다.
→ 시스템 버스 : 주요 구성 요소 사이의 주요 통신 경로.
인터럽트 발생 시
- CPU 가 하던 일을 중단.
- 즉시 “고정된 위치”로 실행을 옮김.
- 인터럽트 서비스 루틴의 시작 주소
- 인터럽트 서비스 루틴이 실행되면 CPU 가 인터럽트 되었던 연산을 재개.
인터럽트 서비스 루틴
인터럽트 서비스 루틴을 실행한다는 건 → 인터럽트 정보를 조사한다는 것.
- 인터럽트 고유의 핸들러를 호출하는 것이다.
ISR 은 테이블에 적재되어 있다.
- 인터럽트는 빠르게 처리되어야 한다.
- 인터럽트 서비스 루틴(ISR) 은 빠른 처리를 위해 인터럽트 루틴에 대한 포인터들의 테이블을 사용한다.
- 포인터들의 테이블은 “하위 메모리” 에 저장된다.
- 메모리 주소의 낮은 위치, 즉 0번지.
- 100개 정도 있음.
- 테이블에는 여러 장치에 대한 인터럽트 서비스 루틴의 주소가 들어있다.
인터럽트 벡터
인터럽트 서비스 루틴 주소의 배열
- 인터럽트가 실행되면 인터럽트 벡터에서 고유 번호로 색인하여 인터럽트 서비스 루틴의 주소를 찾는다.
- 하나의 인터럽트 핸들러가 모든 인터럽트 소스를 검색할 필요를 줄이기 위해 만들어졌다.
인터럽트 후 정보 복원
당연히 인터럽트된 모든 정보를 저장해야, 인터럽트를 처리한 후 이 정보를 복원할 수 있다.
- 인터럽트 루틴이 처리기(레지스터)의 값을 변경할 필요가 있다면
- 명시적으로 현재 상태를 저장하고
- 복귀하기 전, 상태를 복원해야 한다.
- 즉, 인터럽트를 서비스 한 후
- 저장되어있던 복귀 주소를 프로그램 카운터에 적재하고
- 인터럽트에 의해 중단되었던 연산이 인터럽트가 발생하지 않았던 것처럼 실행되어야 함.
인터럽트 구현
인터럽트가 일어나면
- CPU 는 인터럽트 요청 라인(intterupt request line) 으로 하나의 명령어 실행을 완료할 때마다 이 선을 감지 함.
- CPU 가 컨트롤러가 인터럽트 요청 라인에 신호를 보낸 것을 감지. → 인터럽트 번호를 읽고 인터럽트 벡터의 인덱스를 사용하여 “인터럽트 핸들러 루틴” 으로 점프.
- 인터럽트 핸들러 루틴이 있는 인덱스와 관련 된 주소에서 인터럽트 실행.
인터럽트 처리기
- 작업 중에 변경될 상태를 저장.
- 인터럽트 원인 확인.
- 필요한 처리 수행.
- 상태 복원.
- return_from_interrupt 명령어로 CPU 를 인터럽트 이전 상태로 되돌림.
요약
- 장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언하여 인터럽트 발생(raise)
- CPU 가 인터럽트를 포착(catch) 하여 인터럽트 핸들러로 dispatch
- 핸들러는 장치를 서비스하여 인터럽트를 지운다(clear).
💡 하지만 최신 운영체제에서는 더욱 정교한 인터럽트 처리 기능이 필요한데…
인터럽트 컨트롤러의 하드웨어 역할
- 중요한 처리 중에는 인터럽트 연기.
- 장치의 적절한 인터럽트 핸들러로 효율적으로 디스패치 해야 됨.
- 우선 순위가 높고 낮은 인터럽트를 구분하고, 적절한 긴급도로 대응할 수 있도록 다단계 인터럽트 필요.
인터럽트 요청 라인의 종류
- 마스크 불가능 인터럽트 → 복구할 수 없는 메모리 오류와 같은 우선순위 높은 이벤트.
- 마스킹 가능 인터럽트 → 장치 컨트롤러의 요청 같은 우선순위가 낮은 인터럽트.
인터럽트 체인
사실 컴퓨터에는 인터럽트 벡터의 주소 개수보다 많은 장치(인터럽트 처리기)가 있다. 그래서 인터럽트 체인을 이용한다.
- 인터럽트 벡터의 각 원소는 인터럽트 핸들러 리스트의 헤드를 가리킨다.
우선순위 레벨
- CPU 는 모든 인터럽트를 마스킹하지 않고도 우선순위가 낮은 인터럽트의 처리를 연기함.
- 또한, 우선 순위가 높은 인터럽트가 낮은 인터럽트의 실행을 선점할 수 있음.
요약
- 인터럽트는 최신 운영체제에서 비동기 이벤트를 처리하기 위해 사용 함.
- 장치 및 하드웨어 오류로 인해 인터럽트가 발생하기도 하고, 이런 가장 긴급한 작업을 먼저 수행하기 위해 인터럽트 우선순위 시스템을 사용 함.
- 시스템 성능을 좋게 하기 위해 인터럽트 벡터 같은 것으로 효율적인 인터럽트 처리를 함.
728x90
'개발공부 개발새발 > OS' 카테고리의 다른 글
OS ) 입출력 구조 (1) | 2024.12.19 |
---|---|
OS ) 저장 장치 (0) | 2024.12.18 |
OS ) 컴퓨터, 운영체제란 무엇인가. (2) | 2024.12.09 |
OS ) 멀티 코어가 뭡니까? (0) | 2024.11.20 |
OS ) 시스템콜, 코루틴, 그리고 이벤트 루프란? (0) | 2024.10.29 |