模拟时间片轮转算法(C++)
来源:互联网 发布:淘宝网人民法院拍卖 编辑:程序博客网 时间:2024/05/18 02:52
时间片轮转算法(RR,Round-Robin)
该算法采用剥夺策略。时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称RR调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
算法原理:让就绪进程以FCFS 的方式按时间片轮流使用CPU 的调度方式,即将系统中所有的就绪进程按照FCFS 原则,排成一个队列,每次调度时将CPU 分派给队首进程,让其执行一个时间片,时间片的长度从几个ms 到几百ms。在一个时间片结束时,发生时钟中断,调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程,进程可以未使用完一个时间片,就出让CPU(如阻塞)。
算法优点:时间片轮转调度算法的特点是简单易行、平均响应时间短。
算法缺点:不利于处理紧急作业。在时间片轮转算法中,时间片的大小对系统性能的影响很大,因此时间片的大小应选择恰当
怎样确定时间片的大小:
时间片大小的确定
1.系统对响应时间的要求
2.就绪队列中进程的数目
3.系统的处理能力
具体代码
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <vector>using namespace std;/************************************************************************//* 时间片轮转法(RR(Round Robin Method)) *//************************************************************************/// 定义时间片的结构体struct RR{ // 进程名称 char name[10]; // 到达时间 int daodatime; // 服务时间 int fuwutime; // 剩余时间 int shengyutime; // 所处状态 char *state; struct RR *next;};// 根据到达时间从小到大排序struct RR *input(){ int N, i; // 定义队首、队尾 struct RR *head, *rear; // p是队尾指针,q是队首指针,t是执行时间 struct RR *p, *q, *t; // 初始化队首和队尾为空 head = rear = NULL; printf("请输入进程数目:"); scanf("%d", &N); for(i = 0; i < N; i++) { // 初始化一个空间给进程 p = (struct RR *)malloc(sizeof(struct RR)); printf("请输入第%d个进程的名字、到达时间、服务时间(例如:1 2 1):\n", i+1); scanf("%s%d%d", p->name, &p->daodatime, &p->fuwutime); p->shengyutime = p->fuwutime; p->state = "就绪"; p->next = NULL; // 当输入结束时,把p的数据放到队首,以便下一步执行 if(rear == NULL) { head = p; p->next = NULL; rear = p; } // 否则执行时间为空,队首变成q else { t = NULL; q = head; // 当q和q的到达时间小于p的到达时间时,把执行时间给q while(q && q->daodatime < p->daodatime) { t = q; q = q->next; } // 当q是队首时,则下一个队首变成p,以便每个进程都能够得到时间片 if(q == head) { p->next = head; head = p; } // 当执行时间片到达队尾时(执行完成),返回给队首p else if(t == rear) { rear->next = p; p->next = NULL; rear = p; } // 否则给队首p占用执行时间,p执行完后到q else { t->next = p; p->next = q; } } } // 返回队首 return head;}// 输出void run(struct RR *head){ struct RR *p, *t, *r; int num; // 运行过程 vector<string> vec_out; printf("请输入时间片:"); scanf("%d", &num); // 当队首不为空时,把p给队首 while(head != NULL) { r = p = head; // 把执行时间给队首 while(p != NULL) { t = head; // p的剩余时间 = 剩余时间 - 时间片 p->shengyutime = p->shengyutime - num; p->state = "运行"; string s = p->name; vec_out.push_back(s); // 当p运行完,即剩余时间小于0时,仍然把它当做0处理 if(p->shengyutime < 0) p->shengyutime = 0; printf("\n************程序开始运行*****************\n"); printf("进程 到达时间 服务时间 剩余时间 当前状态\n"); //时间不为空时,输出当前进程的信息,并把时间片交给下一个进程 while(t != NULL) { printf("%2s%8d%8d%14d%10s\n", t->name, t->daodatime, t->fuwutime, t->shengyutime, t->state); t = t->next; } //按住回车键观看 //getchar(); //当队首的剩余时间为0时,先把队首改成p的下一个,然后释放内存,删除队首节点 if(p->shengyutime == 0) { if(p == head) { head = p->next; free(p); p = head; } //否则返回执行,把队尾的下一个指针变成p的下一个指针,队尾的位置移动到队首 else { r->next = p->next; p = r->next; r = p; } } //否则把队首的位置给队尾,把队首的状态显示为“就绪”状态 else { r = p; p->state = "就绪"; p = p->next; } } } printf("执行顺序:\n"); printf("%s", vec_out[0].c_str()); for(int i = 1; i < vec_out.size(); i++) { printf("-->%s", vec_out[i].c_str()); }}void RR_MAIN(){ //定义时间片的队首结构体 struct RR *head; // 队首执行的时间 head = input(); run(head);}int main(){ RR_MAIN(); return 0;}
输出实例
0 0
- 模拟时间片轮转算法(C++)
- C # 时间片轮转算法
- 时间片轮转调度算法的C语言模拟实现
- 时间片轮转算法
- 时间片轮转算法和优先级调度算法 C语言模拟实现
- 时间片轮转算法和优先级调度算法 C语言模拟实现
- 模拟时间片轮转法
- 操作系统——模拟时间片轮转调度算法
- 时间片轮转调度算法
- 时间片轮转调度算法
- 时间片轮转调度算法
- 时间片轮转调度算法
- c++模拟操作系统进程调度算法(优先数,时间片轮转)
- 模拟时间片轮转的JavaScript实现
- 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)
- 时间片轮转调度算法(C++代码)
- 优先级的时间片轮转算法(操作系统实验)
- 进程调度(二)——时间片轮转算法
- C++实现ATM机
- kafka客户端封装
- 线程池工作机制和原理
- Longest Palindrome问题及解法
- 编码相关问题整理
- 模拟时间片轮转算法(C++)
- JavaScript基础
- vs2010添加外部头文件
- invokevirtual、invokespecial、invokestatic、invokeinterface、invokedynamic介绍
- 单例模式
- Binary Watch问题及解法
- 安卓开发中将activity设成translucent导致输入法遮挡edittext,windowSoftInputMode设置无效问题
- ORA 各种oraclesql错误
- ACdream 1031 Cut