- CPU가 하던 작업을 멈추고 중요한 내/외부 요청을 먼저 처리하게끔 하는 매커니즘
- 컴퓨터에서 발생하는 비정기적 사건(이벤트)을 처리하기 위한 시스템 레벨 기능
- CPU는 보통 순차적으로 명령을 처리하지만, 인터럽트가 발생하면 순서를 잠깐 중단하고 다른 일을 먼저 하고 끝나면 원래 하던 일로 복귀함 (Return from Interrupt)
- 사용자의 입력 / 시스템 오류 / 하드웨어 요청처럼 예측할 수 없는 이벤트를 처리하기 위해서 필요함
- 인터럽트도 너무 많은게 동시에 들어오면 병목현상이 일어날수있음
-> 마우스 / 키보드 / 컨트롤러 진동 / 사운드 재생 등등
1) 하드웨어 인터럽트 (Hardware Interrupt)
- 외부 장치가 CPU에게 신호를 보냄(키보드 입력 / 마우스 클릭 / 네트워크 패킷 수신, 디스크 완료 등)
-> Input Action으로 하드웨어 입력이 발생하면 인터럽트 후 PlayerController에서 처리
-> 오디오 장치가 인터럽트를 통해 CPU에게 요청2) 소프트웨어 인터럽트 (Software Interrupt)
- 프로그램이 직접 인터럽트를 발생시킴 (예외 처리 / 시스템 콜 / 강제 종료 등)
-> check()나 ensure()가 실패할 때 발생하는 예외
-> AddOnScreenDebugMessage() 호출로 게임 중 디버그 출력
-> AI가 Invalid 상태일 때 AbortTask() 트리거
-> 애니메이션 노티파이(Notify): 몽타주 재생 중 특정 프레임에 도달하면 소프트웨어 인터럽트처럼 행동하여 외부 이벤트(이펙트 / 사운드 등) 트리거
인터럽트 발생 -> 현재 작업을 중단하고 상태 저장 -> 인터럽트 핸들러(Interrupt Service Routine, ISR)로 분기 -> 요청 처리 -> 중단된 작업 복귀
ISR? : 인터럽트가 발생했을 때 실행되는 함수 또는 코드 블록으로 CPU가 어떤 인터럽트를 받으면 그 요청을 처리하기 위한 전용 코드를 실행(ISR)
-> IputAction / AnimNotify / 타이머 등등
우선순위
- 모든 인터럽트가 동시에 발생할 수 있기 때문에 우선순위 시스템이 있음
-> 시스템 크래시 = 최우선 / 사용자 입력 = 중간 / 마우스 위치 갱신 = 낮음
-> OnComponentBeginOverlap()과 InputAction이 동시에 일어날 경우에 Input 우선 처리
-> 게임 중 Pause 메뉴 켜졌을 때 나머지 Tick / 애니메이션 멈춤
캐시
- 인터럽트가 발생하면 CPU의 현재 상태(레지스터 등)를 저장해 복귀 후 원활히 돌아가게끔 함
버스
- 하드웨어 인터럽트는 보통 제어 버스를 통해 CPU에 도달함 (IRQ 요청 핀 통해 전달됨)
-> BindAction()으로 등록한 키 입력은 실제로 OS가 하드웨어 인터럽트를 통해 전달한 입력 이벤트를 언리얼이 추상화한 것
-> 게임패드의 버튼 / 진동은 OS -> CPU -> 언리얼 Input 시스템으로 들어오는 인터럽트 기반 흐름
1) 입력 지연
- 인터럽트가 쌓이면 처리 대기 시간 증가 (많은 장치 입력 시)
2) GC(Garbage Collection) 중지
- 인터럽트 중 메모리 접근 제한되면 GC도 잠시 대기할 수 있음
3) Tick 정지
- 강제 중단 시 Tick이 안 돌 수 있음 (디버그 중단, 오류 처리 등)