操作系统:时间片轮转RR进程调度算法

目的:陆续整理近一年的学习收获

                                        时间片轮转RR进程调度算法

一:概念

  • 时间片轮转RR进程调度算法:用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。

 

  • 算法的思想:给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。

 

二:测试用例

  • 假设在时间片完成时刻,有一个新进程到来,则先将新进程插入就绪队列尾部,然后才将该时间片中未执行完毕的进程插入就绪队列尾部。

三:程序设计

  • 定义进程结构体
typedef struct{
    char name;//进程名字
    int ArrivalTime;//到达时间
    int ServiceTime;//服务时间
    int FinishedTime;//完成时间
    int WholeTime;//周转时间
    double WeightWholeTime;//带权周转时间
}RR;
  • 变量名及用到的方法
static queue<RR>RRqueue;  //用来模拟进程执行RR调度算法的队列
static double SumWT=0,SumWWT=0,AverageWT =0,AverageWWT=0;//平均周转时间、平均带权周转时间
static int q;  //时间片数
static int n;  //进程个数
static RR RRarray[100];  //进程结构体
static RR temp;  //进程结构

void Enter();//输入时间片、到达时间、服务时间等
void RRfunction();//执行RR调度算法
void display();//显示各时间执行情况,以及各个时间值
  • 算法详细设计
//执行RR调度算法
void RRfunction(){
    char Moment[100];   //存储每个时间片p对应的进程名称
    RRqueue.push(RRarray[0]);   //第一个进程进队列

    int MomentPoint = 0;
    int CurrentTime=0;
    int tempTime;   //控制CurrentTime的累加时间,当前进程的服务时间小于时间片q的时候,起到重要作用
    int i=1,j,k,p;  //指向还未处理的进程的下标
    int finalNumber = 0;   //执行RR算法后,进程的个数
    int Time[50];
    bool canAdd=false;//用于解决CurrentTime在第一个进程完成计算时多加了一次服务时间的问题

    //判断第一个进程的服务时间是否大于时间片,如果大于CurrentTime=q,如果小于CurrentTime=服务时间
    if (RRarray[0].ServiceTime>=q)
        CurrentTime = q;
    else
        CurrentTime = RRarray[0].ServiceTime;

    while(!
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值