인터럽트
인터럽트 (Interrupt)
인터럽트(Interrupt)는 CPU가 프로그램을 실행하고 있을 때, 외부(하드웨어) 또는 내부(소프트웨어)에서 어떤 사건이 발생했음을 알려 CPU의 현재 작업을 잠시 중단시키고, 발생한 사건을 처리한 후 다시 원래의 작업으로 복귀하도록 하는 메커니즘입니다. 이는 CPU의 효율성을 극대화하고 멀티태스킹을 가능하게 하는 핵심적인 요소입니다.
🚨 인터럽트의 필요성
- CPU의 효율성 증대
> * CPU는 I/O 장치(키보드, 마우스, 디스크 등)보다 훨씬 빠릅니다. 인터럽트가 없다면, CPU는 I/O 작업이 완료될 때까지 계속 기다려야 하므로(폴링 방식), CPU 자원의 낭비가 심해집니다. > * 인터럽트를 통해 CPU는 I/O 작업이 진행되는 동안 다른 작업을 수행하다가, I/O 작업이 완료되면 인터럽트 신호를 받아 해당 작업을 처리할 수 있습니다.
- 동시성(Concurrency) 및 멀티태스킹(Multitasking) 지원
> * 여러 프로그램이 동시에 실행되는 것처럼 보이게 하는 멀티태스킹 환경에서, 운영체제가 CPU의 제어권을 효율적으로 전환하고 관리하는 데 필수적입니다.
- 예외 처리 : 프로그램 오류(e.g., 0으로 나누기, 잘못된 메모리 접근)나 시스템 오류 발생 시, 운영체제가 이를 감지하고 적절히 처리할 수 있도록 합니다.
⚙️ 인터럽트의 종류와 처리 과정
- 종류 (Types)
> * 하드웨어 인터럽트 (Hardware Interrupt) : I/O 장치(키보드 입력, 마우스 클릭, 디스크 I/O 완료, 프린터 출력 완료 등)나 타이머(Time-out)에 의해 발생합니다. 비동기적으로 발생합니다. > * 소프트웨어 인터럽트 (Software Interrupt) > > * 시스템 콜 (System Call) : 사용자 프로그램이 운영체제 서비스(파일 입출력, 메모리 할당 등)를 요청할 때 의도적으로 발생합니다. (TRAP) > > * 예외 (Exception) : 프로그램 실행 중 발생하는 오류(e.g., 0으로 나누기, 유효하지 않은 메모리 접근, 오버플로우)입니다. 동기적으로 발생합니다.
- 처리 과정 (Handling Process)
1. 인터럽트 발생 : CPU가 현재 명령어를 실행하는 도중 인터럽트 신호가 발생합니다. 2. 현재 상태 저장 : CPU는 현재 실행 중인 프로세스의 상태(레지스터 값, 프로그램 카운터 등)를 스택에 저장합니다. (컨텍스트 스위칭의 일부) 3. 인터럽트 벡터 확인 : CPU는 인터럽트 종류를 식별하기 위해 '인터럽트 벡터(Interrupt Vector)' 테이블을 참조합니다. 인터럽트 벡터는 각 인터럽트 유형에 해당하는 '인터럽트 서비스 루틴(ISR, Interrupt Service Routine)'의 시작 주소를 가리킵니다. 4. ISR 실행 : 해당 ISR(운영체제 코드)로 제어권이 넘어가 인터럽트 처리 작업을 수행합니다. 5. 상태 복원 및 복귀 : ISR 실행이 완료되면, 저장했던 프로세스의 상태를 복원하고, 원래 실행 중이던 프로세스로 제어권을 반환하여 중단되었던 작업을 재개합니다.
💡 개발자 핵심 Point
- 인터럽트는 운영체제가 하드웨어와 상호작용하고, 멀티태스킹을 구현하며, 시스템의 안정성을 유지하는 데 핵심적인 메커니즘입니다.
- 폴링(Polling) vs 인터럽트
> * 폴링 : CPU가 주기적으로 I/O 장치의 상태를 확인하여 작업 완료 여부를 검사. CPU 자원 낭비가 심합니다. > * 인터럽트 : I/O 장치가 작업 완료 시 CPU에 신호를 보내어 처리. CPU 자원 효율적 사용을 가능하게 합니다.
- 시스템 콜은 사용자 프로그램이 커널의 서비스를 요청하기 위해 의도적으로 발생시키는 소프트웨어 인터럽트의 한 종류입니다.
- 개발자가 직접 인터럽트를 다룰 일은 거의 없지만, 인터럽트의 개념을 이해하는 것은 운영체제의 동작 방식, 특히 컨텍스트 스위칭, 시스템 콜, 장치 드라이버의 역할을 이해하는 데 필수적입니다.