인프런 워밍업 클럽 4기 CS - 2주차 자료구조와 알고리즘 미션
4개월 전
미션
여러분은 간단한 운영체제를 개발하고 있습니다.
운영체제의 CPU 스케줄링을 구현해야 하는 차례입니다.
여러 프로세스들이 골고루 실행되도록 하기 위해, 프로세스 실행 횟수(executionCount)가 작은 프로세스의 우선순위를 높게 설정하는 CPU 스케줄링 정책을 만들려고 합니다.
또한, 모든 프로세스가 비슷하게 실행될 때는 사용자의 반응성을 높이기 위해 I/O Bound 프로세스들의 처리를 우선적으로 하려고 합니다.
I/O Bound 프로세스는 CPU를 사용하다가 자발적으로 CPU를 반납(cpuReturnCount)하는 것으로 판단할 수 있습니다.
따라서 다음 두 가지 조건으로 CPU 스케줄러를 구현해 보세요:
프로세스 실행 횟수가 가장 적은 프로세스가 우선순위가 높습니다.
실행 횟수가 같을 경우, I/O Bound 프로세스가 우선순위가 높습니다.
class Process{ constructor(name, cpuReturnCount, executionCount){ } } let cpuScheduler = new CpuScheduler(); cpuScheduler.enqueue(new Process("수치계산프로그램", 4, 0)); // cpu반납 4회, 실행횟수 0회 cpuScheduler.enqueue(new Process("뮤직플레이어", 11, 10)); // cpu반납 11회, 실행횟수 10회 cpuScheduler.enqueue(new Process("웹브라우저", 27, 25)); // cpu반납 27회, 실행횟수 25 cpuScheduler.enqueue(new Process("터미널1", 34, 2)); // cpu반납 34회, 실행횟수 2회 cpuScheduler.enqueue(new Process("터미널2", 93, 2)); // cpu반납 93회, 실행횟수 2회 console.log(cpuScheduler.dequeue()); // 수치계산프로그램 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널2 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널1 프로세스 출력 console.log(cpuScheduler.dequeue()); // 뮤직플레이어 프로세스 출력 console.log(cpuScheduler.dequeue()); // 웹브라우저 프로세스 출력답
class Process {
constructor(name, cpuReturnCount, executionCount) {
this.name = name;
this.cpuReturnCount = cpuReturnCount;
this.executionCount = executionCount;
}
}
import { Heap } from "./heap.mjs";
class CpuScheduler {
constructor() {
this.heap = new Heap();
this.heap.isBigPriority = function(first, second) {
if (first.executionCount !== second.executionCount) {
return first.executionCount < second.executionCount;
}
return first.cpuReturnCount > second.cpuReturnCount;
};
}
enqueue(process) {
this.heap.insert(process);
}
dequeue() {
let removedNode = this.heap.remove();
return removedNode ? removedNode.getData() : null;
}
}
let cpuScheduler = new CpuScheduler();
cpuScheduler.enqueue(new Process("수치계산프로그램", 4, 0));
cpuScheduler.enqueue(new Process("뮤직플레이어", 11, 10));
cpuScheduler.enqueue(new Process("웹브라우저", 27, 25));
cpuScheduler.enqueue(new Process("터미널1", 34, 2));
cpuScheduler.enqueue(new Process("터미널2", 93, 2));
console.log(cpuScheduler.dequeue()); // 수치계산프로그램
console.log(cpuScheduler.dequeue()); // 터미널2
console.log(cpuScheduler.dequeue()); // 터미널1
console.log(cpuScheduler.dequeue()); // 뮤직플레이어
console.log(cpuScheduler.dequeue()); // 웹브라우저
댓글을 작성해보세요.