운영체제(OSTEP)

OSTEP 6장

woohap 2024. 10. 10. 00:00
CPU 가상화 어떻게 구현 ??
-> CPU 시간을 나눠씀으로써 가상화를 구현 

CPU 가상화를 구현하기 위해 두 가지를 해결해야 함 
1. 성능 저하 // 과도한 오버헤드로 인한 성능 저하
2. 제어 문제 // 응용 프로그램이 컴퓨터를 마음대로 제어해서는 안 된다.

기본원리 : 제한적 직접 실행

프로그램을 CPU 상에서 직접 실행하는 것을 의미 
1. 프로세스 목록에 항목을 추가
2. 프로그램 메모리 할당
3. 메모리에 프로그램 탑재
4. argc/argv를 위한 스택 셋업
5. 레지스터 내용 삭제
6. call main() 실행 
                  main() 실행
                  main에서 return 명령어 실행
7. 프로세스 메모리 반환
8. 프로세스 목록에서 항목 제거 

** 몇 가지 문제점 존재
1. 응용 프로그램이 OS가 원치 않는 일을 하지 않는다는 것을 어떻게 보장하겠는가 
   // 사용자, 커널 모드
2. 어떻게 프로그램의 실행을 중단하고 다른 프로세스로 전환시킬 수 있는가      
   // 문맥교환 

시분할 기법을 어떻게 구현할 것인가 ?? // 정책 

문제점1 : 제한된 연산

직접 실행의 장점은 빠르게 실행 가능하는 것 
빠르지만 특수한 종류의 연산을 수행하길 원할 경우 어떻게 해야하는가 ??
Ex) 디스크 입출력이나 CPU 또는 메모리 같은 시스템 자원에 대한 추가할당 요청 등등 

사용자 모드와 커널 모드

프로세스를 사용자 모드에서 실행할 경우 데이터 입출력 같은 특권 모드에서 실행할 수 있는 명령어를 실행할 수 없다. 
또한 커널 메모리 영역에 직접 접근이 불가능하다.

이 경우 시스템 콜을 호출하여 특권 모드를 커널 모드로 전환하여 특권 명령어들을 실행한다. // 간접 접근
즉, 시스템은 시스템 콜을 통해 커널의 주요 기능을 제공한다.

**
프로세스가 커널 모드로 집입하는 방법은 인터럽트, 오류, 트랩 등이 있다.

사용자 모드 → 커널 모드

1. 인터럽트(하드웨어 인터럽트)
    // 비동기적
    - 외부 하드웨어 장치에서 인터럽트 발생 
    - CPU가 현재 작업을 중단하고 커널 모드로 전환
    - 인터럽트 핸들러 실행 후 필요한 경우 시스템 콜이나 커널 함수를 호출한다.
    ** 사용자 모드의 레지스터 값들을 커널 스택에 저장 // 리턴 주소 포함 

2. 트랩(소프트웨어 인터럽트)
    // 동기적
    - 응용 프로그램이 직접 코드에서 사용자 공간의 시스템 콜(래퍼 함수)를 요청한다. 

    - 트랩이 발생하여 CPU가 커널 모드로 전환된다.
    - 시스템 콜 핸들러를 실행하여 커널 영역의 시스템 콜 함수를 실행하여 처리
    ** 커널 모드의 레지스터 값들을 PCB에 저장

-   기타 내용
-   시스템 콜을 실행하기 위해 프로그램은 trap 특수 명령어를 실행해야 한다. 
    // trap은 소프트웨어 인터럽트 - trap을 발생시켜 특권 수준을 커널 모드로 상향 조정한다. 
- 필요한 명령을 수행 - 작업이 완료되면 return-from-trap 특수 명령어를 호출하여 
  특권 수준을 사용자 모드로 하향 조정

트랩은 어떻게 운영체제의 특정 부분을 실행하는가 ??

실행 프로세스가 주소를 알면 위험
커널은 임의의 코드를 실행하기 위해 접근 권한 검사가 끝난 후 분기해야 함

커널은 부팅 시 트랩 테이블을 만들고 이를 이용하여 시스템을 통제한다. 
// 부팅시 커널모드에서 동작
    - OS가 초기에 해당 작업을 수행 
      OS는 특정 명령어를 사용하여 하드웨어에게 트랩 핸들러의 위치를 알려준다. 
      하드웨어는 이런 정보를 기억하고 있다가 시스템 콜 같은 예외적인 사건이 발생하면 트랩 핸들러를 실행 
      // 트랩 테이블에는 특정 핸들러들이 들어있다.  시스템 콜 핸들러, 페이지 폴트 핸들러 등등 

**
프로세스는 커널 스택을 각자 가지고 있다. 
// 각 프로세스는 각자 가상 메모리를 가지고 있다. 
하드웨어에 의해 프로그램 카운터, 범용 레지스터 등의 레지스터가 저장된다 복원되는 용도로 사용된다.

문제점2: 프로세스 간 전환 (문맥교환)

문맥교환이란

운영체제 커널은 문맥 전환을 통해 멀티테스킹을 구현한다.
커널은 각 프로세스마다 컨텍스트를 유지한다.
컨텍스트는 커널이 선점된 프로세스를 다시 시작하기 위해 필요로 하는 상태이다.
    - 범용 레지스터, 프로그램 카운터, 사용자 스택, 커널 스택, 상태 레지스터, 
      페이지 테이블, 프로세스 테이블, 파일 테이블 같은 객체들 값들로 구성

커널이 실행할 프로세스 선택 - 스케줄 했다.
커널이 스케줄 한 후 현재 프로세스를 선점하는 것 - 문맥 교환 

**
스케줄러는 준비큐에 있는 구조체에서 프로세스 ID, 프로세스 우선순위, 
프로세스 상태, PCB 포인터 정보를 가져온다.

PintOS에서 PCB는 thread 구조체

문맥교환이 발생하는 경우

1. 하드웨어 인터럽트가 발생하는 경우
    타이머 인터럽트가 발생한 경우

2. 시스템 콜 호출 중 I/O 대기 상태 발생하는 경우 
    커널이 시스템 콜을 실행하고 있을 때 문맥 전환이 발생할 수 있다.
    Ex) read() 시스템 콜을 호출할 때, I/O가 발생하여 CPU가 유후상태가 될 수 있음
    그러므로 현재 프로세스를 실행 -> 대기 -> 차단 시키고 실행 가능한 다음 프로세스로 전환하기 위해 문맥교환 실행

3. 프로세스가 자발적으로 CPU를 양보하는 경우 
    스레드가 락이 걸린 공유자원에 접근하는 경우( 양보 후, blocked)

4. 프로세스 우선순위 변경이 발생하는 경우
    스케줄링 리스트에 현재 실행 중인 프로세스보다 우선순위가 더 높은 프로세스가 삽입된 경우 

5. 프로세스 종료 또는 종료 대기인 경우

문맥교환 자세히

1. 타이머 인터럽트가 발생하여 사용자 모드에서 커널 모드로 진입한다.

2. 커널 모드로 진입한 직후 실행 정보들(PC, SP, 상태 레지스터 값 등)을 커널 스택에 저장한다.

3. 커널 모드에서 인터럽트 핸들러가 실행되어 현재 프로세스의 영구 정보들
   (파일 디스크립터 주소, 페이지 테이블 주소, 커널 스택 주소, 프로세스 ID) 등이 저장된다.

4. 스케줄러가 다음 실행할 프로세스를 선택

5. 다음 프로세스 PCB에서 영구 정보들을 가져와 CPU에 적재합니다.

6. 커널 스택 포인터 값을 다음 실행할 커널 스택 포인터 값으로 변경 

7. 커널 스택에 저장된 실행 정보들(PC, SP, 상태 레지스터 값 등)을 CPU에 복구한다.

8. 특수 명령어를 실행하여, 커널 모드에서 사용자 모드로 전환한다.

9. PC에서 가리키는 다음 명령어를 실행하여 처리한다.

실행에 필요한 정보들 VS 영구적인 정보들

실행 정보들 
  - 사용자 프로그램의 실행 상태를 나타냄
  - 프로세스가 사용자 모드에서 실행될 때 사용하는 레지스터듸 값
  - 주로 일반 목적 레지스터들을 포함
    Ex) 프로그램 카운터(PC), 스택 포인터(SP), 상태 레지스터, 데이터 레지스터 등   
  - 사용자 프로그램이 직접 접근하고 사용할 수 있는 레지스터
  - 인터럽트 발생 시 해당 프로세스의 커널 스택에 저장됨

영구 정보들 
  - 운영체제의 실행 상태와 시스템 제어 정보를 포함
  - 운영체제 커널이 커널 모드에서 실행될 때 사용하는 레지스터 값
  - 커널의 실행 상태를 나타내는 레지스터들을 포함
    Ex) 커널 모드 스택 포인터, 페이지 테이블 베이스 레지스터, 인터럽트 상태 레지스터 등 
  - 일반 사용자 프로그램은 접근할 수 없으며, 오직 커널만 접근 가능합니다.
  - 문맥 교환 시 PCB에 저장된다.

프로세스와 스레드의 문맥교환

프로세스 문맥교환

프로세스의 경우 프로세스 간 문맥교환이므로 해당 프로세스를 실행하기 위한 모든 정보를  교환해야 한다.
  - 메모리 관리 정보(페이지 테이블 등)
  - 파일 디스크립터
  - 프로세스 상태
  - 모든 CPU 레지스터 값
  - I/O 상태 정보

스레드 문맥교환

스레드의 경우 프로세스의 자원을 공유하므로 필요한 스레드 상태 정보만 교환하면 된다.
  - 프로그램 카운터
  - 레지스터 값
  - 스택 포인터
  - 스레드 특정 데이터

스레드는 동일 프로그램 내에서 여러 작업을 병렬로 처리할 때 효과적

문맥교환 속도 차이

프로세스 보다 스레드 문맥교환이 속도가 더 빠르다.
  - 프로세스 문맥 교환은 밀리초 단위의 시간 필요.
  - 스레드 문맥 교환은 마이크로초 단위의 시간 필요.

'운영체제(OSTEP)' 카테고리의 다른 글

OSTEP 16장  (0) 2024.10.31
OSTEP 14장  (0) 2024.10.19
OSTEP 8장  (0) 2024.10.11
OSTEP 5장  (0) 2024.10.09
OSTEP 4장  (0) 2024.10.08