操作系统笔记(6):RR轮转调度算法

这比起说是操作系统实验,不如说是一个模拟算法而已,
当然目标是为了让大家更清楚地了解RR轮转调度算法原理

原理上,书上课上都讲过,实现方式上推荐直接模拟一个队列(本来就应该是这样实现的)http://c.biancheng.net/view/1247.html

下面详解一下模拟过程:

这里宏变量TIMESLICE决定轮转的一次时间片长度单位
首先读入数据,
n为总的进程数量,
arr数组中存放各进程到达时刻
use数组中存放各进程需要的服务时间

que队列,h、t是队列头尾下标,当然由于设计成循环队列,要对队列长取模才是实际的下标。

nowT为当前时刻,arrPtr为依次到达的进程下标
run为上一时间单位运行的进程下标

在具体模拟中while(nowT<=1000)
首先判断有无新进程到达,有的话依次加入到队列尾部
随后如果上一个进程未结束,是被别的进程抢占了,那么它自己还需要的服务时间不为0,那么放回队列尾。
后取出队列头代表的进程,分别处理 能在一个时间片内做完和不能的情况
当然取不出来就空过一个时间单位。

#include<stdio.h>

#define F(i,a,b) for(int i=a;i<=b;i++)
#define MAXN 500
#define TIMESLICE 1
int main(){
    int n;
    scanf("%d",&n);
    int arr[MAXN];
    int use[MAXN];
    F(i,1,n){
        scanf("%d%d",arr+i, use+i);
    }

    int h=0,t=0;
    int que[MAXN];
    
    int nowT=0;int arrPtr = 1;int run=0;
    while(nowT <= 1000){
        while(arr[arrPtr]<=nowT && arrPtr<=n){   //先看有无当前时刻到达的新进程,加入队列
            printf("its %d now\n", nowT);
            printf("at time %d process %d has arraived\n",arr[arrPtr], arrPtr);
            que[t % MAXN] = arrPtr;
            arrPtr++;
            t += 1;
        }
       if (run!=0){ //新进程加入后再把老进程加入队列
            if(use[run]){
                que[t] = run;
                t += 1;
            }
       } 
       if(h == t) {nowT++;continue;}//队列为空,没有进程要调度,空过
       printf("its %d now the que is :",nowT);
       F(i,h,t-1){printf(" %d ",que[i % MAXN]);}printf("\n");
       run = que[h % MAXN];
       h += 1;
       if(use[run]<TIMESLICE){
            printf("now processing %d for %d tick\n", run,use[run]);
            nowT += use[run];
            use[run] = 0;
       }else{
            printf("now processing %d for %d tick\n", run,TIMESLICE);
            use[run] -= TIMESLICE;
            nowT += TIMESLICE;
       }
    }
    

    return 0;
}

测试

输入数据如下:
在这里插入图片描述
轮转时间片为1个单位时
在这里插入图片描述

轮转时间片为3个单位时
在这里插入图片描述
两者自然都是20时刻结束调度

结语

RR算法用队列直接模拟是相对很简单的,也很适合在考试时使用,但是其它的调度算法就不一定了,需要用辅助的数组存储信息之类的,符合原理地适时调整吧~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值