KKanging

[운영체제] 제한적 직접 실행 원리 본문

cs/운영체제

[운영체제] 제한적 직접 실행 원리

천방지축 개발자 2024. 4. 29. 19:26

핵심 질문

가상화를 위해서 os 가 하드웨어의 제어를 직접 한다면 효율이 매우 좋지 않을것

하지만 제어는 os에서만 하면 되기에 쉬울 것이다.

문제점 1 : 제한된 연산

제한되지 않은 직접 실행

프로그램이 CPU의 제어를 직접 얻는다면 성능이 좋을 것이다.

하지만 여기서 문제가 생긴다
프로그램은 과연 신뢰할 만한 프로그램인가?

프로그램이 CPU 같은 하드웨어를 직접 제어한다는 것은 너무 위험하다
그렇다고 모든 제어를 운영체제가 부담한다면 Performance 측면에서 효율이 나지 않는다.

여기서 운영체제는 새로운 개념이 도입 된다.

제한된 연산

일단 하드웨어의 제어를 일단 프로그램에게 양도한다.

하지만 특정 영역에서는 프로그램이 직접 제어 못하는 영역을 분리한다.

User mode : 프로세스가 하드웨어를 제어할 수 있는 일이 제한된 영역
Kernel mode : 모든 종류의 동작을 할 수 있다.

User mode 에서 금지된 일을 시도하면 -> 트랩을 발생한다.
일반 사용자가 커널 모드의 기능을 사용하고 싶다면 -> 시스템 호출을 한다.

User mode 에서 금지된 명령은?

IO 작업
프로세스 생성 및 삭제

....

프로세스가 금지된 작업을 하고 싶을 때는 

하드웨어가 제공하는 System call 을 요청한다.(운영체제로 트랩 한다)

하드웨어는  kenel stack 에 프로세스의 레지와 pc를 저장한다
그리고 커널 모드로 이동한다. 트랩 핸들러로 분기한다.

그리고 커널 모드의 운영체제는 프로세스 제어권을 얻고 sysCall 임무를 수행하고
return-from-trap 을 호출한다.

하드웨어는 커널 스택으로부터 레지스터를 복원한다.
사용자 모드로 이동한다.
트랩 이후에 pc 로 이동한다.

System Call 실행

System Call 을 User mode 의 프로세스가 실행한다면
사용자 레지스터 정보를 커널 스택에 저장한다.

특권 수준을 커널 모드로 상향 조정하고 커널 안으로 분기한다

그리고 Return-from-trap 을 실행하면
커널 스택의 레지스터 정보를 팝한다
사용자 프로세스로 리턴을 한다

트랩 처리 기법

트랩 테이블을 사용해서 트랩 종류에 따라 어떤 코드가 실행될 지 정해 놓는다.
-> 테이블의 각 항목은 트랩 핸들러로 이동하는 분기 명령이다.

트랩 핸들러는 : 트랩을 발생시킨 각 원인을 처리하는 코드이다

트랩 테이블은 부팅 시 초기화 된다.

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

자 User Mode 를 만들어서 특정 요청을 제외한 요청을 프로세스가 직접 하드웨어를
제어하게 함으로써 성능을 높였다.

하지만 User Mode 는 os 가 관리하지 않는다.
그렇다는건 User Mode 가 너무 오래 CPU를 점유하고 있다면 ? 

이럴때 OS 는 어떻게 프로세스를 제어할 것인가

협조 방식

프로세스가 수행하는 중간 중간에 주기적으로 시스템 호출을 사용하거나
비정상적 행위로 트랩이 발생하면 OS로 제어권이 넘어 올 것이다.

그렇게 프로세스가 협조적일 거라 생각하는 OS는 너무 위험 할 것이다.

비협조 방식

프로세스에 Timer 를 달고

정해진 시간 마다 인터럽트가 발생하도록 한다
CPU는 트랩 핸들러에 정의 된 인터럽트 핸들러가 이에 맞는 과정을 거친다.

CPU는 보통 인터럽트 핸들러의 행동은 커널 모드로 진입하게 한다.

그렇게 해서 제어가 OS로 넘어가게 한다.

 

Context Switch

지금 Running 상태인 프로세스는 ?

CPU에 레지스터와 PC에 올라가서 연산을 하고 있을 것

Context Switch는 이런 CPU에 상태(Context)를 다음 실행할 프로세스의 상태(Context)로 바꾸는
작업

 

 

동시성 문제가 생긴다면 ?

동시성 문제가 생긴다면?

인터럽트 금지
락
...

[보충]

각 프로세스의 상태는 PCB에 저장되는 프로세스의 상태 값이다
이는 OS 가 프로세스를 구분 짓기 위한 상태일 뿐이다.

Ready 상태에 있는 프로세스는 스케줄러의 스케줄 대상이다.

Running 상태에 있는 프로세스라도 무조건 User mode 에 있는 건 아니다
대체로 User mode 에 있다.

+ 
커널 스택은 커널 메모리 영역에 존재한다.
프로세스 당 하나의 커널 스택 영역을 할당 받고

프로그램이 실행되면서 할당되는 메모리는 프로그램 메모리 영역이고 
프로세스당 개별적으로 할당 받는다
거기서 커널 메모리 영역은 공동으로 사용되는 메모리 영역이 존재한다.

=> 모든 os 에서 지원하는 방법은 아니고 대체로 CISC 에서 많이 사용된다.