轮转调度算法(C语言实现)

轮转调度算法(RR算法)

  1. 基本思想:
    系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,将进程管道就绪队列的队尾,再把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片,以此类推。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理机时间。

  2. 实现方法:
    将进程按FCFS排成一个队列,每次调度取队首进程分配CPU,时间片到,将PCB挂到就绪队尾。

  3. 进程切换时机 
    在时间片轮转调度算法中,应在何时进行进程的切换,可分为两种情况:
    ① 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
    ② 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。

  4. 时间片大小的确定
    在轮转算法中,时间片的大小对系统性能有很大的影响。

    图1-1示出了时间片分别为q=1和q=4时对平均周转时间的影响。

图1-1 q=1和q=4时进程的周转时间
简单分析一下上图的算法:
当时间片为1的请况下,进程A首先到达开始占据cpu运行,当时间片用完后。进程B到达进程B开始占用cpu运行对应一个时间片的时间,依次类推就可算出最后每个进程的完成时间,知道完成时间后,就可算出周转时间和带权周转时间。
周转时间 =完成时间-到达时间
带权周转时间 = 周转时间/到达时间

还有需要注意这种情况:
时间片:2

进程 A B C D
到达时间 0 2 5 9
运行时间 4 4 4 4
周转时间 6 6 9 7
平均周转时间 1.50 1.50 2.25 1.75

运行过程:
A运行2,B运行2,C未到达,又运行A2,A结束,此时C已到达,但在队尾,还是运行B2,B结束,现在运行C2,此时D已到达,所以运行D2,再运行C2,最后运行D2,
可以计算出:
A结束是6,周转为6(6-0),
B结束是8,周转也是6(8-2),
C结束是14,周转9(14-5),
D结束是16,周转是7(16-9),
平均周转时间=(6+6+9+7)/4=7,
加权平均周转时间=(6/4+6/4+7/4+9/4)/4=1.75

	新到达的总是在队尾,B第一次运行完,C未到达,只能返回队首运行A,A运行完,又运行B,此时C虽然到达,但是在队尾(B之后)。注意队列机制,就容易理解了。

C语言代码实现

说明:为了简化程序,程序中并未使用队列实现,而是通过数组模拟队列的形式进行实现的。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define TAKEIN "takein" //对应进程的状态
#define WAIT "wait"
#define RUN "run"
#define FINISH "finish"
#define PNUMBER 5	//进程数量 
#define TRUE 1
#define FALSE 0


typedef struct pcd				//进程结构体 
{
   
	char processName[20]; 		//进程名称
	int arriveTime;				//进程到达时间
    int startTime;				//进程开始时间
    int endTime;				//进程结束时间
    int runTime;				//进程运行时间大小
    int turnOverTime;			//周转时间
    float userweightTurnOverTime;//带权周转时间
    char provessStatus[10];		//进程状态
    int runTimeed;				//进程已经运行的时间
    int bz;						//第一次运行标志位 
 } pcd;
 
 pcd pcds[PNUMBER]; 		//进程数组
 
 int currentTime = 0; 		//当前时间
 int processIndex = 0;		//进程编号
 int cpuTime = 4;			//时间片大小
 int size = PNUMBER;
  • 24
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
以下是时间片轮转调度算法C语言实现: ``` #include<stdio.h> struct process { int pid; //进程ID int burst; //进程的CPU时间 int remaining; //剩余CPU时间 int waiting; //等待时间 int turnaround; //周转时间 }; int main() { int n, quantum, i, j, time = 0, sum_turnaround = 0, sum_waiting = 0; struct process p[10], temp; //最多10个进程 float avg_turnaround, avg_waiting; printf("请输入进程个数:"); scanf("%d", &n); for(i = 0; i < n; i++) { printf("请输入进程%d的CPU时间:", i + 1); scanf("%d", &p[i].burst); p[i].pid = i + 1; p[i].remaining = p[i].burst; p[i].waiting = 0; p[i].turnaround = 0; } printf("请输入时间片大小:"); scanf("%d", &quantum); //时间片轮转调度算法 for(i = 0; n > 0;) { if(p[i].remaining <= quantum && p[i].remaining > 0) { time += p[i].remaining; p[i].remaining = 0; for(j = 0; j < n; j++) { if(j != i && p[j].remaining > 0) { p[j].waiting += p[i].burst; } } p[i].turnaround = time; sum_turnaround += p[i].turnaround; sum_waiting += p[i].waiting; n--; } else if(p[i].remaining > 0) { time += quantum; p[i].remaining -= quantum; for(j = 0; j < n; j++) { if(j != i && p[j].remaining > 0) { p[j].waiting += quantum; } } } i = (i + 1) % n; } //按照进程ID排序输出 for(i = 0; i < n; i++) { for(j = i + 1; j < n; j++) { if(p[i].pid > p[j].pid) { temp = p[i]; p[i] = p[j]; p[j] = temp; } } printf("进程%d的等待时间为%d,周转时间为%d\n", p[i].pid, p[i].waiting, p[i].turnaround); } avg_turnaround = (float)sum_turnaround / n; avg_waiting = (float)sum_waiting / n; printf("平均等待时间为%.2f,平均周转时间为%.2f\n", avg_waiting, avg_turnaround); return 0; } ``` 该程序首先输入进程个数、每个进程的CPU时间和时间片大小,然后使用时间片轮转调度算法进行调度。调度完成后,按照进程ID排序输出每个进程的等待时间和周转时间,并计算出平均等待时间和平均周转时间。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gussu-毛虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值