概述
这比起说是操作系统实验,不如说是一个模拟算法而已,
当然目标是为了让大家更清楚地了解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 nown", nowT);
printf("at time %d process %d has arraivedn",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 tickn", run,use[run]);
nowT += use[run];
use[run] = 0;
}else{
printf("now processing %d for %d tickn", run,TIMESLICE);
use[run] -= TIMESLICE;
nowT += TIMESLICE;
}
}
return 0;
}
测试
输入数据如下:
轮转时间片为1个单位时
轮转时间片为3个单位时
两者自然都是20时刻结束调度
结语
RR算法用队列直接模拟是相对很简单的,也很适合在考试时使用,但是其它的调度算法就不一定了,需要用辅助的数组存储信息之类的,符合原理地适时调整吧~
最后
以上就是舒服钢铁侠为你收集整理的操作系统笔记(6):RR轮转调度算法的全部内容,希望文章能够帮你解决操作系统笔记(6):RR轮转调度算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复