그냥, A 40개, B 20개, C 10개면 그냥 랜덤뽑기하는거지
SJF
무조건 빨리 끝나는 아이 먼저
짧은 프로세스를 빨리 끝내면 전체적으로 대기시간이 줄어들 수 밖에 없다.
a,b,c,d 순으로 정렬되어 있다면,
a+b+c가 최소가 아니라면,
증명
만약 이거보다 빠른 방법이 있다고 하자
몰라!
실제로 CPU버스트를 예측하기가 너무나도 어렵기 때문에, 사용하기 힘들다.
일반적으로, 지수평균을 이용하여 구한다.
time slice가 무한대라면, FIFO이다.
쓸데없이 타임슬라이스가 커지면, 문맥교환 코스트 때문에 손해를 볼 수 있다.
80%정도의 프로세스들의 CPU 버스트 타임(즉, 한번 받았을 때 하는 것)이 타임슬라이스보다 짧아야 한다.
SJF는 우선순위를 짧은 거에 몰빵한 거라고 생각하면 될 듯
여러가지 고려할 면이 있다
내부적
시간 제한, 메모리 요구, I/O 버스트와 CPU 버스트의 시간 비율
외부적
비즈니스로직
비선점형, 선점형 모두 되겠지. 선점형에서는 그냥 우선순위 높은 아이한테 뺏겨버릴듯
무한봉쇄, 기아상태
우선순위 낮은 애들이 너무 밀려버린 것
에이징을 통해서 해결한다
PCS(프로세스 내부에서 가용한 LWP를 이용해서 경쟁)
SCS(프로세스 외부, 시스템 전체에서 커널스레드를 할당받기 위한 전쟁)
당연히, 1:1 모델을 쓰면 SCS만 하겠네
암달의 법칙에 따라,
그렇기에, 두 개의 프로그램을 한번에 돌려야 한다면, 두 개의 프로그램을 시간 순으로 나눠서 하는 것보다, 프로세서를 반반띵해서 동시에 돌리는게 차라리 효율이 좋다. (time sharing → space sharing)
대칭 : 그냥 다(SMP)
비대칭 : 하나의 코어에만 커널, 나머지는 다 사용자 공간
쉽지만 병목
왼쪽 : 공유자원이 중간 것이므로 락에 의한 성능 저하 심각할 수 있다.
오른쪽: 균형이 안맞을 수 있다.
로드밸런싱
push(빈 곳으로 밀어넣기),pull(빈 곳이 땅겨오기) 방식
캐시 어퍼니티 고려해라
또한 따로관리되기에 공유메모리의 접근성도 고려해야 하고,
캐쉬일관성문제도 존재한다는것.
기존 문제점
어떤 프로세스를 실행할라 치면, 메모리를 기다리는 시간 때문에 아무것도 못한다
그러니까, 이렇게 하드웨어 실행흐름을 두개를 만들어서, 실제 컴퓨팅을 안할 때는 다른 스레드로 점프하게 하자.
컴퓨터의 입장에서는, CPU가 많은 듯이 보이게 된다.
coarse 쓰레딩
그냥 지연시간 긴 거 만나면 싹 다 갈아 엎고 다시 함
쓰레드 문맥교환에 시간이 좀 걸린다
세밀한 쓰레딩
뭔가 경계점에서 이렇게 잘 중복시키고 하는,,
추가적인 하드웨어 필요
실제 하드웨어까지 문맥교환에 참여하게 되는,,
같은 코어에 두 개의 쓰레드가 병렬적으로 실행되는 상황이 안 나오게끔 해야 겠다.
첫번째그림 p1은 주기 50, t1은 25, p2는 주기 100, t2는 35
모든 테스크의 필요한 CPU버스트 시간/주기 를 해서 100 이하면 사용 가능하다
만약, 10개가 10 cpu 버스트 시간마다 100마다 필요하다면 100%이므로 딱 사용 가능
하지만, 항상 사용 가능하지는 않다. CPU가 100%를 이용할 수 있다는 보장이 없기 때문에
이상한 식도 있다.
p1의 주기 50, t1 25, p2의 주기 80, t2는 35
각 프로세스는 우선순위(nice)값에 따라, vruntime 값이 바뀐다.
디폴트면 200ms 시간되면, 200ms 실행되었다고 말하지만, 우선순위가 높다면 200ms 실행되어도 200ms보다 작은 시간을 실행되었다고 구라친다.
가장 작은 vruntime 값을 가진 프로세스가 스케줄링 된다.
이 부수효과로, I/O 태스크가 우선순위에 상관없이 vruntime 값이 작아지게 된다.
RB트리를 사용한다. 가장 왼쪽 값이 스케줄링 되며, logn시간이 필요하지만 이 값만 캐쉬로 떼놓는다.
이렇게, 실시간 프로세스는 따로 스케줄링을 받고, normal 프로세스는 -20~19까지의 CFS 스케줄링을 받게 된다.
로드밸런서도 정교하게 구현한다.
단순하게 프로세스의 양을 보는게 아니라, CPU 이용률과 우선순위를 중심으로 본다.
CPU 이용률이 높으면 → 부하가 크다
우선순위가 높으면 → 부하가 크다
따라서, CPU이용률이 높고, 우선순위가 낮은 프로세스와 CPU이용률이 낮고 우선순위가 큰 프로세스는 부하가비슷하다.
NUMA 노드 안에서 구현된다.
계층적으로, 하지만 이 밖으로는 안 나게끔 해서 캐쉬친화도를 유지한다.
16~31 : 실시간 프로세스
1~15 : 가변, 우선순위 프로세스
스레드의 타임퀀텀이 끝나면, 스레드의 우선순위가 낮아진다. 계산에게 덜 주기 위해서이다.
하지만, 디폴트보다는 낮아지지 않는다.
어떤 대기에서 풀려나게 되면, 무얼 위해 대기했느냐에 따라 우선순위를 다르게 준다.
I/O 였으면 크게,, CPU 계산이였으면 작게...
fore ground와 background의 시간할당량이 3배정도 차이나게 한다 → 응답성 향상
사용자 모드 스레드 스케줄링 도입했다.
동일한 논리 프로세서 집합에서 실행되도록 했따. (이전의 NUMA와 비슷하다)
지랄
지랄
큐잉모델
평균 대기시간 동안에 들어오는 프로세스의 개수를 곱하면, 큐의 길이가 된다.