Computer Science/Operating System

[OS] Limited Direct Execution

kyxxn 2024. 5. 1. 19:49
728x90

CPU 가상화를 하려면 시분할 기법을 사용해야 함.
시분할은 어떤 기준으로 ?

프로그램이 CPU를 직접 실행했을 때 문제점 2가지를 알아보자.

 

문제점 1: 제한된 연산

프로그램을 CPU에서 직접 실행시키면 빨리 동작하지만,
프로그램이 나쁜 짓을 하거나, CPU를 뺏어야 할때 등에 제약이 걸린다.

프로세스가 디스크에 대해 입출력하거나,
메모리 추가 할당을 요구하는 것을 제한하지 않으면, 운영체제는 무의미하게 된다.

이 때, 사용자 모드와, 커널 모드가 도입됨

User Mode

사용자 수준 레벨

  • 할 수 있는 일이 제한됨
    → I/O 작업 등이 금지
  • → 허용 범위 밖의 메모리 접근 금지
  • 금지된 일을 하면 프로세스가 제거됨

Kernel Mode

OS에서 중요한 코드들이 실행됨

  • 운영체제 모든 종류의 동작이 가능함

유저 레벨에서 커널 모드를 사용하고 싶다면, 시스템 콜을 해야 함

시스템 콜을 실행하기 위해서

trap 이라는 특수 명령어를 실행해야 함
트랩에 의해 mode bit를 조절한다.

  1. 프로세스가 I/O 작업을 요청함
  2. Trap을 하면, Mode bit가 1에서 0이 됨 (유저모드 → 커널모드)
  3. 그러면 커널모드에 진입하여 프로세스가 요청한 일들을 하게 됨
  4. 커널 모드는 운영체제의 모든 기능을 수행할 수 있음
  5. 커널 모드에서 작업이 완료되면 return-from-trap을 통해 Mode bit를 0에서 1로 한다.

Trap 명령어 사용 시 주의할 점

호출한 프로세스의 레지스터들을 커널 스택에 저장해야 함
또한, 각 프로세스 당 자기만의 커널 스택을 갖고 있음
Return-From-Trap 작업 때 제대로 리턴할 수 있게 하기 위해서이다.

저장된 정보는 pop()을 통해 사용자 모드에서 정보를 되찾게 된다.

Trap 사용 시

  • 현재 레지스터 정보는 커널 스택에 저장됨
  • Mode bit는 1→0
  • 커널 모드로 상향 조정됨
  • 커널 안으로 분기함

Return-From-Trap 사용 시

  • 커널 스택의 레지스터 정보를 팝 (pop)
  • Mode bit는 0→1
  • 유저 모드로 하향 조정됨
  • 유저 모드로 리턴함

트랩 발생 시 어디를 실행할 지를 어떻게 아는가 ?

커널은 부팅 시에 트랩 테이블을 생성함
컴퓨터가 부팅될 때 커널모드임. 이 때 하드웨어를 제어할 수 있는데,
OS는 하드웨어에게 이벤트 발생 시 어떤 코드를 실행하는지 알려줌

운영체제는 특정 명령어를 사용하여 하드웨어의 트랩 핸들러의 위치를 알려줌

이렇게 이벤트마다 어떤 일을 할 지 알려줌 (키보드 인터럽트, 하드디스크 인터럽트 ..)

트랩 발생 시, 커널 모드에서 트랩 테이블을 읽고

해당 트랩 핸들러에 의해 요청이 수행됨

문제점 2: 프로세스 간 전환

협조 방식: 시스템콜 기다리기

  • 프로세스가 합리적으로 행동할거라 신뢰함
  • 프로세스가 비정상적 행위를 하면 OS로 제어권이 넘어옴 (ex 런타임 에러)
  • OS는 시스템 호출 | 트랩을 처리해야 다음 작업할 프로세스를 결정함
  • yield()와 같이 시스템 콜을 자주 호출함

→ 만약 프로세스가 무한루프에 빠지면 ?

비협조 방식: OS 제어를 뺏어옴

  • 프로세스가 협조적이지 않은 경우 하드웨어 도움없이 OS는 아무것도 못함
    즉, 무한루프에서 빠져나오지 못함
  • 타이머 인터럽트를 통해 일정 시간이 지나면 인터럽트가 발생함
  • 인터럽트는 현재 수행중인 프로세스를 중단하고, OS의 인터럽트 핸들러가 실행됨

Context Switch: 문맥 전환

타이머 인터럽트, 스케줄러 수행.. 등을 통해
운영체제가 제어권을 다시 획득하면 ‘현재 실행 중인 프로세스를 계속 실행’,
’다른 프로세스로 전환’ 둘 중에 결정해야 함 → 이러한 결정은 스케줄러에 의해 결정됨

다른 프로세스로 전환하기로 결정되면 운영체제는 문맥 교환(Context Switch)를 함
PC, 범용 레지스터, 커널 스택 포인터.. 등이 저장됨

 

매우 자주 수행되므로, 빠르게 빠른 실행이 관건임

Return-From-Trap 명령어가 마지막으로 실행될 때,

현재 실행 중이던 프로세스로 리턴하는 것이 아니라, 다른 프로세스로 리턴해서 다시 시작할 수 있음

만약 인터럽트나 트랩 처리 중 다른 인터럽트가 발생하면?

인터럽트 금지

  • 인터럽트 핸들러 시작 시,
    다른 인터럽트 일시적으로 금지
  • 핸들러 종료 시 다시 활성화됨

  • 공유 자료에 대한 배타적 접근을 보장

결론

시분할 시스템의 성능 저하를 어떻게 해결하는가 ?

→ 효율적인 Context Switch가 필요함 (하드웨어 지원 필요)

문제점 2: 프로세스 간 전환

CPU 제어권 유지는 어떻게 하나 ?

→ 제한된 연산과 커널 모드 (문제점 1)

→ 타이머 인터럽트