본문 바로가기
3-2 학기/Operating Systems

[운영체제] Limited Direct Execution

by bona.com 2025. 9. 13.

Limited Direct Execution

CPU의 성능을 높일 수 있는 방법으로는 무엇이 있을까?

 

프로그램을 CPU 상에서 직접 실행(Direct Execution)하는 것이다.

  • 의미: 사용자 프로세스를 운영체제가 하드웨어 위에서 직접 실행하게 하는 방식
  • 방법: OS가 프로세스를 생성한 뒤 그 시작 지점(ex: main() 함수)으로 제어를 넘겨준다.

그러나, 이런 직접 실행에 문제점이 있다.

  1. 제한된 동작을 할 수 있다는 것
  2. 프로세스가 무한히 실행될 수 있다는 것
  3. 느린 동작을 할 수 있다는 것

이를 해결하기 위한 방법으로 제한된 직접 실행(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를 독점하지 못하게 만들고, 여러 프로세스가 번갈아가며 공평하게 실행되도록 하는 방법이다.

 

질문2) 컨텍스트 스위칭 시 어떤 정보를 저장해야 하는가?

 

해답) 프로세스 제어 블록(PCB)에 정보를 저장해야 하는데, 저장해야 하는 것들은 다음과 같다.

  • PID
  • Process state
  • Execution state
  • Scheduling priority
  • Accounting information
  • Credentials
  • Pointers to other allocated resources
  • 즉, 컨텍스트 스위칭이란 "프로세스 A의 실행 정보를 PCB에 저장 → 프로세스 B의 정보를 PCB에서 복구 → B 실행" 과정이다.