📌  相关文章
📜  教资会网络 | UGC NET CS 2015 年 12 月 – II |问题 17(1)

📅  最后修改于: 2023-12-03 15:39:54.188000             🧑  作者: Mango

UGC NET CS 2015 年 12 月 – II |问题 17

这是一道UGC NET CS 2015年12月-II的问题,涉及到操作系统中的CPU和调度算法。 在操作系统中,CPU调度算法是一种将CPU分配给进程的方法。针对这个问题,我们需要了解一些不同的调度算法类型。 以下是我所了解的不同类型的CPU调度算法:

先来先服务(FCFS)

这是一种非常简单的算法,其中进程按照其到达时间的顺序排队,执行完的进程将被移除队列。

短作业优先(SJF)

这是一种基于进程执行时间的调度算法。在这种算法中,执行时间最短的进程首先获得CPU时间。

优先级调度算法

这种算法基于进程优先级(在Unix系统中,可以分配1-127之间的优先级)进行调度。具有最高优先级的进程首先获得CPU时间。

时间片轮转调度算法

该算法按照固定的时间量(称为时间片)将CPU时间分配给进程。当时间片耗尽时,进程将被移出队列,并将其状态更改为就绪状态。

根据题目要求,我们需要确定列出的调度算法之一可以提高进程的平均周转时间。通过比较上述算法,我们可以得出以下结果:

  • SJF算法优先考虑处理时间最短的进程. 对于短进程,它可以在比其他算法更短的时间内完成。因此,可以减少进程的平均周转时间。
  • 时间片轮转调度算法在每个时间片中将CPU时间分配给进程,使长时间运行的进程不会花费过多的时间。在这种情况下,平均周转时间也会降低。
结论

在保证公平的情况下,时间片轮转调度算法可以最大化利用CPU,并降低进程的平均周转时间。因此,我们可以选择这种算法来提高进程的平均周转时间。

实现时间片轮转调度算法的简单示例代码:
function roundRobin(processes, quantum) {
    let time = 0;
    let processesCopy = processes.slice(0);
    let queue = [];
    let match = false;
    let nowReading = null;
    let waitingTime = 0;
    while(processesCopy.length || queue.length) {
      //把已经到达的被从等待队列中提出,并放入队列
      if (processesCopy.length !== 0 && processesCopy[0].arrivalTime <= time) {
        queue.push(processesCopy.shift());
        continue;
      }
      if(nowReading === null) {      //没有进程被执行
        nowReading = queue[0];       //从队列中取出当前执行进程
        queue.shift();
        nowReading.start = time;
      }
      nowReading.execTime--;     //因为时间片轮转算法分为固定的时间片,所以每执行一次减少1
      time++;                   //时间+1
      //当前进程执行完毕,从执行队列中取出下一个
      if(nowReading.execTime === 0){
        waitingTime += time - nowReading.start - nowReading.runTime;
        nowReading = null;
        continue;
      }
      //改进程需要等待
      if(nowReading.execTime !== 0 && ((queue.length && !match) || (queue.length && nowReading.execTime <= quantum))) {
        queue.push(nowReading);
        nowReading = null;
        match = true;
      }
      //队列中所有存在的进程都不需要执行,进程也没有被执行,则终止循环
      if(!match){
        time--;
      }
      match = false;
    }
    return waitingTime / processes.length;
  }