Limited Direct Execution
CPU의 성능을 높일 수 있는 방법으로는 무엇이 있을까?
프로그램을 CPU 상에서 직접 실행(Direct Execution)하는 것이다.
- 의미: 사용자 프로세스를 운영체제가 하드웨어 위에서 직접 실행하게 하는 방식
- 방법: OS가 프로세스를 생성한 뒤 그 시작 지점(ex: main() 함수)으로 제어를 넘겨준다.
그러나, 이런 직접 실행에 문제점이 있다.
- 제한된 동작을 할 수 있다는 것
- 프로세스가 무한히 실행될 수 있다는 것
- 느린 동작을 할 수 있다는 것
이를 해결하기 위한 방법으로 제한된 직접 실행(Limited Direct Execution)이 있는 것이다.
- 의미: 프로세스를 직접 실행하되, OS와 하드웨어가 일부 제어권을 유지하는 방식.
문제점1 - Protection
어떻게 하면 사용자 프로세스가 다른 프로세스를 해치지 못하게 막을 수 있을까?
운영체제와 하드웨어가 함께 제공하는 권한 구분을 통해 해결한다.
1. User Mode
- 제한된 모드 (ex: 직접 디바이스 접근 불가)
2. Kernel Mode
- 운영체제가 실행되는 모드
- 모든 명령어 실행 가능

위 그림은 CPU 권한 수준을 나타내는 그림이다.
Intel x86계열에서는 Ring3가 유저 모드, Ring0가 커널 모드이다. 그리고 Ring 1,2는 일부 모듈이 실행되도록 설계되었으나 현대 OS에는 잘 쓰이지 않는다고 한다.
이후 Ring -1, -2, -3이 추가되었는데 Hypervisor(하이퍼바이저)나 보안 관리 모드를 지원한다.
ARMv8 계열에서는 EL0이 유저 모드, EL1이 커널 모드이다. 그리고 EL2는 Hypervisor, EL3는 보안 기능을 지원한다.
따라서 각 계열의 유저 모드과 커널 모드의 숫자가 반대인 것만 주의해주면 된다.
System Call
시스템 콜이 어떻게 동작하는지 살펴보자.

위 그림과 같은 RAM이 있다고 보자.
Process P는 본인 영역만 볼 수 있다.
커널 코드(sys_read)는 메모리에 있지만 유저 모드에서는 보이지도 않고 접근도 불가한 것이다.

그래서 프로세스는 read()와 같은 커널 함수를 직접 실행해야 한다.
번호 체계는 OS 버전/아키텍처별로 다를 수 있으니 주의해야 한다.
movl $5, %eax ; read() syscall 번호 (syscall-table index)
int $64 ; trap 호출 (trap-table index)
이 trap이 발생하면 유저 모드에서 커널 모드로 전환을 하게 된다.

이제 커널 모드이기 때문에 커널 코드(sys_read) 실행이 가능해졌다.
지정된 시스템 콜을 참고해서 sys_read까지 가서 실행을 하는 것이다.
그리고 원래 호출했던 프로세스의 버퍼 영역에 그 값을 저장한다.
작업이 끝나면 다시 유저 모드로 돌아간다.
이처럼, 사용자 프로세스는 기능이 제한되어 있다.
(프로세스는 자기 영역만 접근 가능하고, Disk I/O는 커널을 통해서 수행 가능하고, lidt과 같은 명령어 사용이 금지된다.)
만약에 사용자 프로세스가 금지된 동작을 하려고 한다면 OS는 이 프로세스를 kill할 것이다.
문제점2 - How to take the CPU away?
직접 실행의 두 번째 문제점은 프로세스 간 전환을 할 수 있어야 한다는 것이다.
OS는 어떻게 CPU를 다시 획득하여 프로세스 전환을 할 수 있을까?
OS는 멀티 프로그래밍(multiprogramming)이 필요하다.
- Mechanism: 어떻게 프로세스를 바꿀 것인가? (→ Process Dispatcher)
- Policy: 언제, 어떤 프로세스를 바꿀 것인가? (→ Process Scheduler)
✅Dispatch Mechanism
질문1) 디스패처가 CPU 제어권을 어떻게 되찾을까?
→ 옵션1) Cooperative Multi-tasking (협력적 멀티태스킹)
- 프로세스가 스스로 CPU를 OS에 양도(yield)하는 방식이다.
- OS는 trap을 통해 제어권을 얻는다.
- 특별한 yield() 시스템 콜을 제공하여 프로세스가 CPU를 포기하도록 유도한다.
- 단점: 프로세스가 잘못 동작할 수 있다.
- 프로세스가 trap을 전혀 발생시키지 않고 I/O도 하지 않는다면 CPU를 독점할 수 있다.
- 이럴 경우 유일한 해결방법은 재부팅 뿐이다.
- 따라서 현대 OS에서 협력적 멀티태스킹은 사용하지 않는다.
→ 옵션2) True Multi-tasking (선점형 멀티태스킹)
- OS가 주기적으로 CPU 제어권을 획득할 수 있다.
- 하드웨어가 일정 주기마다 인터럽트를 발생시킨다. (인터럽트 발생 → OS로 제어권이 넘어감)
- User Mode에서는 타이머 인터럽트 비활성화가 불가하다.
- 디스패처는 몇 번의 타이머 틱이 지났는지를 세서 time-slice(타임 슬라이스)를 결정한다.
- 즉, 정리하자면 하드웨어 타이머와 OS 디스패처가 협력해서 프로세스가 CPU를 독점하지 못하게 만들고, 여러 프로세스가 번갈아가며 공평하게 실행되도록 하는 방법이다.
→ 해답) 프로세스 제어 블록(PCB)에 정보를 저장해야 하는데, 저장해야 하는 것들은 다음과 같다.
- PID
- Process state
- Execution state
- Scheduling priority
- Accounting information
- Credentials
- Pointers to other allocated resources
- 즉, 컨텍스트 스위칭이란 "프로세스 A의 실행 정보를 PCB에 저장 → 프로세스 B의 정보를 PCB에서 복구 → B 실행" 과정이다.
'3-2 학기 > Operating Systems' 카테고리의 다른 글
| [운영체제] Multiprocessor Scheduling (0) | 2025.09.17 |
|---|---|
| [운영체제] Scheduling (0) | 2025.09.16 |
| [운영체제] Introduction to Operating Systems (0) | 2025.09.04 |
| [운영체제] xv6 구조 및 동작 원리 (0) | 2024.10.29 |
| [운영체제] Memory API (1) | 2024.10.14 |