CPU 가상화의 핵심 - 시분할 (Time Sharing)
제한적 직접 실행(limited direct execution)
배경 문제 : 성능 vs 제어
- 직접 실행 : 사용자 프로그램을 직접 CPU에서 실행 → 빠름
- 문제 : 프로그램이 OS의 제어를 벗어남 → 위험하거나 제어 불가
- 예 : 무한 루프, 다바이스 직접 접근 , 메모리 침범
- CPU 가 제어 : 제어는 쉬우나 성능이 낮음
제어를 유지하면서 효율적으로 CPU를 가상화 하려면?
문제점 1 : 특수 동작
- 프로세스가 직접해서는 안되는 특수 동작을 수행하려고 함
- ex) 디스크에 I/O 요구 메모리 추가 할당 요구
- → 특권을 가진 프로그램이 실행해야 함
- 해결책 : 하드웨어의 지원으로 보호
- 하드웨어가 모니터하는 두 개의 mode를 제공
- user mode : 할 수 있는 일이 제한된
- kernel mode : 모든 종류의 동작을 할 수 있다
- user mode에서 금지된 일을 시도하면? → 트랩 발생
- 금지된 일 : 파일 입출력, 화면 출력, 시간 변경
- 트랩 : 소프트웨어 인터럽트
- 하드웨어 인터럽트도 있음
- 일반 사용자가 커널 모드의 기능을 사용하고 싶다면
- 시스템 호출 (system call) : user 모드에 숨통 틀어주기
system call
- OS 기능을 제공하는 잘 정의된 API
- system call 동작 흐름
- 사용자 모드에서 trap 살행(int, syscall 등)
- 자격 검사를 해서 안되면 다시 기존 프로세스로 이동
- trap table을 통해 커널 모드로 분기
- 테이블의 각 항목은 트랩 핸들러로 이동하는 문기 명령
- 트랩 핸들러: 트랩을 방생시킨 각 원인을 처리하는 코드
- 트랩 테이블은 부팅 시 초기화된다
- 커널 스택에 레지스터 저장
- 커널 함수 처리
- return-from-trap으로 사용자 모드 복귀
문제점 2 : 프로세스 간 전환
협조적 방식
- 사용자 프로그램이 자발적으로 시스템 콜을 호출하거나 yield() 호출 시 OS로 제어권 반환
- yield() : 의미 없는 시스템 콜