OS 아키텍처(2)✨

‍서지오·2024년 3월 3일
0

운영체제

목록 보기
3/3

이 글을 한국외국어대학교 이윤석 교수님의 운영체제 수업을 스스로 복기하고자 작성한 글 입니다.

Privileged Instructions(특권 명령어)

  • OS만 할 수 있는 명령어들을 의미한다.
  • 종류
    1. IO 장치에 직접 접근하는 명령어
    2. 메모리 관리하는 명령어
      1. page table pointer
      2. TLB
    3. 시스템 register 수정 명령어
    4. CPU mode bit 수정
      1. cpu안에 mode를 나타내는 field를 둬서 현재 mode가 os인지 user인지 판단한다.
    5. Halt(프로그램 종료) 명령
    6. Timer 세팅 명령
  • OS와 User를 분리할 수 있다. ⇒ for Protection

Cpu modes of Operation

  • User mode와 Kernel(Supervisor) mode로 구분한다.
  • OS는 kernel mode에서만 동작한다.
    • 모든 자원에 접근 가능
    • Privileged Instruction 수행 가능
  • 하드웨어 안에 mode bit를 통해 user와 kernel 모드 지정
    • trap 명령(System call) 실행 시 user mode를 kernel mode로 변경한다.
    • RTI(return from interrupt) 시 kernel mode에서 user mode로 변
  • Cpu architectur마다 privilege mode를 내부적으로 구분한다.

Crossing Protection Boundary

  • User mode와 Kernel mode 사이의 경계를 Protection Boundary라고 부른다.
  • Protection을 위해 user process에서 kernel 모드로 진입하려면 trap이라는 interrupt의 형태로만 가능하도록 설계하였다.

System call

  • user process가 privileged operation을 필요로 하다면 os에게 요청하는 데 이를 system call을 호출한다고 부른다(사실 user mode에서는 wrapper function을 호출)

  • OS가 제공하는 서비스를 호출하는 프로그래밍 인터페이스(함수)

  • 실제 System call routine은 OS code안에 존재한다.

  • user mode에서 불리지만 실제 동작은 kernel mode에서 수행된다.

  • OS마다 상이하다.

  • trap이라는 명령어를 사용하여 user mode ⇒ kernel mode로 전환한다.

  • 개발자가 직접적으로 system call을 부르기보다는 library(api)들을 통해 system call을 주로 부른다.

    • printf : 마지막에 sys call 중 하나 인 write()를 호출
  • Wrapper Library(Function)

    • 유저 모드에서 시스템 콜(os가 지니고 있는 실제 서비스 코드)을 부르기 전에 사용하는 함수
    • 마지막에는 항상 trap을 호출
  • System call 동작 과정

    1. user mode에서 wrapper library를 호출(kernel mode로 전환)
    2. trap안에 있는 실행할 system call number 확인
    3. OS code안에 있는 일치하는 system call 수행
    4. 다시 user mode로 전환(return from interrupt)

Implementing System calls

  1. api의 파라미터들을 stack 저장
  2. wrapper libray(function) 호출
  3. 호출할 sys call 번호를 지정된 register에 입력
  4. trap 발생(제어권을 kernel에 넘김)

  1. code 담겨져 있는 sys call num을 보고 올바른 handler를 호출, 이를 Dispatch라고 한다.
  2. Handler가 syscall 처리

  1. 다시 유저 모드로 전환(return from interrupt)
  2. 스택에 저장된 api 파라미터를 제거(Increment SP)

Typical OS Structure

  • System Call Interface
    • kernel 영역 젤 위에 존재
    • sys call을 확인하고 이에 해당하는 handler 호출
  • Kernel
    • handler를 제외하고도 file system과 같은 여러 기능들을 지닌다.
  • Arch-dependent kernel code
    • 하드웨어에 종속적인 부분(ex. 인터럽트 처리)

Reducing System call Overhead

  • sys call을 호출하면 protection boundary crossing이 일어나고 context swtiching(현재 cpu 상태를 저장)과 같은 여러 작업들을 수행하기 때문에 overhead가 크다.
    • 이러한 overhead 발생에도 불구하고 user와 kernel을 분리하는 이유는 os를 보호하기 위해서 이다.(ex. os가 trap 발생 시 올바른 trap인지 확인 후 동작)
  • 이러한 overhead를 줄이기 위한 방법
    1. sys call의 결과를 cache에 저장(caching)
      • getpid로 얻어온 프로세스 아이디를 캐시에 저장해
    2. buffering operation 사용(바이트마다 sys call을 호출하는 게 아니라 buffer만큼 읽거나 쓴 후 sys call을 한 번만 호출)
      • open ⇒ fopen
      • read ⇒ fread
      • write ⇒ fwrite

OS Structure

  • OS 또한 Software이다.
    • main 함수가 존재(컴퓨터 부팅 시 호출됨)
    • 자원 사용
    • 오류가 발생할 수 있다.
  • 다만 OS는 매우 정교한 sw이다.
    • 이벤트 당 쓰레드를 생성하여 이를 처리하고 여러 쓰레드들이 동시에 수행된다. ⇒ 동시성이 매우 정교하게 처리됨
    • 단순 함수 호출이 아닌 trap이라는 interrupt를 통해 사용 가능하다.
    • 컴퓨터를 종료하지 않는 이상 OS가 종료되지 않는다.
    • 모든 명령을 수행할 수 있다.

How to start the OS?

  1. 아주 간단한 프로그램이 read-only 메모리에 미리 로딩되어 있다.(BIOS)
    1. Firmware : 하드웨어에 탑재되어 있는 프로그램
  2. CPU가 BIOS를 실행
  3. BIOS 실행 시 OS를 로딩하는 MBR(Master Boot Record)을 로딩한다.
    1. 실제 OS kernel이 존재하는 메모리 주소로 분기
    2. OS의 small version(MBR)이 big version(Kernel)을 호출
💡 OS를 호출하는 데 있어 굳이 두 단계를 거치는 이유는 OS마다 file system이 다른데 **BIOS가 OS의 file system의 구조를 몰라도 되게 하기 위해서** 이다. ⇒ MBR이 호출할 OS의 file system 구조를 이해한 채 big OS 호출

What does the OS do & Control Flow?

  • 평소 idel(infinite) loop을 돌며 존재
    • 시스템 관리
    • 저전력 모드 관리
  • OS가 깨어남
    • interrupt가 발생 시(from Hardware Devices)
    • trap 발생 시(from User Program)
    • exception 발생 시(from User Program)

OS Structure

  • Monolithic Structure

    • 모든 기능들이 한 몸에 들어있다.
    • 어느 한 곳에 버그가 있으면 os 전체에 파급효과를 미친다.
    • 모듈을 function call 방식으로 호출했다.
      • 모듈간 communication의 비용이 적다.
  • Layered Structure

    • 기능을 layer 별로 구분
      • 초기 layer를 정의하는 게 어렵다.
    • 각 layer는 바로 밑에 있는 layer만 사용 가능하다.
    • Machine dependent(기계어와 관련 있는 부분)
      • context switching 담당
      • trap 관련 기능 담당
  • Microkernel Structure

    • kernel의 기능을 줄이고(small kernel) 대부분의 기능을 user space로 분리
    • 하나의 기능(모듈)에 문제가 생겨도 다른 기능에 영향을 주지 않는다.
    • 모듈간의 통신을 위해 os를 매개로 하여 messsage passing 방식을 사용한다.
      • communication에 대한 비용이 발생한다.
      • 현재는 하드웨어가 발전하여 비용이 적다.
    • 특징
      • 확장성이 높다.
      • 안정성이 높다.
  • Module

    • 독립적으로 개발되고 관리되는 sw 단위
    • layer와 비슷하지만 좀더 유연하다.
    • 객체 지향 접근을 사용한다.
      • 은닉화(사용자들이 open 된 것들만 사용가능)

Virtual Machine

  • 하드웨어 위에 독립된 sw 형태의 가상 머신을 제공하는 것
    • 하나의 컴퓨터에서 여러 개의 os를 사용 가능케 해준다.
  • Hypervisor : virtual machine을 생성하는 layer
    • hypervisor와 virtual machine을 구분해야 한다.
    • vm ware, virtual box 등은 hypervisor이지 vm이 아니다.
  • vm의 등장으로 kernel 개발이 유용해졌다.
    • 하나의 kernel에 문제가 생겨도 문제가 다른 vm에 영향을 미치지 않는다.
    • 발생한 문제를 밑에 layer에서 catch 할 수 있다.
profile
백엔드 개발자를 꿈꾸는 학생입니다!

0개의 댓글