결론 : CPU가 현재 실행 중인 프로그램을 멈추고, 운영체제 코드(커널 코드)를 실행하기 시작한다!
원래 CPU는 “사용자 프로그램 코드”를 실행 중
CPU는 이중 모드로 동작하며, 보통 CPU는 사용자 프로그램의 명령어를 차례차례 실행하는 상태
(EX : 계산기 프로그램을 실행 중이라면, add, mul 같은 계산 루프 실행)
제어권이 넘어가는 순간들
CPU가 “이제 OS가 처리해야겠다”라고 판단하는 순간
시스템 콜
프로그램이 read(), write() 같은 커널 기능을 요청할 때
•
CPU는 특수 명령어(int 0x80 같은 인터럽트 호출)를 실행하고, 사용자 코드 대신 커널 코드(운영체제 함수)로 점프
인터럽트
타이머 인터럽트(시계 땡 소리), 키보드 입력, 디스크 I/O 완료 신호같은 경우
•
CPU가 원래 하던 작업을 멈추고, OS의 “인터럽트 핸들러 함수”로 점프
Q) HW인터럽트와 SW인터럽트
예외
잘못된 메모리 접근(segfault), 0으로 나누기의 경우
•
CPU가 곧장 운영체제의 예외 처리 코드로 제어를 넘김
“제어권을 넘긴다”는 것의 의미
•
원래 실행 중이던 프로그램 명령어 주소 대신, OS의 핸들러 코드(커널 모드 코드) 주소로 CPU의 PC(Program Counter)가 바뀌는 것
•
이 순간부터 CPU는 사용자 프로그램이 아니라 운영체제 코드를 실행
예시(타이머 인터럽트)
1.
스레드 A가 무한 루프 도는 중
2.
타이머가 tick하고 인터럽트 신호를 보냄
3.
CPU는 루프를 중단 & 커널의 timer_interrupt() 코드로 이동
4.
OS가 “이제 스케줄링해야지”하고 스케줄 수행 → 다른 스레드 B로 교체
5.
CPU가 다시 사용자 모드로 내려와 B 코드 실행
결론
제어권 = 지금 시점부터 CPU가 누구의 코드(사용자 프로그램 코드 / 운영체제 코드)를 실행할지 결정하는 권리
(운영체제는 이 제어권을 잡는 순간에 스케줄링, 자원 관리, 보안 등을 다 처리 가능)

