1. Introduction
용어 정리
운영체제란?
- 하드웨어 위에 바로 올라가는 소프트웨어로, 다른 소프트웨어들과 하드웨어를 연결하는 역할을 하는 소프트웨어
- 시스템의 자원을 효율적으로 관리하기 위함이 주된 목적
- 자원이라 함은 cpu, ram 등
- 어떠한 것들을 연산시킬지 그 순서를 정하고, 한정된 메모리를 잘 쓰기 위해 필요하지 않을 것 같은 것들은 잠시 디스크에 내려놓기도 하며 효율적으로 관리
2. System Structure & Program Execution
용어 정리
Mode bit
- 현재 cpu를 점유하는 프로세스가 사용자 프로그램인지 운영체제인지 구분한다. 레지스터이다.
interrupt line
- interrupt 발생 여부를 표기하는 것으로, cpu가 매 instr 후에 확인한다.
timer
- 각 프로세스가 cpu를 점유할 수 있는 시간을 재는 기능. 1 clock cycle마다 값 1감소
- 운영체제는 cpu를 다른 프로세스에 넘겨줄 수 있어도, 뺏어오지는 못한다. 그 것마저도 instr. 타이머로 조절
device controller
- cpu와 io 장치 사이의 중개자. 일종의 작은 cpu
device driver
- 장치를 다루기 위한 interface. 소프트웨어이다. cpu가 해당 장치를 제어하기 위해 controller에게 명령할 때, 이 device driver라는 인터페이스를 통해 명령
local buffer
- io 장치의 memory
- cpu는 원하는 데이터를 memory에서 buffer로 복사. controller에게 이 후 작업을 요청
DMA controller
- 안그래도 많은 io작업에서, cpu가 너무 자주 interrupt 당하지 않게, buffer의 내용을 memory에 복사하는 것과 같은 작업을 전용으로 하는 controller
Memory controller
- cpu와 dma controller가 동시에 memory에 접근하지 않도록 중재하는 controller
system call
- 사용자 프로그램이 운영체제의 커널을 호출하는 것. 운영체제의 함수를 호출하기 위한 요청
- 일반 함수 호출처럼 특정 메모리 주소로 점프하는 것이 아니다.
- interrupt line 세팅 → 운영체제가 mode bit 변경, cpu 점유 → 특정 함수 호출
interrupt
- 레지스터와 pc를 저장한 후, cpu의 제어를 interrupt service routine에 넘기는 것
software interrupt = trap
- 프로그램이 스스로 interrupt를 걸어 운영체제를 호출하는 것
- system call : 필요에 의한 호출
- exception : 오류. 숫자를 0으로 나누는 연산 등
- os는 해당 요청이 올바른지, 권한은 있는지 등을 체크, device controller에게 적절한 명령 내림
hardware interrupt
- timer가 거는 interrupt. 하나의 프로그램의 독접을 막는다.
- io 작업이 끝나 device controller가 거는 interrupt
interrupt service routine(interrupt handler)
- interrupt 종류마다 운영체제가 수행해야할 코드 집합
interrupt vector
- interrupt 종류마다 수행해야할 함수의 주소를 정의한 테이블
synchronous io
- io 요청 후, io 작업이 끝난 후에야 사용자 프로그램에 제어권이 넘어가는 것
- io 작업이 끝날 때까지 그냥 cpu를 낭비하는 구현법
- 다른 프로그램에 cpu를 넘기고, 해당 프로그램은 io 요청을 기다리는 줄에 세워둔다. io 작업이 끝나면 제어권을 넘기는 구현법 → 보통 이거
asynchronous io
- io 요청 후, io 작업이 끝나는 것을 기다리지 않고, 제어가 사용자 프로그램에 즉시 넘어갈 수 있도록 하는 것
kernel의 memory
- code에는 system call, interrupt 처리 코드, 자원 관리를 위한 코드 등 운영체제 프로그램 코드 자체가 올라간다
- data에는 운영체제가 사용하는 여러 자료 구조가 올라간다. 하드웨어들마다 추상적 자료구조를 만들어 관리하고, 프로세스 관리를 위한 pcb도 여기 저장한다.
- stack에는 함수 호출에 관한 것들이 저장된다. 다만 여러 사용자 프로그램들이 운영체제의 함수를 호출할 수 있기에, 프로그램마다 stack을 따로 둔다.
3. Process
용어 정리
process
context
- process들에게 cpu를 할당하고 빼앗는 과정에서, 기존에 cpu를 점유하던 process들이 어떠한 상태였는지 알기 위해 필요한 모든 것
- pc, register에 저장된 값, code, data, stack에 저장된 값, pcb, kernel stack
state-new
state-running
state-ready
- cpu를 기다리는 상태. 필요한 모든게 memory에 올라와 있고, 준비가 되어 cpu만 얻으면 되는 상태
state-blocked
(wait, sleep)
- cpu를 얻더라도 instr 실행을 못하는 상태
- 자신이 요청한 작업이 만족되지 않아 기다리는 경우, 실행할 코드 부분이 디스크에 내려가 있는 경우 등
state-suspended(stopped)
- 외부적인 이유로 process 수행이 정지된 상태. 프로그램은 통째로 disk에 swap out
- 사용자가 break key등으로 프로그램을 일시정지 시키는 경우. 이런 외부 개입에 의해서 suspended되거나, 다시 돌아오게 된다.
- suspended 될 때 io 요청을 기다리는 중 → suspended blocked. 이후 io 요청 마무리 → suspended ready
state-terminated
- process 수행이 종료되고, 정리중인 상태
resource queue
- 여러 process가 동시에 공유자원에 접근하면 일관성이 깨질 수 있다. 동시 접근을 막기 위해 process들을 queue에 올려 관리한다.
pcb
- os가 관리상 사용 : process state, id, scheduling관련해서 쓸 정보
- cpu 수행 관련 : pc, register 값들
- memory : code, data, stack의 위치정보
- 파일 : process가 사용하는 파일이 어떤 것인지에 관한 것 등..
job queue
- 현재 시스템 내에 있는 모든 process들의 집합. queue들은 pcb 포인터들의 연결로 표현
ready queue
- 메모리에 올라가 있으면서 cpu를 기다리는 process들
device queue
- io device의 처리를 기다리는 process들의 집합
cpu scheduler
- 어떤 process를 running 상태로 만들지 결정
job scheduler
- process를 메모리에 올리는 것을 관리. new → running
- ready queue로 process를 보내는 것을 관리. 올라갈 수 있는 process 수 관리
- 요즘에는 바로 ready로 전환
swapper
- 프로그램 시작시 메모리는 바로 할당. 메모리에서 일부 프로그램을 골라 쫓아내 degree of multiprogramming 관리
thread
- process 내 실행 흐름
- process내에, cpu 실행 단위만 다르게 둔 것. cpu 사용의 단위
- context switch 오버헤드를 줄이기 위해 process 내에서 같은 memory 공간을 공유하지만 code의 다른 부분을 실행하게 해 흐름을 쪼갠 것
- 개별 pc, register(cpu 수행과 관련된 정보), stack 존재
- code, data, os 자원 공유
- kernel thread : os가 thread가 여러개인 것을 알고 있다. thread에서 다른 thread로 cpu가 넘어가는 것을 kernel이 관리
- user thread : 라이브러리를 통해 지원. process가 thread 관리
- 장점
- 적은 오버헤드, 높은 throughput. 병렬성을 높일 수 있다. 행렬 곱의 경우 병렬적으로 수행하고 값을 합쳐주는 방식으로
- 단점
기타
- 사용자 process에서 os로 cpu 점유권이 넘어간다고 꼭 context switch인 것은 아니다. sys call등으로 os가 호출될 때 일반적인 context switch보다는 훨씬 오버헤드가 적은 수준으로 기존 process에 관한 필수적인 정보만 따로 저장한다. context switch면 캐쉬도 밀어버린다.