Search

인터럽트

class
운영체제
상태
완료
날짜
목차

인터럽트

인터럽트는 현재 실행중인 프로세스를 일시적으로 중단하고, 특정 이벤트(인터럽트 핸들러 또는 인터럽트 서비스 루틴이라고 함)를 실행한 후 원래의 작업으로 돌아가게 하는 메커니즘입니다.
인터럽트는 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉩니다.
하드웨어 인터럽트는 외부 장치(키보드, 마우스)로부터 발생합니다.
소프트웨어 인터럽트는 프로그램 내부에서 발생하며, 보통 시스템 호출(시스템 콜)과 같은 상황에서 발생합니다.

인터럽트의 처리 과정

인터럽트 처리 과정은 복잡하게 들릴 수 있지만, 기본적으로 몇 가지 주요 단계로 나눌 수 있습니다.
이 과정은 하드웨어 인터럽트에 초점을 맞추며, 소프트웨어 인터럽트(시스템 호출)도 비슷한 메커니즘을 따르지만, 여기서는 주로 하드웨어 인터럽트 처리 과정을 설명하겠습니다.

1. 인터럽트 요청발생

인터럽트 과정은 하드웨어 장치(키보드, 네트워크 카드)에서 인터럽트 신호를 CPU에 보내는 것으로 시작합니다.
이는 특정 이벤트(키보드 키가 눌림, 네트워크 패킷 도착)가 발생했음을 CPU에 알리는 것입니다.

2. 인터럽트 인식

CPU는 현재 실행 중인 명령을 완료한 후 인터럽트 요청을 인식합니다.
CPU는 여러 인터럽트 중 우선순위를 평가하여 가장 높은 우선순위의 인터럽트를 먼저 처리합니다.

3. 인터럽트 처리를 위한 준비

CPU가 인터럽트를 인식하면, 현재의 실행 상태를 보존합니다.
즉, 컨텍스트 스위칭이 일어납니다.

4. 인터럽트 서비스 루틴(ISR) 실행

커널에서는 해당 인터럽트에 대응하는 인터럽트 서비스 루틴(ISR)의 주소를 찾습니다.
CPU는 이 주소로 점프하여 ISR을 실행합니다.
인터럽트에 대응하는 인터럽트 서비스 루틴을 찾는 방법은 위 과정에서 벡터 테이블을 사용합니다. 이에 대한 자세한 내용은 아래의 위키백과에서 확인해 주시기 바랍니다.

5. 인터럽트 처리

ISR은 인터럽트를 처리하기 위해 필요한 작업을 수행합니다. 예를 들어, 네트워크 인터럽트의 경우 패킷을 처리하고, 키보드 인터럽트의 경우 키보드 버퍼에 키 입력을 저장할 수 있습니다. ISR 실행이 끝나면, 일반적으로 특정 명령(EOI, End Of Interrupt)을 통해 인터럽트 컨트롤러에 인터럽트 처리가 완료되었음을 알립니다.
즉, 이 곳에서는 인터럽트 처리가 완료되며 인터럽트 결과도 전달됩니다.

6. 원래 작업으로 복귀

인터럽트 처리가 완료되면, CPU는 보존해둔 실행 상태(프로그램 카운터와 레지스터 상태)를 복원하고, 인터럽트 발생 전에 실행 중이던 작업을 계속합니다. (컨텍스트 스위칭 원복)

유니티에서 인터럽트

사실 C#에서는 직접적으로 인터럽트를 발생시키거나 다룰 수는 없습니다.
C#과 같은 고수준 프로그래밍 언어에서 인터럽트를 직접적으로 다루지 않는 것은 개발의 편의성, 안전성을 위한 설계 결정입니다.
저수준 하드웨어 인터럽트 처리는 주로 임베디드 시스템 개발이나 운영 체제 개발과 같은 특수한 환경에서 필요로 하며, 이 경우에는 C, C++, 어셈블리 언어와 같은 저수준 언어를 사용하는 것이 적합합니다.
하지만, 이 곳에서는 인터럽트기 간접적으로 발생했을 때와 인터럽트와 비슷한 상황을 예시로 들어보겠습니다.
사용자 입력 (키보드, 마우스, 게임패드) : 사용자가 키보드의 키를 누르거나 마우스를 클릭할 때, 유니티의 Input 시스템은 이러한 입력을 감지하고 처리합니다.
void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 스페이스바를 눌렀을 때의 처리 로직 } }
C#
복사
유니티에서는 사용자의 입력 시스템을 Update 전에 받아 처리합니다. 이는 간접적으로 하드웨어 인터럽트가 처리되어 그 결과를 받았을 때, Update에서 처리될 수 있도록 그 결과를 저장하고 있다는 의미입니다.
파일 읽기 : 파일을 읽기 위해 C#에서는 System.IO 네임스페이스 아래에 있는 클래스들을 사용할 수 있습니다. 이는 소프트웨어 인터럽트의 과정을 .NET Framework 또는 .NET Core를 통해 간접적으로 처리하는 과정입니다.
using System; using System.IO; class ReadFileExample { static void Main() { string filePath = @"C:\example.txt"; // FileStream을 사용하여 파일을 열고 StreamReader로 읽기 // 이 부분이 간접적으로 시스템 콜을 발생하는 부분입니다. // 파읽을 열고 읽는 부분을 직접적으로 처리하지 않습니다. using (StreamReader reader = new StreamReader(filePath)) { string fileContent = reader.ReadToEnd(); Console.WriteLine(fileContent); } } }
C#
복사
UI 이벤트 처리 : 유니티에서 UI 버튼 클릭, 슬라이더 조정 같은 이벤트는 UI 컴포넌트에 이벤트 리스너를 등록함으로써 처리할 수 있습니다.
이는 인터럽트와 완전히 별개이지만, 인터럽트 처리 과정과 매우 유사합니다.
즉, 어떤 이벤트가 발생했을 때를 인터럽트 발생으로 보고, 그 처리 로직을 인터럽트 처리 로직으로 본다면, 이 과정은 인터럽트 실행 부분과 매우 유사합니다.
public Button myButton; void Start() { myButton.onClick.AddListener(OnClickButton); } void OnClickButton() { // 버튼 클릭 시 실행할 로직 }
C#
복사