• os

인터럽트와 폴링

인터럽트의 처리 절차와 저장되는 문맥, 중첩 인터럽트, 폴링과의 차이, 하드웨어·소프트웨어 인터럽트를 정리한다.

시리즈 · 운영체제3 / 18
  1. 운영체제의 유형
  2. System Call과 Dual Mode
  3. 인터럽트와 폴링
  4. 프로세스와 PCB, 프로세스의 상태 변화
  5. 프로세스 주소 공간과 Stack이 높은 주소부터 할당되는 이유
  6. 스레드: 사용자·커널 수준 스레드와 Thread Pool, Fork-Join
  7. Context Switching
  8. 프로세스 스케줄링: 단계와 알고리즘
  9. Thread Scheduling: 경합 범위 PCS와 SCS
  10. 경쟁 상태와 상호 배제: Thread Safe, 데커·피터슨 알고리즘
  11. 뮤텍스와 세마포, 모니터
  12. 교착 상태: 발생 조건과 해결 방법
  13. 메모리 계층 구조와 캐시 메모리
  14. 메모리 관리: 주소 바인딩과 연속 메모리 할당
  15. 가상 메모리: Paging과 Segmentation, TLB
  16. 요구 페이징과 페이지 교체 알고리즘, Thrashing
  17. File Descriptor와 File System, I-Node
  18. 동기/비동기와 블로킹/논블로킹, I/O Multiplexing

인터럽트

인터럽트(Interrupt)는 CPU가 프로그램을 실행하고 있을 때, 입출력 장치나 예외 상황처럼 처리가 필요한 일이 생겼음을 CPU에 알려 처리하게 하는 것이다. CPU는 인터럽트를 감지하면 실행 중이던 작업을 중단하고 그 일을 먼저 처리한다.

처리 절차

인터럽트를 처리하는 루틴을 인터럽트 서비스 루틴(ISR, Interrupt Service Routine) 이라고 한다.

  1. 인터럽트가 발생한다.
  2. CPU가 현재 상태(context)를 커널 스택에 저장한다. 하드웨어가 자동으로 저장하거나 ISR 진입 시점의 코드가 저장한다.
  3. ISR을 실행한다.
  4. ISR이 끝나면 저장해 둔 context를 복원한다.
  5. 중단되었던 명령어로 복귀한다.

인터럽트 발생부터 인터럽트 서비스 루틴 호출까지의 처리 과정

접수된 인터럽트를 처리할지 말지는 CPU의 특수 레지스터에 있는 비트 마스크로 선택적으로 결정한다.

저장되는 정보 (Context)

  • Program Counter(PC): 다음에 실행할 명령어의 주소
  • Processor Status Register(PSR): 인터럽트 플래그, 조건 플래그 등
  • 범용 레지스터: R0~Rn, EAX, EBX 등
  • 필요하면 세그먼트 레지스터, Stack Pointer 등도 포함한다.

인터럽트 처리 중에 인터럽트가 발생한다면

인터럽트 핸들러를 실행하는 중에도 더 높은 우선순위의 인터럽트가 발생하면, CPU는 현재 핸들러를 잠시 중단하고 새 인터럽트를 먼저 처리한다. (중첩 인터럽트)

폴링

인터럽트와 반대되는 방식이 폴링(Polling)이다. 다른 장치의 상태를 주기적으로 검사하다가 일정한 조건을 만족하면 송수신 등의 처리를 한다.

  • 상태를 파악하려면 장치의 레지스터를 읽어야 한다.
  • 그동안 다른 장치는 확인하기 어렵고, 읽는 데 CPU 자원이 낭비된다.
  • 실시간 동기화에 쓰이기도 한다. (예: Ajax polling)

하드웨어 인터럽트와 소프트웨어 인터럽트

하드웨어 인터럽트

CPU 외부의 디스크 컨트롤러나 주변 장치가 요구하는 인터럽트다. 운영체제의 처리가 필요한 상황을 전기 신호로 알린다.

소프트웨어 인터럽트

CPU 내부에서, 자신이 실행한 명령 때문에 발생하는 인터럽트다. 프로그램 실행 중 처리할 수 없는 오류나 이벤트를 알리는 경우이며, 트랩(trap) 또는 예외(exception)라고 부른다.

  • 존재하지 않는 메모리 주소에 접근하는 경우
  • 0으로 나누려는 경우

시스템 콜도 트랩을 통해 커널 모드로 진입한다.