🔗 운영체제 형태
- user interfaces
: user와 OS가 서로 상호 작용할 수 있도록 제공
ex) GUI, batch, command line 등
- system calls
: Application이 OS와 상호 작용하기 위한 유일한 방법
- services
: Applications request services to OS
🙋 사용자 관련 OS 서비스
User Interface
- CLI
: Command-Line Interface
ex) 터미널
- GUI
: Graphical User Interface
ex) Windows, Mac, 스마트폰 등
- batch
: 여러 프로그램을 미리 순서 정해놓고 일괄적으로 처리
프로그램 실행
I/O operations
File system 처리
네트워크 통신
- 프로세스간의 데이터 communication 포함
Error Detection
- 에러가 발생하면 이를 감지해서 조치를 취함
- 대부분의 OS는 에러가 발생하면 프로그램 종료
- ex) Bit-flip, memory error, power failure 등
🗝 효율성 관련 OS 서비스
Resource 할당
- CPU cycles, 메모리 공간, 메모리 bandwidth 등
Accounting
- 각각의 프로세스들이 리소스(CPU, 디스크 메모리 등)를 어느 정도 썼는지 추적
Protection & Security
- 하나의 프로세스가 리소스를 모두 사용하는 것을 방지
- 프로세스 간 간섭을 막아줌
" A system is as secure as its weakest link "
🎨 OS Design
Design 목표
- 사용자 관점
- 사용하기 쉽도록
- 배우기 쉽도록
- fast
- 쉽게 죽지 않도록 (reliable)
- 시스템 관점
- 구현하기 쉽도록
- 유지 보수하기 쉽도록 (version 업데이트 하기 편하게)
- 운영하기 쉽도록 (여러 대의 컴퓨터 운영하기 편하게)
- flexible & efficeint
- 고장에 대한 대비가 잘 되어있는지 (fault-tolerant)
가이드라인 : Mechanism & Policy
- Mechanism
: 기술적인 측면, 어떤 Policy에 대해 어떻게 실행할건지
- Policy
: 어떤 것을 하고 싶은 지에 대한 정책, 기술적인 것 x
Policy가 바뀔 것에 대비해서 Mechanism을 개발할 때는 파라미터화 하는 것이 중요!
(Separation of policy from mechanisms)
🧩 OS Implementation
Assembly language
- 장점
- difficult & tedious
- 에러가 생기기 쉬움
- 다른 환경의 컴퓨터에 돌리기 어려움 (difficult to port)
High-level language
- 장점
- 구현 시간이 빠름
- 코드가 간략하고 이해하기 쉬움
- 컴파일러가 발전하는만큼 한번 생성된 코드의 성능도 좋아짐
우선 high-level language로 코드를 짜고, 그 다음에 assembly language로 바꾸는 방법이 좋음
🗿 OS 구조
📍 Microkernel
: 핵심 기능만 kernel에 남기고, 나머지는 빼버린 최소화된 커널
(Monolithic 반대)
장점
- 다른 하드웨어에 port 하기 쉬움 (커널이 작기 때문에)
- 더 안전하고 reliable (커널이 작아서 공격 받을 부분도 적기 때문에)
단점
- 성능이 상대적으로 안좋음
(Monolithic에서는 request&response가 한 번씩만 일어나면 되는데, Microkernel에서는 여러번 일어나기 때문에)