Ch1. Introduction

What is an OS?

→ There is no one description.
Operating System:
하드웨어를 관리하는 프로그램.
컴퓨터 하드웨어와 컴퓨터 사용자 사이의 중개인 역할을 하는 프로그램.
애플리케이션에는 하드웨어를 관리하는 기능이 없다. 그래서 OS App 상호작용이 있는 것.
OS의 목표:
User program 실행
User problem을 더 쉽게 해결 (== 사용자의 컴퓨터 사용을 도움 == 컴퓨터 사용을 더 쉽게 만듦)
하드웨어를 더 효율적인 방식으로 사용
CPU, Memory, ... ⇒ 소중한 자원이다.
App은 메모리 관리 의무 X. HW 관리는 OS의 몫

Computer System

Four Computer System Components:
User, System/application programs, OS, Computer HW
오직 OS만이 하드웨어와 직접 소통할 수 있다.
OS는 하드웨어와 시스템, 애플리케이션 사이를 중개한다.

OS View Points

사용자 시점:
Home PC User : 주요 목표는 쉬운 사용이다. 리소스 활용은 사용자가 생각할 게 아니다.
OS는 User에게 있어 컴퓨터 편하게 쓰게 해 주는 도구일 뿐. 유저는 Memory, HW 등 신경쓰지 않는다.
시스템 시점:
Resource allocator : OS는 여러 프로그램들에게 리소스를 할당해 준다.
Resource : CPU, Memory, Storage, I/O Devices, ... 여러개의 Program 가동 중 → 각자 리소스 요구 → OS가 allocator 역할. 또한, 충돌하는 리소스 요청을 핸들링한다.
Control program
에러 방지(동시에 disk write 발생, 권한 관리 등)
컴퓨터의 부적절한 사용을 막음.

Definition of OS

OS는 느슨하게 정의된다.
Diverse HW, various purpose
"Everything a vendor ships when you order an OS"
== 어디까지가 OS의 일부인지 정의하기 어렵다.
OS = Kernel + System programs
Kernel : OS의 기본 알고리즘들을 구현해둔 로직. 우리는 커널에 집중할 것.

Computer System Organization

CPU : 연산 수행
입출력 장치 : 디스크, 모니터, 프린터, ... → Device controller에 의해 관리됨
Device controller에는 Disk Controller, USB Controller, Graphics adaptor 등이 있다.
Memory
CPUDevice controller는 병렬로 실행되고 있고, 둘 다 System bus (=Communication channel)로 Memory와 연결되어 있음
System bus를 공유하고 있는데, 충돌이 일어나면 어떻게 하는가? → Memory controller가 접근을 동기화한다.

Computer Operations

Start-up

Bootstrap program: 컴퓨터가 켜지면 가장 먼저 실행되는 프로그램. OS의 구동을 돕는 프로그램.
ROM, EEPROM에 Hard-wired로 저장됨
CPU Register, Device controllers, Memory 초기화
OS kernel 로드, kernel 시작
System daemons
커널 백그라운드에서 계속 돌아감
init 프로세스 바로 아래 위치. (init이 제일 첫 번째 프로세스이고, 이게 다른 daemon들을 시작시킴)

Interrupt

CPU에게 멈추고 interrupt handler를 실행하라고 보내는 event
Interrupt handler : 함수 하나 Interrupt vector : Interrupt handler 주소들의 배열
H/W interrupts
timer, keyboard, mouse moving, ... → System bus를 통해 전달됨 (Remind)
S/W interrupts
system call (깊게 안 볼 것)
Interrupt handling은 CPU의 주요 기능 중 하나. 반드시 빨라야 한다.
Interrupt된 instruction의 현재 주소와, register 상태를 저장해두어야 한다.

Interrupt Timeline

CPU는 두 가지 상태를 가진다.
User process executing
I/O interrupt processing
I/O device : 뭐 Disk같은 거라고 생각해보자
1.
I/O reqeust : Disk가 idle → transferring → idle. Disk에서 Memory로 데이터 가져온 것.
2.
Transfer done : I/O Interrupt 처리. Memory에서 CPU로 데이터 가져오기.
3.
이후 아무것도 안 하다가 (CPU는 계속 User process executing, I/O는 idle)
4.
I/O request Transfer done → idle → ... 반복.
I/O가 작업 중이더라도, CPU는 다른 작업을 할 수 있다. I/O 작업이 완료되면, 그제서야 인터럽트가 발생된다.

Storage Structure

모든 프로그램들은 실행되기 전에 (lw/sw instruction 등으로) 메모리에 로드되어야 한다.
'Memory' : 보통 RAM을 가리킴. 'Storage' : 보통 Disk drive를 가리킴. (Memory, register 모두 storage인 건 맞다.)
폰 노이만 아키텍처
인스트럭션과 데이터가 같은 메모리에 저장된다. (IM, DM이 나누어져있지 않음)
CPU는 Memory와 Single Channel로 연결된다.
Cache로 메모리 접근을 향상시킬 수 있다.
CPU
1 Channel이기에 단순하지만, 1 Channel이기에 접근 성능은 조금 나쁘다.
하버드 아키텍처
인스트럭션을 저장하는 메모리와, 데이터를 저장하는 메모리가 따로 있다. (IM, DM)
2 Channel로, 두 개의 분리된 메모리를 사용하기 때문에 더 복잡하다.
두 아키텍처는 서로 반대 관계인 것은 아니다.
Secondary storage : HDD, SSD, ...
메모리는 용량이 너무 작고, 휘발성이기 때문에, Secondary storage가 필요하다.
Storage device hierarchy
Remind: Memory Hierarchy: 위로 갈수록 빠르고, 비싸고, 휘발성. 아래로 갈수록 느리고, 싸고, 비휘발성.

I/O Structure

장치를 관리하는 것은 OS에서 중요한 부분이다.
Device controller
Remind: 모든 장치는 Device controller를 가지며, CPU는 이것들을 가지고 장치와 communicate한다. CPU와 Device controller는 공통된 bus를 통해 연결되어 있다.
OS는 어떻게 여러 장치를 핸들링하는가?
OS는 Device controller와 어떻게 상호작용해야 하는지 적혀있는 Device driver를 가지고 있다.
장치 제조사는 장치에 대한 Device driver를 소프트웨어 형태로 제공해야 한다.
Device driver 소프트웨어는 read, write와 같은 기능을 구현하는 함수의 집합이다.
I/O Operations = 인터럽트 기반 입출력
1.
CPU(OS)가 Device controller의 레지스터에 명령을 넣는다.
2.
Device driver가 Device controller의 레지스터 내용을 로드한다.
3.
Device controller가 레지스터 내용을 본다.
4.
Device controller가 데이터 송수신.
5.
Device controller가 데이터 송수신을 마치면, 인터럽트를 발생시킨다.
6.
Device driver는 OS에게 control을 돌려준다.
DMA 기반 입출력
DMA controller라는 별도의 장치를 통해 I/O 작업 (OS의 일부가 아니라, 별도의 장치이다.)
실제 CPU가 Control하는 건 DMA를 컨트롤하는 DMAC를 컨트롤하는 것

Computer System Architecture

Single-processor systems

하나의 general-purpose processor (현재 작업에 따라 달라짐) + 많은 special-purpose processors

Multiprocessor systems

2개 이상의 프로세서(CPU)로 구성된 하나의 시스템
왜? 하나의 프로세서로는 성능 개선의 한계가 있기 때문.
Throughput 증가 (Throughput: 단위시간 동안 얼마나 많은 일이 처리되는가)
프로세서 개수를 늘림으로써, 더 적은 시간에 더 많은 일을 할 수 있다.
그러나, N개의 CPU가 N배의 성능 향상을 의미하지는 않는다! CPU 개수가 증가해도 throughput도 log scale로 증가하다가 결국 어디론가 수렴한다.
Economy of scale
Single-processor system을 여러 개 두는 것보다 비용이 더 적다.
전원, 저장소 등을 여러 프로세서가 공유하기 때문에.
Increased reliability
하나의 프로세서가 고장나더라도 시스템이 멈추는 일은 없고, 속도만 느려진다.
Graceful degradation
더 많은 하드웨어 컴포넌트의 문제가 생길수록 동작 효율이나 속도가 점진적으로 감소한다.
Fault tolerance
여러 개의 하드웨어 컴포넌트 중 일부가 문제가 생기더라도, 전체 시스템의 불능 상태가 일어나지 않고 서비스를 제공.
Fault tolerance 시스템은 Graceful degradation 특징을 가진다.
멀티프로세서 시스템에는 두 가지 종류가 있다:

Asymmetric multiprocessing : Master and Slave

하나의 프로세서가 다른 프로세서와 Master-slave 관계.
Master 프로세스 하나는 전체 시스템 (다른 프로세스)를 control한다.
각 Slave 프로세스는 Master 프로세스에게 작업을 할당받아 명령을 수행.

Symmetric multiprocessing (SMP)

대칭적인 프로세싱 : 포지션별로 모두 같이 일을 함.
각 프로세서는 OS의 모든 작업을 같이 수행
모든 프로세서가 하나의 물리 메모리를 같이 공유함
UMA (Uniform memory access) : 어느 프로세서에서 어느 메모리에 접근하든 동일한 시간이 걸림.
NUMA (Non-UMA) : 메모리의 일부분이 다른 부분보다 접근이 더 오래 걸릴 수 있음.

Multicore system

하나의 프로세서 내에 여러 개의 코어가 들어있는 것
하나의 칩 내에서 커뮤니케이션 (정보 교환)이 훨씬 효율적.
CPU 2개 커뮤니케이션보다 CPU 1개 내의 두 개 코어끼리의 커뮤니케이션이 더 효율적임.
비용이 더 저렴하다.
전력소비가 더 적다. 더 낮은 파워를 사용할 수 있다.

OS Structure

OS는 프로그램이 실행될 환경을 제공한다.
OS의 주요 기능들: (각각 별도의 챕터에서 다룰 예정)
Multi-programming : 여러 개의 작업을 메모리에 유지
It does NOT mean 'programming' 'coding'; more like 'Multi-execution'
멀티프로그래밍의 목적 : CPU 효율성 증대 (To increase the CPU utilization)
CPU 효율성 : 리소스를 얼마나 사용하고 있는지에 대한 정보
ex) 메모리 4GB 중 2GB를 사용하고 있다면 → utilize 50%
즉, 우리는 CPU를 항상 바쁘게 유지시키려 한다. CPU가 idle인 것을 원하지 않는다.
어떻게 구현하는가?
Job scheduling from Job pool : "작업들이 로드되기를 기다리는 개념적 공간"
사용자가 수행하고 싶은 프로그램은 많은데, 메모리는 그만큼 충분하지 않다. 모든 프로그램이 한 번에 로드될 수 없으니, Job Pool에 대기시키고, Job switching을 통해 Memory에 로드된 프로그램 중 하나를 Job pool의 프로그램으로 대체하는 것.
Time sharing (Multitasking)
메모리에 로드된 프로그램들 사이의 교체(Switching)
빠른 교체 → 사용자 시각에서 더 interactive하게 보임. ex) 응답 시간이 짧으면 키 입력에 즉각 반응.
멀티프로그래밍과 더불어 매우 중요한 기능!
Process : 메모리에 로드된, 프로그램의 running instance.
Program : 단순한 instruction의 집합. 파일 하나.
프로세스는 프로그램과 더불어 추가적인 정보(메모리 사용, 권한, 언제 시작되었는지, ...)까지 저장하고 있다.
Process = Program + State. 프로그램은 단순한 instruction set이다.
(당연히) 하나의 프로그램이 여러 프로세스를 만들 수 있다.
여러 프로세스를 처리하면서 메모리가 부족한 경우 : Memory management
Swapping 또는 Virtual memory → CH8, 9

OS Operations

OS는 Interrupt driven하다.
인터럽트가 없다면, OS는 백그라운드에서 아무것도 하지 않는다.
Trap : User process의 exception
Trap은 Software interrupt 형태로 나타난다.
Div by zero, Invalid addr, Ctrl-C, Child process ended, ...
Interrupt Service Routine (ISR)
특정한 종류의 인터럽트를 핸들링하는, 커널 내부에 있는 함수의 집합
"이 인터럽트가 발생하면, 이렇게 처리해라"
Kernel mode vs. User mode
Kernel mode : Supervisor mode, System mode, Privileged mode
User mode : 커널 모드보다는 제한적
CPU는 현재 모드를 나타내기 위한 mode bit를 제공한다. (kernel mode = 0, user mode = 1) (Remind: CPU Register 내에는 많은 특수 목적 레지스터들이 있다.)
1.
User process가 실행 중 → System call을 호출한다. (= Trap이 발생)
2.
Mode switch : mode bit가 0으로 바뀌고, Kernel mode가 된다.
3.
System call 수행
4.
Mode switch : mode bit가 1로 바뀌고, User mode가 된다.
5.
User process가 system call로부터 돌아왔고, 계속해서 실행한다.
Privileged instructions (특권 명령)
시스템에 악영향을 끼칠 수 있는 일부 instruction들.
오직 커널 모드에서만 실행시킬 수 있다.
유저 모드에서 실행시키려 하면 → Trap 발생!