[OS] 4. Limited Direct Execution

Date:     Updated:

카테고리:

태그:

How to efficiently virtualize the CPU with control?

OS는 physical CPU를 time sharing 을 통해 나누는 것을 필요로한다.

성능 - 어떻게 시스템에 과도한 overhead 추가 없이 가상화를 할 수 있을까?
컨트롤 - 어떻게 실행중인 프로세스에서 효과적으로 CPU 컨트롤을 회수할 수 있을까?

Direct Execution

제한없이 프로그램을 실행시키는 것은 OS를 라이브러리처럼만 사용하는것임.

Problem 1: Restricted Operation

프로세스가 아래와 같은 제한된 operation을 수행하기를 원한다면??

  1. 디스크에 직접 하드웨어를 다루는 operation인 입출력 연산 요청
  2. CPU나 memory 같은 자원을 과도하게 많이 사용
  • Solution : control transfer 방법을 적용시킨다.
    • User mode : 어필리케이션이 하드웨어 자원에 대해서는 완전히 모든 접근을 못한다
    • Kernel mode : OS가 하드웨어나 자원에 완전한 접근을 하게 해준다

System Call

어떤 자원을 접근할 때 직접하는 것이 아니라 Kernel에게 아래와 같은 부분을 수행하도록 함

  • file system 접근
  • 프로세스 생성 제거
  • 다른 프로세스와 소통
  • 메모리할당

Trap instruction

  • kernel로 들어간다.
  • 커널모드로 우선순위가 올라간다

Return-from-trap instrution

  • User로 돌아간다
  • 우선순위를 다시 User mode로 낮춘다

하드웨어에서 interrupt가 발생하게 되면 Trap이 실행된다. 하지만 Trap 실행시에 OS 내에서 어떤 코드를 실행할지 알 수 없다.

  • trap table : interrupt 발생시 실행할 코드의 주소가 적혀있음
  • trap handler: trap instruction 수행시 실행되는 코드

System-call number

  • 각 시스템콜마다 번호가 할당되어있음
  • 시스템콜 number는 레지스터에 저장되어있음

System Call Handling

User level → Kernel level → Hardware

Problem 2 : Switching Between Processes (단일 X, 여러 프로세스)

어떻게 OS가 변경하는 프로세스 사이에서 CPU컨트롤을 회수할 수 있을까?

  • A cooperative Approach : 시스템콜을 기다린다
  • A Non-Cooperative Approach : OS 자체가 컨트롤을 회수한다

A cooperative Approach : Wait for system calls

프로세스는 yield 같은 시스템콜을 통해 일시적으로 CPU를 포기한다.

  • OS는 다른 업무를 실행한다.
  • 불법적인 것을 실행할때 OS는 컨트롤을 바꿀수 있다
    • Divide by zero
    • 허용되지 않은 메모리에 접근

A Non-Cooperative Approach: OS Takes Control

A timer interrupt 발생시 OS가 CPU controler를 회수할 수 있다

  • boot sequence동안 OS는 타이머를 시작한다
  • 타이머는 ms마다 타이머 interrupt 발생

interrupt 발생하면

  • 현재 실행중인 프로세스 중지
  • 프로그램의 상태를 저장
  • 기존의 인터럽트 핸들러 실행

timer interrupt는 OS에게 CU를 다시 실행시킬 권한을 부여

timer가 필요한 이유 CPU control하려는 이유는 뭘까

멀티 프로세스를 CPU 가상화를 통해 동작시키려면 CPU control이 필요하다

Saving and Restoring Context

Context를 저장하고 불러오는 것은 Scheduler 가 결정을한다:

  • 현재 프로세스를 계속 실행할지 다른 것으로 바꿀지
  • 만약 다른것으로 바꾼다면 OS는 Context switch를 실행한다.

Context Switch

어셈블리 코드라 low-level이다

  • 현재 프로세스의 레지스터 값(PC, stack pointer, etc)들을 Kernel stack에 저장
  • 다음으로 실행할 프로세스를 Kernel stack으로 부터 불러온다
  • Switch 한다

Worried About Concurrency?

interrupt 혹은 trap handling중에 다른 interrupt가 발생하면 어떻게 할까?

OS는 다음과 같이 동작한다.

  • 해당 interrupt를 무시한다.
  • locking schemes를 활용해서 동시에 접근하려고 하는 부분은 보호를 한다

맨 위로 이동하기

OS 카테고리 내 다른 글 보러가기

댓글남기기