- Equal allocation : 각 프로세스에게 동일한 개수의 frame을 할당하는 방식
- Proportional allocation : 각 프로세스의 크기에 비례하여 frame을 할당하는 방식
Priority Allocation
: 프로세스의 중요도를 기반으로 frame을 할당하는 방식
I/O 를 감소시켜 waiting 상태의 시간을 줄여 실행이 빨리 끝날 수 있다.
page fault가 발생하는 경우 낮은 우선순위 프로세스의 frame을 선택하여 교체하도록 한다.
*Global vs Local Replacement
Global Replacement : replacement frame을 전체 frame에서 선택하도록 한다. 하나의 프로세스는 다른 프로세스의 frame을 가져와 사용할 수 있다. 동적으로 관리할 수 있고 circular queue로 관리하는 경우 전체 시스템으로 하나로 관리 할 수 있다.
Local replacement : 각 프로세스는 해당 프로세스 내에서 frame을 선택할 수 있다.
Thrashing
- 프로세스가 충분한 page를 갖지 못한다면 page fault rate가 높아지고 이는 CPU utilization을 떨어트린다.
- 프로세스의 잦은 page swapping으로 CPU 성능이 떨어지는 상태
Locality
프로그램의 메모리는 임의 시간 내에 프로그램의 일부분을 집중적으로 참조하는 고도의 지역성을 갖는다.
시간 지역성 : 현재 참조된 메모리가 가까운 미래에도 참조될 가능성이 높음 (loop, subroutine, stack)
공간 지역성 : 하나의 메모리가 참조되면 주변의 메모리가 계속 참조될 가능성이 높음(Array Traversal, 명령의 순차 실행)
Locality를 어떻게 계산할 것인가?
Working-Set Model
- 현재 시점의 지역성을 확인하기 위한 목적으로 사용되는 working-set window를 사용
- working-set window가 너무 작은 경우 지역성을 반영하지 못한다.
- 각 프로세스의 working-set size의 합은 사용가능한 전체 frame의 크기보다 크면 Thrashing 상태가 된다.
이때 , 프로세스는 suspend 되도록 한다.
- 매번 working-set을 계산하는 것은 cost가 많이 필요하다.
Page-Fault Frequency Scheme
적절한 Page fault의 상한선,하한선 기준을 정해 벗어나는 경우 조치하도록 한다.
상한선 보다 높아지는 경우 frame을 더 할당해주며 하한선 보다 낮아지는 경우 frame을 회수한다.
-> Working set 방식은 page 참조 시마다 페이지 집합을 수정하고 PFF 방식은 page fault 발생 시에만 페이지 집합을 수정하여 오버헤드를 상대적으로 줄인다.
Virtual Memory 의 장점 (프로세스 생성 시)
Copy-on-Write
부모와 자식 프로세스가 처음에는 같은 page를 공유하도록 하고 write를 하는 순간 page를 복사하고 복사한 page에 write 작업을 수행
기본적으로는 page를 공유하도록 하고 write 할 때 copy 하여 수행하도록 하여 메모리 사용 효율성을 높일 수 있다.
Memory-Mapped Files
프로세스의 가상 공간 중 일부를 디스크에 있는 파일의 블록에 매핑하는 방식이다.
기존의 system call 의 오버헤드를 줄일 수 있다. (I/O를 줄일 수 있다.)
즉, 디스크 파일의 일부와 매핑하여 file system을 통한 과정을 거치지 않아 속도가 빠르고 I/O 발생으로 인한 오버헤드가 줄어든다.
Prepaging
일반적으로 페이징 기법을 사용할 때 초기에는 page fault가 반드시 발생한다.
이러한 page fault를 줄이기 위해 Prepaging으로 미리 올려둬서 page fault 를 줄일 수 있다.
Page size
- Page size가 과도하게 큰 경우 Internal fragmentation이 발생 할 수 있다.
- Page size가 작은 경우 Page table size가 커질 수 있다.
- Page size가 커지면 locality를 정확히 구분하기 어렵다.
I/O Interlock
- page가 memory에서 lock 상태가 되어야 하는 경우가 필요하다.
예를들어 디스크에서 외부저장장치로의 이동을 위해 buffer에 있는 경우 page 교체가 일어나면 정상적으로 파일이동이 불가하다.
I/O bound job의 경우 입출력 위주의 작업으로 cpu를 짧게 여러번 사용한다. 반면에 cpu bound job은 계산 위주의 job으로 빈도는 작지만 한번 사용시 오래 사용하는 특징이 있다.
-> 사용자와의 interactive를 위해 i/o bound job에 cpu를 빨리 할당해줘야 한다.
State Transition Diagram
long-term scheduling은 new 를 편입시켜주는 역할을 한다. midium-term scheduling은 suspend되는 경우 사용된다. short-term scheduling은 흔히 cpu scheduling으로 어떤 process에게 cpu를 할당할지 결정해준다.
CPU Scheduler
:어떤 process에게 cpu를 줘서 실행할 것인가를 결정 (Multiprogramming environment)
cpu scheduler는 메모리에서 프로세스를 선택한다.
cpu scheduling이 일어나는 4가지 경우
1. running 상태에서 waiting 상태로 바뀌는 경우 (i/o request)
2. running 상태에서 ready 상태로 바뀌는 경우 (timerunout)
3. waiting 상태에서 ready 상태로 바뀌는 경우 (i/o finished interrupt)
4.terminated
3의 경우는 interrupt 가 끝난뒤 원래 실행 program으로 돌아오는것이 아니기에 다시 cpu scheduling을 시작
1,4의 경우 nonpreemptive, 2,3은 preempive 경우이다.
Dispatcher
: 결정된 process에게 cpu를 주는 과정을 수행한다.
Dispatcher module
-switching context, switching to user mode, 사용자 프로그램의 적절한 위치로 jump 하고 재시작
dispatch latency
기존 프로세서를 중단하고 새로운 프로세서를 실행하는데 걸리는 시간 -> context switch overhead
Scheduling Criteria (기준)
CPU utilization : cpu가 계속 동작하도록 하는 것이 좋음
Throughput : 단위 시간당 처리하는 작업의 양 -> maximize
Turnaround time : process 시작부터 끝까지 걸리는 시간 -> minimize
Waiting time : ready queue 에서 프로세스가 기다리는 시간
Response time : interactivity
Scheduling Algorithms
FCFS Scheduling
: First Come First Served ->먼저 온 process에게 먼저 cpu를 할당해주겠다. (공평성이 강점)
->실행시간이 짧은 프로세스가 먼저 들어오는 경우 waiting time이 줄어듬 -> convoy effect!
Shortest-Job-First(SJF) Scheduling
: 빠른 것을 앞으로 보내서 wait 시간을 줄이자 (average waiting time 측면에서 optimal)
두 가지가 존재
1. Nonpreemptive :더 짧은 것이 들어오더라도 기존의 실행이 끝난 후 실행
2. Preemptive : SRTF(Shortest-Remaining-Time-First), 더 짧은 프로세스가 들어오면 기존의 것을 중지하고 짧은 것을 먼저 실행
SJF와 SRTF의 예시
Determining Length of Next CPU Burst
: 알고리즘 사용을 위해 process의cpu 사용시간을 알아야함 -> 알수없음
estimate 하는 방식!
기존의 값들을 참고하여 예측하는 방식을 사용한다.
a값이 작아질수록 과거의 데이터가 공평하게 반영되고 값이 커질수록 최근에 대한 가중치가 높아진다. 최근 데이터에 가중치를 높게 주면 정확도가 높아지는 것을 확인 할 수 있다. 증감이 일정한 경우에는 정확도가 높은 값을 가질수 있다.
증감이 일정하지 않고 증감이 수시로 반복되는 경우 완전히 잘못된 결과를 가져올 수 있음 -> why?
최근 데이터에 가중치가 높으면 증가하다가 감소로 변하는 지점에서 감소에 대한 데이터 대신에 직전에 증가하던 데이터에 가중치가 높아져 정확도가 떨어지는 결과를 낼 수 있음
Priority Scheduling
:우선순위를 고려한 Scheduling 방식
각 process 에 priority number가 부여되고 이 번호에 따라 실행 (작은수가 높은 우선순위)
문제 : Starvation, 낮은 우선순위 프로세스는 계속 뒤로 밀려남
해결 : Aging, 대기시간이 길어짐에 따라 우선순위를 높여줌
Round Robin(RR)
: time quantum(cpu사용 가능 최대시간)을 설정하여 모든 프로세스가 돌아가면서 한번식 실행될 수 있도록 함 -> multiprogramming 목적으로 나온 방식
단점 : time quantum 이 너무 작은 경우 context switch overhead 발생
higher average turnaround 이지만 response가 뛰어나다.
time quantum = 20인 RR 예시
Multilevel Queue
Ready queue를 나눈다.
forground(interactive) : RR -> i/o bound job
background(batch - no human interaction) : FCFS -> cpu bound job
RR자체로만 쓰기에는 부족하여 Multi level queue 사용
Scheduling 은 queue 사이에서 진행
1.Fixed priority scheduling : 모든 forground 를 수행 한 뒤에 background 수행 -> starvation 문제 발생
2.Time slice : 조금씩 나눠서 starvation 문제를 해결 eg. forground in RR 80%, background in FCFS 20%
Multilevel Feedback Queue
I/O bound job, CPU bound job을 어떻게 구분하기 위함
process들은 queue 간 이동을 함
MLFQ의 5가지 정책
1. queue의 개수
2. 각 queue에 해당하는 scheduling algorithms
3. upgrade 방식
4. demote 방식
5. 어떤 queue에 process를 넣을 것인지
MLFQ 예시
Real-Time Scheduling
Hard real-time systems
: guaranteed amount of time (deadline) 내에 반드시 수행되어야 함
프로그램은 반드시 연속적으로 일어나야함 -> jump, 분기 instruction 때문에 바뀔 수 있음, default는 seqeuntial
Process는 5가지 별도의 공간을 가짐
text section : program code 부분
Stack : function call 과 context switch
function call : parameter 저장, return address, local 변수 등
context switch : 레지스터 값을 저장 (PC 포함) , stack pointer 저장
data section : static, global 변수 저장 -> 실행상황과 관계없이 어디서든 접근 가능한 Data
heap section(free memory pool) : 동적 할당을 위해 (malloc) -> 동적 할당 메모리 관리
stack으로 관리하는 이유?
Process in Memory (메모리 상에서 Process 모습) : Address Space(프로세스의 주소 공간)
연속된 주소공간으로 logical 하게 연속, physically 연속은 x
text,data -> 고정 영역
stack 과 heap -> 가변 영역이지만 만날 가능성은 없음
Process State
프로세스 실행 과정에서 상태 변이가 일어난다.
new : process가 생성된 상태 (아직 cpu scheduling 대상은 아님) -> 실시간 system에서는 각 작업의 deadline이 정해져 새로운 process가 들어오면 자원할당이 필요하고 기존 process가 deadline을 만족시키지 못할 수 있기에 바로 scheduling 대상에 포함하지 않는다. 즉 , 기존 processe들이 deadline을 맞출 수 있는지 확인 후 scheduling 대상에 포함한다. 일반적인 os에서는 바로 편입
running : instruction이 실행되는 상태 (cpu를 잡고 일하는 중)
waiting : process가 event 발생을 기다리는 상태 (주로 I/O event)
ready : process가 할당받기를 기다리는 상태 (언제든 cpu를 할당받을 수 있는 상태)
terminated : process가 실행을 끝낸 상태( 마지막 instruction 수행 끝난 상태)
Process Control Block(PCB)
:어떤 프로세스에 대한 자료구조
kernel data structure
process state , program counter, cpu register, cpu scheduling information, memory-management information, accounting information, i/o status information
CPU Switch from Process to Process
:Multiprogramming, Multitasking을 위해 cpu를 잡고있는 process를 상태를 포장해서 저장후 다른 process 실행
Process Scheduling Queues
Job queue : process의 pointer를 갖고 있음(PCB의 pointer들)
-degree of multiprogramming(현재 cpu를 이용하여 조금씩 수행중인 process 개수)를 control
Short-term scheduler( or CPU scedular)
:Ready 인 상태의 프로세스에게 어떤 scedular를 줄 것인지 결정
-매우 자주 발생하며 빨라야 한다. (mileseconds)
Addtion of Medium-term scheduling
Process는 두가지로 구분 -> process는 scheduling 입장에서 매우 중요한 정보를 가짐, 효율성을 위해 프로세스를 구분하여 관리한다.
I/O -bound process - 연산보다는 I/O에 대부분 시간 사용 (editor, hwp, massenger...), CPU를 짧게 여러번 사용
CPU-bound process - 연산에 대부분의 시간 사용, CPU를 길게 적게 사용
Context Switch
:Multiprogramming을 위해 생기는 것
CPU가 다른 process로 바뀔때 system은 이전 프로세서의 상태를 저장하고 새로운 저장된 상태의 프로세스를 불러온다.
store : regiser -> pcb
reload : pcb -> register
Context Switch Time 은 Overhead
-> 부가적인 overhead 발생
switching 시 system은 특별한 일을 수행x
하드웨어의 지원을 받음
cache flushing - cache miss over head - context switch 가 발생하면 기존 cache 내용이 필요없어서 cache를 비워버림
Provcess Creation
-Process를 만드는 주체는 다른 어떤 Process이다(shell process).
부모 프로세스는 자식 프로세스를 생성한다. -> tree 구조
프로세스는 pid(process identifier)로 식별하고 관리한다.
일반적으로 부모프로세스와 자식 프로세스는 내용적인 관계가 없다. 하지만 자식프로세스가 죽었을 때 부모 프로세스가 return 값을 받아줘야 한다.
resource를 공유하는 밀접한 관계도 있음
Execution : 부모와 자식 프로세스는 동시에 실행된다. 부모는 자식프로세스가 종료될때까지 기다린다.
Address spcae : 자식이 부모 값을 복제(default값) -> fork 하자마자의 상태는 부모와 동일
UNIX example
-fork() systemcall은 새로운 프로세스를 생성한다.
-exec() systemcall은 fork 호출 이후 프로세스의 메모리를 새로운 프로그램으로 대체한다. -> exec()가 호출되지 않으면 부모와 동일한 상태
Starting point of the child process -> 자식 프로세스가 fork() 된 시점을 정확히 알아야 함
fork() system call 이후 return 값을 받기 전에는 부모와 동일한 상태
자식 프로세스의 return value는 0이며 부모 프로세스는 자식프로세스의 pid를 return value로 갖는다.
else if, else 부분에서 부모,자식을 분기한다.
Process Termination
process 실행이 마지막 statement실행 후 os에 프로세스 삭제 요청을 함 -> exit()
wait을 통해 자식 프로세스의 output이 부모 프로세스에 전달
프로세스 resources 는 os에 의해 deallocated
부모 프로세스가 자식프로세스의 실행을 중단시킴-> abort
- 자식 프로세스의 자원할당이 초과하는 경우
-자식 프로세스의 일이 필요없는 경우
-부모가 exit 하는 경우 os는 자식프로세스가 더 이상 작동하지 않도록 함 (cascading termination)
Interprocess Communication
Single and Multithreaded Processes
왼쪽은 하나의 일반적인 process, 오른쪽은 한 process안의 여러개의 threads
Threads
:thread(lightweight process)는 CPU utilization 의 기본단위
- program counter, register set, stack space로 구성되어 있음
threds는 code section, data section, files 내용을 공유한다.
Threads 사용의 장점
Responsiveness
- 부분적으로 blocked가 발생하거나 긴 operation이 수행되더라도 program이 계속 작동할 수 있도록 해준다.
Resource Sharing
-process를 여러개 사용한다면 address space가 독립적으로 존재하여 overhead가 크게 발생한다. 하지만 thread는 memory copy를 하지 않고 공유할 수 있다.
Economy
-프로세스를 만들고 context switch를 하는 것 보다 경제성이 뛰어나다.
Scalability(확장성)
-각 thread는 다른 프로세서에서 병렬적으로 실행될 수 있다.
User Tread
-> 가볍고 빠르다
사용자 수준 thread 라이브러리에서 수행되는 thread 관리 -> 응용프로그램에서 thread 를 생성하고 관리 -thread 생성, 스케줄링 및 관리 -kernel에서 지원되지 않음 -신속한 생성 및 관리 -단일 thread 커널을 사용하면 차단 시스템 호출을 수행하는 하나의 사용자 수준 thread로 인해 전체 프로세스가 차단됨 (OS는 해당 프로세스의 다른 thread의 존재를 모르기 때문에 CPU를 다른 프로세스에 할당합니다)
예
•POSIX Pthreads
•Mach C-threads
•Solaris threads
Kernel Thread
-> 느리다.
커널에서 지원됨 -커널이 스레드 생성, 스케줄링, 관리를 수행함: 사용자 스레드보다 느림 -차단 thread는 전체 프로세스를 차단하지 않음 -MP 기계에서 커널은 다른 프로세서의 thread를 예약할 수 있음