: 운영체제를 이해하기 위한 가장 기본적 개념
: 멀티프로그래밍의 기본 단위 / thread와 비교필요
: A program in execution -> 실행 중인 프로그램
📚 PCB
- 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓을 수 있는 저장 장소
- 운영체제가 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터베이스
- 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거됨
- program counter (pc) : 다음에 실행해야할 명령어의 주소를 가리킴
- stack pointer (sp) : 다음에 실행해야할 프로그램의 위치 저장 (pc의 내용, 기타 필요한 내용들이 stack에 저장됨)
- 프로그램이 쓰고 있는 데이터의 내용
- cpu안 레지스터의 내용
- 프로세스의 상태 / 프로세스 id / cpu scheduling information / 파일 시스템에 관한 정보 / 메모리 관리를 위한 내용 등 을 포함하고 있음
RUNNING : 프로세스가 실행되고 있는 상태
READY : 프로세스가 cpu에 실행되기 위해 ready queue에 대기하고 있는 상태 / 아직 cpu를 받지는 않았지만 cpu를 할당받으면 바로 실행 가능한 상태
BLOCKED (Waiting) : 외부의 이벤트가 발생하길 기다리는 상태
ex) 프로세스 a가 cpu 할당을 받고 명령어를 실행하다 I/O 작업을 해야하는경우, I/O 작업은 cpu처리 속도에 비해 오래걸리는 작업이기 때문에 프로세스 a는 cpu를 반납하고 (blocked) I/O 작업이 끝나기를 기다린다.
NEW : 프로세스가 막 생성된 상태
TERMINATED : 프로세스가 실행을 완료한 상태
++ NEW -> READY : 프로세스가 생성되면 해당 프로세스의 PCB이 OS커널의 ready queue에 올라옴
dispatch (READY -> RUNNING)
: ready queue에 있는 프로세스들 중에서 스케줄링 알고리즘에 의해 선택받은 프로세스가 cpu에 할당을 받는다.
timer runout (RUNNING -> READY)
: cpu를 할당받아 일을 하다 특정 이유로 다른 프로세스에세 cpu를 주고 ready queue에 들어가서 cpu를 기다림
block (RUNNING -> BLOCKED)
: 현재 cpu를 받아 명령어를 수행중이 프로세스가 I/O 작업을 해야하는 경우 cpu를 반납하고 해당 장치 큐에 들어감
wake up (BLOCKED -> READY)
: I/O 작업이 끝났다고 이벤트가 발생되면 BLOCKED 상태였던 프로세스가 다시 ready queue에 들어가게 된다
++ RUNNING -> TERMINATED : 프로세스 실행이 완료되어 자원을 반납한다
- BLOCKED 상태로의 진입, RUNNING-> TERMINATED 만 자신에 의해서 일어나며 나머지 상태 변이는 해당 프로세스의 외부 이벤트에 의해 일어난다!
스케쥴러가 동작하는 빈도수에 따라 3가지 유형의 스케쥴러
Long-term scheduler (job scheduler)
: 수행 빈도수가 낮다 (요새는 안씀 _ 사용자가 알아서 결정함)
: 대용량 저장 장치에서 수행을 기다리고 있는 프로세스들을 schedule 한다
: I/O-boud(I/O를 많이 가지고 있는 프로세스)와 CPU-bound (I/O가 거의 없고 , 계산 전용) 가 조화롭게 섞여있을 때 가장 좋은 성능을 낸다.
Medium-term scheduler (swapper)
: 보통 I/O가 너무 오래걸리면 메인메모리에서 디스크로 이동(swap out) 한다
Short-term scheduler (CPU scheduler)
: 수행 빈도수가 가장 높음
보통 swapper 와 cpu scheduler를 혼합하여 사용함
: cpu가 어떤 하나의 프로세스를 실행하고 있는 상태에서 다음 우선순위의 프로세스가 실행되어야 할때 기존의 프로세스의 PCB를 저장하고 cpu가 다음 프로세스를 수행하도록 새로운 프로세스의 PCB를 restore 하는 작업을 context switch라고 한다.
: process switch time (scheduling 알고리즘이 돌아가는 시간이 포함되어 있음) >= context switch time
context switch 하는데 걸리는 시간= Tc , time slot = t 라고 할때,
Tc > t 이면?
: 프로세스 실행할 시간이 하나도 없는 것이므로 계속 아무 프로그램도 실행하지 못한다.
: 따라서 context overhead를 줄여야한다.
-> 1. context size 를 줄이기
: 운영체제가 할 수 있다!
-> 2. context save 시간을 줄이기
: 하드웨어_ 운영체제에서 어찌할 방법이 없음
== context overhead를 줄이기 위해 thread 를 사용한다.
thread 사이에는 공유변수가 존재할 수 있다. 그러나, 프로세스 간에는 공유변수가 존재하지 않는다.
한 프로세스를 몇가지 작은 프로세스로 나눈 것이 thread 이다.
light weight process -> 대부분의 데이터를 공유하기 때문에 저장해야할 데이터들이 줄어든다.
== thread의 상태만 save, restore 하기 때문에 context size를 줄일 수 있다. (pc내용, 레지스터, 스택 만 저장하면 됨.)
-> context switch 시 overhead가 적어짐.
thread들은 서로 간에 독립적이지 않다. (공유 변수)
주소 공간을 공유한다.
- process A : 100개의 thread로 이루어진 프로세스
- process B : 1개의 thread로 이루어진 프로세스
<어떤 프로세스가 더 빠른가?>
정답: process A가 더 빠르다
이유: kernel-level thread에서는 os가 thread를 인지해 thread 단위로 scheduling 한다.
따라서 thread당 t를 할당한다고 가정하면 process A에 100t를 할당하고, process B에 t를 할당하기 때문에 process A 가 더 빠르다.
- process A : 100개의 thread로 이루어진 프로세스
- process B : 1개의 thread로 이루어진 프로세스
<어떤 프로세스가 더 빠른가?>
정답 : process B가 빠르다.
이유: user-level thread에서는 os가 thread를 감지하지 못해서 process 단위로 scheduling한다.
process A, B에는 동일한 시간(t)을 할당해주는데, 각 thread에는 A에는 t/100 , B의 thread에는 t를 할당하므로 B가 더 빠르다.