매번 헷갈리는 운영체제의 실행 모드, 인터럽트, 스케줄링, 그리고 시스템 콜의 관계를 하나의 흐름으로 정리해보겠습니다.
1. 두 가지 실행 모드 (보호 체계)
운영체제는 시스템을 보호하기 위해 CPU 실행 권한을 나눕니다.
- 사용자 모드 (User Mode): 일반 앱 실행. 하드웨어 직접 접근 불가.
- 커널 모드 (Kernel Mode): OS 실행. 모든 자원 접근 및 제어 가능.
- 전환 도구: 사용자 모드에서 커널 모드로 가기 위한 유일한 통로가 바로 인터럽트(Interrupt)입니다.
2. 인터럽트의 분류 (발생 원인과 시점)
인터럽트는 누가, 언제 일으키느냐에 따라 크게 두 축으로 나뉩니다.
| 분류 | 비동기 인터럽트 (Asynchronous) | 동기 인터럽트 (Synchronous) |
| 다른 이름 | 하드웨어 인터럽트 | 소프트웨어 인터럽트 (Trap/Exception) |
| 주체 | 하드웨어 장치 (타이머, 디스크, 키보드) | CPU 내부 (잘못된 명령어, 시스템 콜 호출) |
| 특징 | 언제 터질지 모름 (외부 신호) | 명령어를 실행하는 순간 발생 (예측 가능) |
| 예시 | 타이머 인터럽트, I/O 완료 알림 | 시스템 콜, 0으로 나누기, 메모리 오류 |
3. 핵심 메커니즘: 시스템 콜 (System Call)
사용자 프로그램이 하드웨어 자원이 필요할 때 사용하는 공식 창구입니다.
- 관계: 시스템 콜은 소프트웨어 인터럽트 메커니즘을 이용하여 구현됩니다.
- 과정: read() 호출 → 소프트웨어 인터럽트 발생 → 커널 모드 전환 → OS가 대신 작업 → 사용자 모드 복귀
4. CPU 스케줄링과의 연결고리
스케줄링은 CPU 제어권이 커널 모드로 넘어갔을 때(즉, 인터럽트가 발생했을 때) 일어납니다.
- 타이머 인터럽트 (비동기/하드웨어):
- 정해진 시간이 다 되면 하드웨어가 신호를 줌.
- OS가 개입하여 강제로 현재 프로그램을 멈추고 다음 프로그램으로 교체 (선점형 스케줄링).
- I/O 요청 (동기/소프트웨어):
- 프로그램이 시스템 콜로 I/O를 요청함.
- 데이터가 올 때까지 기다려야 하므로, OS가 이 프로그램을 쉬게 하고 다른 프로그램을 실행함.
- I/O 완료 (비동기/하드웨어):
- 하드웨어가 일을 다 끝냈다고 신호를 줌.
- OS는 쉬고 있던 프로그램을 다시 실행 대기 큐(Ready Queue)에 올림.
5. 최종 요약 흐름도
사용자 프로그램 실행 (사용자 모드)
↓
인터럽트 발생 (타이머 시간 초과 혹은 시스템 콜 호출)
↓
커널 모드 전환 (CPU 제어권이 OS로 이동)
↓
OS 서비스 처리 혹은 스케줄링 수행 (Context Switching 발생 가능)
↓
사용자 모드 복귀 (새로운 혹은 기존 프로그램 실행)
이 일련의 과정이 초당 수백, 수천 번 반복되면서 우리가 여러 앱을 동시에 부드럽게 사용하는 것처럼 느끼게 됩니다.