https://www.inflearn.com/course/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B3%B5%EB%A3%A1%EC%B1%85-%EC%A0%84%EA%B3%B5%EA%B0%95%EC%9D%98/dashboard
https://minkwon4.tistory.com/295
https://ryotta-205.tistory.com/89
https://m.blog.naver.com/PostView.naver?blogId=kistiscienceon&logNo=222722915536&navType=by
위 자료를 참고했다.
컴퓨터 시스템의 4요소
- 하드웨어, OS, 응용프로그램, 유저

커널이란?
- 운영체제의 핵심 부분으로서, 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 함
- 인터페이스로써 응용 프로그램 수행에 필요한 여러가지 서비스를 제공하고, 여러가지 하드웨어(CPU, 메모리) 등의 리소스를 관리하는 역할 수행

전통적 컴퓨터 시스템의 구성 요소
- 하나 혹은 그 이상의 CPU(Central Processing Unit)를 가짐
- 여러 Device controller들은 공통된 bus를 통해 연결됨

Bootstrap 프로그램이란?
- 부팅용 프로그램 (ROM에 저장되어있음)
- 컴퓨터가 power on되자 마자 메모리에 운영체제 프로그램을 로딩하는 역할 수행
- 그 다음에 OS가 나머지 응용 프로그램들 관리하는 것

Interrupt란?
- CPU와 I/O device의 소통 방식(?)
- CPU에서 Instruction을 fetch하고 execute하는 것을 반복하는데, IO가 발생했을 때 (키보드 입력 등) 이를 CPU에 알리는 역할을 함
- 하드웨어가 언제든지 interrupt를 trigger시킬 수 있음
- System bus를 통해 CPU에 signal을 보냄
- 이후에 CPU가 이를 처리하게 되는 것


Von Neumann Architecture란?
- CPU가 메모리에서 instruction을 fetch하고 execute하는 과정(그런 사이클..)을 가능하게 하는 구조
- cf) ISA (Instruction Set Architecture)
- IR(Instruction Register): Instruction을 저장하는 레지스터


Storage System
- 여러 hierarchy로 구성됨
- Access time
- Capacity와 Access time 간 trade off 존재 (비용,,)

I/O Structure
아래 그림에서 thread of execution이란, 실행흐름으로 이해하면 됨
- Cache memory와 main memory, CPU, device간의 상호작용에 주목
- 여기서 DMA란, Direct Memory Access의 약자로, device가 바로 메모리에 접근하는 것을 말함
- 특정한 HW 시스템(Hard-disk, GPU 등)이 CPU와 독립적으로 주 시스템 메모리(RAM)에 Access 할 수 있도록 하는 컴퓨티 시스템의 기능

사실상 지금 커널은 안정화된 상태여서 Device와의 상호작용을 담당하는 게 요즘의 운영체제의 역할
Computer System Components
CPU
Processor
- 하나 혹은 그 이상의 CPU를 갖는 물리적 칩
Core
- CPU 의 back computation unit
SMP (Symmetric multiprocessing)
- 현재의 가장 흔한 multiprocessor system (CPU마다 하는 일이 같음)
- 여러 CPU가 하나의 메모리에 접근해 task수행
Cf. Asymmetric multiprocessing
- 각 프로세서는 특정 태스크를 위해 배정됨 -> 예전 시스템에 해당. 요즘은 다 SMP
Multi-core design
- CPU 자체를 여러 개 하기엔 비용이 많이 드니, CPU 하나 칩 안에 코어를 여러 개 두자
- 같은 프로세서 칩 안에 여러 개의 코어를 두는 것
- 그러한 프로세서 칩이 많이 붙어있으면 Multi Processor라고 함

Multi-Programming
- 한번에 여러 프로그램을 실행하는 것
- "동시에" 메모리에서 여러 프로세스를 올림
- CPU의 사용 효율을 높임

Multi-Tasking. Multi-Processing
- multi programming의 논리적 확장
- CPU time 나눠 여러 프로세스가 사용
- 하나의 CPU 실행속도가 매우 빠를 때 여러 job들을 switching하며 수행할 수 있음
- time sharing. job switching
- Concurrency
- Parallelism
- CPU Scheduling 필요
- RAM에 여러 프로세스가 존재하는 데 CPU가 특정 프로세스를 끝냈을 때, 어떤 프로세스를 CPU에 스케쥴링해줄 것인가
- 어떻게 스케쥴링했을 때 CPU 효율이 가장 좋아질 것인가

Operation mode (User mode, Kernel mode)
- System Crash 방지, 즉 다른 프로그램에 방해되지 않도록 방어하는 역할도 운영체제가 해야 함
- 그림에서 볼 수 있다시피, User mode(User Process)에서는 System call을 OS에 호출하고, 그 System call을 Kernel모드에서 처리 후 그 결과를 User process에 반환해줌
- 즉, 커널 모드에서만 할 수 있는 게 있다는 것
- User process는 직접적으로 하드웨어 제어를 하지 못함

Virtualization
- single computer가 있을 때, 즉 하드웨어의 제한이 있음에도 불구하고 여러 개의 OS를 돌릴 수 있게 하는 것
- VMM은 Virtual Machine Monitor
- VMM 종류
- VMware, XEN, WSL ...


Variety of Computing Environments
요즘 운영체제의 이슈는 위 Environment들을 어떻게 잘 반영할 것인가가 핵심
운영체제의 역할
즉, 운영체제의 역할은 프로그램의 실행 환경을 제공하는 것
- User interface
- Program execution
- I/O operation
- File-system manipulation
- Communications
- Error detection
- Resource allocation
- Logging
- Protection and security등..
process, thread, multiprocessing, synchronization, deadlock, CPU scheduling, virtual memory 등등에 대해 배우게 될 것
View of Operating System services

OS에 User가 interface하기 위한 방법
CLI
- command line interface / command interpreter
- shell로 잘 알려짐
- sh, bash, csh, tcsh, zsh ...
GUI
- graphical user interface
- Windows, Aqua for MacOS, KDE/GNOME for Linux ...
Touch-Screen Interface
- Android UI, iPhone UI ...
Application이 하드웨어에 interface하기 위한 방법
System Call
- OS에 의해 제공됨 (Read, Write 등..)


API (Application Programming Interface)
- 운영체제와 응용프로그램 사이의 통신에 사용되는 언어나 메시지 형식
- 즉, OS에 의한 API가 System Call이라 이해하면 됨
- 요즘은 의미 확장됨. 라이브러리 등..
참고) printf 함수의 처리 방식

Windows와 UNIX system call 예시
