이 글은 포스텍 박찬익 교수님의 운영체제(CSED312) 강의를 기반으로 재구성한 것입니다.
이 글에서는 Operating System의 대략적인 그림을 살펴본다.
OS를 위한 하드웨어 기술
Bootstrapping
bootstrap은 OS의 실행 준비를 뜻하며 아래 4가지 과정을 거친다.
- power on : physical memory의 defined address로 jump (ROM의 bootstrap code - BIOS -로 간다.)
- disk 내의 bootloader를 physical memory로 복사한다.
- disk 내의 kernel을 bootloader가 physical memory로 복사한다.
- 이후에는 OS가 각 app을 찾아 memory에 load한다.
- 이 과정은 disk에서 app을 찾고, memory allocate, load into memory, CPU 실행 4단계로 이루어진다.
Control Flow와 Exception
Exceptional Control Flow 포스팅에 기술했듯 일반적 control flow는 jump/branch 또는 stack에서 진행되는 call/return으로 나뉘며, program state에 반응해 바뀌는 일반적인 실행이다.
반면 system state에 반응해야 할 때는 exception을 사용하며 exception 발생 시 exception handler로 control flow가 넘어간다. 이 때 exception number를 사용해 어떤 exception인지 식별하고, exception handler를 사용해 해당 exception을 수정한다.
Exception
Exception은 크게 Synchronous와 Asynchronous 2가지로 나뉜다.
- Asychronous exception은 I/O interrupt 등 processor 바깥에서 오는 event에 의해 발생한다. (clock cycle과 무관) interrupt라고도 한다.
- Synchronous exception은 instruction 실행 중에 발생한다. (clock cycle과 동기화) trap이라고도 한다.
대분류 | 중분류 | 완료 후 동작 | 예시 |
Asynchronous (비동기) 명령어 실행과 관계없음 |
Interrupt | next instruction으로 복귀 | timer interrupt, I/O interrupt |
next instruction으로 복귀 | 사용자가 직접 보냄. SIGINT 등. | ||
Synchronous (동기) 명령어 실행 중 발생 |
Trap | next instruction으로 복귀 | system call |
Fault | current instruction으로 복귀 또는 프로그램 종료 | page fault, protection fault, floating point exception | |
Abort | 프로그램 종료 | parity error, machine check |
Exception 발생 시 일어나는 일
위 그림과 같이 exception이 발생하면 해당 exception handler로 control flow가 넘어간다. 이 때 user mode에서 kernel mode로 context switch가 일어나기 때문에 아래 과정을 거친다.
- register, return address 등 현재 system state 저장
- 어떤 exception이 발생했는지 판별
- 해당 exception handler로 jump
Dual Mode
CPU 실행은 user mode와 kernel mode 2가지가 있다. user는 kernel에 접근할 수 없지만 kernel은 user에 접근할 수 있다.
- kernel mode : full privilege가 있기 때문에 모든 memory에 read/write, 모든 I/O device에 접근, 모든 network에 접근할 수 있다.
- user mode : 제한된 privilege가 있다. OS kernel이 허용한 기능만 사용할 수 있다.
이 때 user stack와 kernel stack은 따로 존재하며 exception handler은 kernel memory에서 수행된다. 여기에는 아래 2가지 이유가 있다.
- exception이 발생하면 해당 exception handler로 가는데, 사용자가 해당 exception handler를 수정하거나 jump뛰는 위치를 수정하면 exception이 다르게 적용되기 때문이며, user code가 kernel code를 오염시킬 수 있기 때문이다.
- exception을 user mode에서 처리하면 handler의 형태가 바뀌기 때문에 app들끼리 같은 exception handler를 사용하지 않기 때문에 필요한 데이터가 모두 반영되지 않기 때문이다.
컴퓨터가 켜 질 때는 kernel mode로 실행되었다가 이후 user mode로 control flow을 바꾼다. 이렇게 프로그램을 실행하던 중 I/O interrupt와 같은 asynchronous exception 또는 system call이나 fault같은 synchronous exception이 발생하면 kernel mode로 다시 control flow가 이동한다.
Operating System이란?
OS는 하드웨어와 소프트웨어 사이의 interface이며 service provider의 역할과 resource manager의 역할을 수행한다. 이 때 프로그램을 효율적으로 돌리는 것과 사용자 친화적인 시스템은 tradeoff 관계에 있다.
- service provider
- 하드웨어를 abstraction해서 사용하기 편하게 만들어 준다. 프로그램 실행, I/O 동작, file system 등 standard library를 abstraction해서 사용자에게 제공한다.
- CPU는 process나 thread로, memory는 address space로, disk는 file로 abstract한다.
- resource manager
- physical resource와 접근 권한 및 방법을 관리한다.
- 여러 app의 동시 작업이 가능하게 한다. (memory concurrency, protection, ...)
- 각 app을 격리해 상호 간의 data 접근을 막아준다.
- resource에 대한 접근을 효율적인 접근, 공평한 접근을 제공한다.
OS의 구조
OS를 사용하면 concurrency, performance, portability, backward compatibility(하위호환성), reliability, availability, security, privacy 등 많은 것을 고려해야 한다. 이것을 구현하기 위해 abstraction과 modularity를 사용한다.
구조는 크게 아래 4가지가 있다.
monolitic kernel
- 1개의 kernel에 모든 것을 관리하는 방식이다.
- 장점으로는 component 사이의 interaction이 빠르고, 데이터 공유가 쉽다.
- 단점은 수정이 어렵고 하나가 터지면 전부 다 터지고, 사이즈가 점점 커지며, protection이 없다.
layered structure
- layer들끼리 interaction하는 방식이다.
- 장점으로는 small task에 집중할 수 있고, step별로 만들어갈 수 있다.
- 단점으로는 flexible하지 않고, real system은 hierarchy로 나타낼 수 없을 만큼 복잡하다. 또한 layer crossing(한 layer성능이 전체 성능에 영향을 미친다.) 때문에 성능이 나쁘다.
micro kernel
- kernel이 필수적인 기능만 가지게 최소화시키고 나머지는 user level process로 처리하는 방식이다.
- 장점은 small part에 집중하고, extension 및 customizing이 쉽다.
- 단점은 OS component의 interaction이 procedure call이 아니라 process 사이의 통신이 되어 버리기 때문에 느리다.
dynamic loadable module
- layered structure과 유사하지만 여기서는 module끼리 통신이 쉽다. 각 모듈이 분리되어 있기 때문에 flexible하다.
Virtual Machine
하드웨어 아래에 있는 layer에게 하드웨어와 동일한 interface를 제공하는 방식이고, 이 때문에 여러 process를 실행할 수 있게 된다. 즉 virtual machine은 identical하기 때문에 하나가 에러나서 터져도 나머지는 문제가 없다.
장점으로는 resource 분리로 인한 보안이 좋고, 하드웨어를 고려하지 않고 application만 만들어도 된다. 단점으로는 VM 사이의 직접적인 data share가 없기 때문에 비효율적이다. 최근에는 CICD와 클라우드 배포 등으로 많은 주목을 받고 있다.
Abstraction vs Virtualization
high level abstraction의 경우 low level의 구현(detail)을 숨긴다. 반면 virtualization의 경우 abstraction과 유사하지만 구현(detail)을 숨기는 것이 필수적이지 않다.
때문에 virtual machine은 하드웨어의 abstraction이 아니라 virtualization이다. 각 process가 하드웨어의 세부 구현을 직접 볼 수 있고 사용하기 때문이다.
잘못된 내용이나 지적, 오탈자 등은 언제나 환영합니다.
'CS > OS' 카테고리의 다른 글
[OS] Concurrency & Thread (0) | 2023.06.29 |
---|---|
[OS] Process (0) | 2023.06.26 |
[컴퓨터 SW] Dynamic Memory Allocation (0) | 2023.06.24 |
[컴퓨터 SW] Virtual Memory (0) | 2023.06.21 |
[컴퓨터 SW] System Level I/O (0) | 2023.06.20 |