OS #13 인터럽트

underlier12·2020년 3월 15일
1

OS

목록 보기
13/35

13. 인터럽트

인터럽트란

CPU가 프로그램을 실행하고 있을 때 입출력 하드웨어 등의 장치나 또는 예외 상황이 발생하여 처리가 필요할 경우 CPU에 알려 처리하는 기술을 말한다.

인터럽트가 필요한 이유

인터럽트가 필요한 이유는 3가지 정도로 정리할 수 있다.

  • 선점형 스케쥴러 구현
  • IO Device와 커뮤니케이션
  • 예외 처리

이전에 본 선점형 스케쥴러를 구현할 때 running 상태인 프로세스를 강제로 ready 상태로 변경하기 위해 interrupt가 필요한 것을 알 수 있다. 또한 IO Device와의 커뮤니케이션을 진행할 때에도 처리 완료 시 프로세스를 block 상태에서 ready 상태로 인터럽트를 통해 전환할 필요가 있다. 예외 상황이 발생한 경우에도 CPU가 해당 처리를 할 수 있도록 알려줘야 한다.

인터럽트 처리 예시

  • 입출력 하드웨어 장치 이슈 발생

    • 파일처리 종료(block --> ready)
  • 예외 발생

    • 0으로 나눔(운영체제가 해당 프로세스 실행 중지/에러 표시)

주요 인터럽트

  • 예외 처리

  • 타이머 인터럽트(선점형 스케쥴러)

  • 입출력 인터럽트

인터럽트의 종류

인터럽트는 크게 두가지로 나눌 수 있다.

  • 내부 인터럽트
  • 외부 인터럽트

내부 인터럽트 예시

주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용 시 발생하며 주로 프로그램 내부에서 발생하므로 소프트웨어 인터럽트라고도 한다.

  • 0으로 나눔
  • 사용자 모드에서 허용되지 않은 명령 또는 메모리 공간 접근
  • 계산 결과가 Overflow/Underflow

외부 인터럽트 예시

주로 하드웨어에서 발생하는 이벤트로 하드웨어 인터럽트라고도 부른다.

  • 전원 이상
  • 기계 문제
  • 키보드 등 IO 관련 이벤트
  • Timer 이벤트

인터럽트 내부 동작

시스템 콜 인터럽트

시스템 콜도 일종의 인터럽트이며 시스템 콜을 실행하기 위해서 강제로 코드에 인터럽트 명령을 넣어 CPU에게 실행히켜야 한다. 아래는 시스템 콜 실제 코드이다.

일련의 과정을 보면 시스템 콜 인터럽트 명령을 호출하는 것은 다음과 같은 절차를 따른다.

  • 시스템 콜 인터럽트 명령 호출 0x80 명령 전달
    • CPU 사용자 모드에서 커널모드 전환
    • Interrupt Descriptor Table 에서 0x80에 해당하는 주소(함수)를 찾아 실행
    • system_call()함수에서 eax로부터 시스템 콜 번호를 찾아 해당 번호에 맞는 시스템 콜 함수로 이동
    • 해당 함수 실행 후 커널 모드에서 사용자모드 전환
    • 해당 프로세스 다음 코드 실행

사용자/커널 모드 전환

위에서 본 것 같이 시스템 콜 인터럽트 명령 호출 시 모드가 전환되는 것을 알 수 있다. 모드 전환에 대한 개략적인 구조도는 다음과 같다.

인터럽트와 IDT

인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있다.

  • 어디 : IDT(Interrupt Descriptor Table) 기록
  • 언제 : 컴퓨터 부팅 시
  • 누가 : 운영체제가
  • 어떤 : 운영체제 내부 코드를

IDT 예시

리눅스 예시

  • 0 ~ 31 : 예외 상황 인터럽트 (일부 정의 안됨)
  • 32 ~ 47 : 하드웨어 인터럽트 (주변 장치 종류/갯수에 따라 변경 가능)
  • 128 : 시스템 콜

인터럽트와 프로세스

인터럽트가 발생하는 일련의 과정을 다시 정리하면 다음과 같다.

  • 프로세스 실행 중 인터럽트 발생
  • 현 프로세스 실행 중단
  • 인터럽트 처리 함수 실행(운영체제)
  • 현 프로세스 재실행

profile
logos and alogos

0개의 댓글