设计一个按照时间片轮转法实现处理机调度的程序
要求:书写课程设计报告,报告中应该包含如下内容:
(1)课程设计题目及内容
题目一:设计一个按照时间片轮转法实现处理机调度的程序
时间片轮转法实现处理机调度的程序设计提示如下:
(1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。
(2)按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)执行处理机调度时,首先选择队首的第一个进程运行。
(4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:1)估计运行时间减1;
2)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
(6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
(2)程序中使用的数据结构及主要符号说明
int PCBNum; //总进程数
#define Maxsize 50 //最大进程数
int t_time = 0; //系统时间
typedef struct PNode
{char name[10]; //定义进程名,并分配空间int Arr_Time; //定义到达时间int ready_Time; //定义运行时间char state; //定义进程状态R(就绪)/F(运行)/C(完成)
}PNode;
typedef struct
{PNode *data; PNode* ready;int datafront, datarear; //数据存储队列队首队尾int readyfront, readyrear; //就绪队列队首队尾
}SqPCB;
(3)程序流程图和带有注释的源程序
程序流程图:
源程序:
#include<iostream>
#include<time.h>
#include<string>
#include<string.h>
using namespace std;
int PCBNum; //总进程数
#define Maxsize 50 //最大进程数
int t_time = 0; //系统时间
typedef struct PNode
{char name[10]; //定义进程名,并分配空间int Arr_Time; //定义到达时间int ready_Time; //定义运行时间char state; //定义进程状态R(就绪)/F(运行)/C(完成)
}PNode;
typedef struct
{PNode *data; PNode* ready;int datafront, datarear; //数据存储队列队首队尾int readyfront, readyrear; //就绪队列队首队尾
}SqPCB;
void lnitPCB(SqPCB& H)//初始化就绪队列
{cout << "请输入总进程个数:";cin >> PCBNum; ///进程总个数cout << endl;int Num = PCBNum;H.datafront = 0; //初始化数据存储队列队首H.datarear = 0; //初始化数据存储队列队尾H.readyfront = 0; //初始化就绪队列队首H.readyrear = 0; //初始化就绪队列队尾H.data = (PNode*)malloc(Maxsize * sizeof(PNode));H.ready = (PNode*)malloc(Maxsize * sizeof(PNode));char ch[10] = { 'A' };PNode p;srand((unsigned)time(NULL));cout << "总进程个数为" << PCBNum << "个,请输入各个进程的名字(由于是模拟程序,到达时间和运行时间由随机数生成)" << endl;while (Num--){strcpy_s(p.name, ch);ch[0] = ch[0] + 1;p.Arr_Time = rand() % 8 + 1;p.ready_Time = rand() % 10 + 1;p.state = 'R';H.data[H.datarear] = p;H.datarear = (H.datarear + 1) % Maxsize;}cout << endl;
}
void show(SqPCB& H)
{cout << "进程信息" << endl;int i = H.datafront;while(i!=H.datarear){cout << "进程名:" << H.data[i].name<< "\t到达时间:" << H.data[i].Arr_Time<< "\t运行时间:" << H.data[i].ready_Time<< "\t进程状态:" << H.data[i].state << endl;i = (i + 1) % Maxsize;}cout << endl;
}
void showready(SqPCB& H)//打印就绪队列
{cout << "就绪队列内进程信息(按处理机调度顺序)" << endl;int i = H.readyfront;if (H.readyfront == H.readyrear){cout << "就绪队列为空!!!";}while (i != H.readyrear){cout << "进程名:" << H.ready[i].name<< "\t到达时间:" << H.ready[i].Arr_Time<< "\t运行时间:" << H.ready[i].ready_Time<< "\t进程状态:" << H.ready[i].state << endl;i = (i + 1) % Maxsize;}cout << endl;
}
void sort(SqPCB& H)
{for (int i = 0; i < PCBNum; i++){for (int j = 0; j < PCBNum - 1 - i; j++){if (H.data[j].Arr_Time > H.data[j + 1].Arr_Time){PNode temp;strcpy(temp.name, H.data[j].name);temp.Arr_Time = H.data[j].Arr_Time;temp.ready_Time = H.data[j].ready_Time;strcpy(H.data[j].name, H.data[j + 1].name);H.data[j].Arr_Time = H.data[j+1].Arr_Time;H.data[j].ready_Time = H.data[j+1].ready_Time;strcpy(H.data[j+1].name, temp.name);H.data[j + 1].Arr_Time = temp.Arr_Time;H.data[j+1].ready_Time = temp.ready_Time;}}}cout << "***********************************************************************" << endl;cout << "排序之后的进程运行顺序:" << endl;show(H);
}
void SJP_Simulator(SqPCB& H)
{int* flag = new int[PCBNum];int x = 0;int o = H.datarear - H.datafront;while (x!=PCBNum)//如果进程都执行完毕则结束循环{while (o)//判断是否有新的进程同时到达{if (t_time >= H.data[H.datafront].Arr_Time && H.datafront != H.datarear)//判断是否有新的进程到达{flag[H.datafront] = 1;PNode temp;strcpy(temp.name, H.data[H.datafront].name); //就绪队列入队temp.Arr_Time = H.data[H.datafront].Arr_Time; //用temp结点存储数据temp.ready_Time = H.data[H.datafront].ready_Time;temp.state = H.data[H.datafront].state;H.ready[H.readyrear] = temp; //进程进入就绪队列队尾H.readyrear = (H.readyrear + 1) % Maxsize; //队尾后移H.datafront++; //数据存储队列队首后移}o--;}o = H.datarear - H.datafront;if (H.readyfront != H.readyrear)//就绪队列不为空{if (H.ready[H.readyfront].ready_Time != 1){cout << "--------------------------------系统时间为:" << t_time << "---------------------------------------" << endl;cout << "当前运行的进程为:" << H.ready[H.readyfront].name << endl;cout << "该进程时间片用完后运行时间由" << H.ready[H.readyfront].ready_Time << "变为" << H.ready[H.readyfront].ready_Time - 1 << endl;H.ready[H.readyfront].ready_Time--;//运行时间-1H.ready[H.readyfront].state = 'F';//更改进程状态为运行状态"F"showready(H);H.ready[H.readyfront].state = 'R';//运行完之后更改进程状态为就绪状态"R"H.ready[H.readyrear] = H.ready[H.readyfront]; //将运行完之后的进程插入就绪队列队尾H.readyrear = (H.readyrear + 1) % Maxsize; //就绪队列队尾后移H.readyfront = (H.readyfront + 1) % Maxsize; //就绪队列队首后移}else if (H.ready[H.readyfront].ready_Time == 1){cout << "--------------------------------系统时间为:" << t_time << "---------------------------------------" << endl;cout << "当前运行的进程为:" << H.ready[H.readyfront].name << endl;cout << "该进程时间片用完后运行时间由" << H.ready[H.readyfront].ready_Time << "变为" << H.ready[H.readyfront].ready_Time - 1 << endl;cout << "进程" << H.ready[H.readyfront].name << "执行完毕!!" << endl;x++;H.ready[H.readyfront].state = 'C';//进程状态置为完成状态"C"H.ready[H.readyfront].ready_Time--;//运行时间-1showready(H);H.readyfront = (H.readyfront + 1) % Maxsize; //令该进程出队 }}else{cout << "--------------------------------系统时间为:" << t_time << "---------------------------------------" << endl;showready(H);}t_time++;//系统时间+1}cout << "--------------------------------全部进程运行完毕!!--------------------------------" << endl;
}
int main()
{SqPCB A;lnitPCB(A); //数据初始化show(A); //打印sort(A); //排序SJP_Simulator(A); //时间片轮转法
}
(4)执行程序,并打印程序运行时的初值和运算结果
运行程序,输入总进程个数,程序自动模拟生成进程信息
结果进程全部运行成功
(5)实验结果分析,实验收获和体会
进程信息系统模拟生成后会按照到达时间进行排序
当系统时间为0时,没有进程到达,此时就绪队列为空
当系统时间为1时,进程B到达,将进程C调入处理器运行,进程状态更改为‘F’(运行中),运行时间减1,运行完进程状态更改为‘R’(就绪)后调入就绪队列队尾,
当系统时间为3时,进程G到达,将进程G调入就绪队列队尾,此时队首为进程B,所以进程B调入处理器运行,进程状态更改为‘F’,运行时间减1,运行完后进程状态更改为‘R’(就绪)调入就绪队列队尾
当系统时间为4时,此前因为进程B运行完,调入就绪队列队尾,进程E到达,将进程E调入就绪队列队尾,此时队首为进程G,将进程G调入处理器运行,进程状态更改为‘F’,运行时间减1,运行完进程状态更改为‘R’(就绪)后调入就绪队列队尾
当系统时间为10时,进程E运行时间减为0后,进程E运行完毕,将进程E的进程状态更改为‘C’(完成),然后将其调出队列
当最后一个进程运行完毕后,全部进程运行完毕
收获和体会:
通过这次实验,加深了对时间片轮法的理解,对于就绪态,运行态的转换的认识更加深刻,同时对于数据结构队列的知识又复习了一遍,实验中出现了许多问题,如数组越界,内存泄漏,字符串string类的使用,对于这些问题又重新温习了一边,对于C++的使用更加熟练了。
设计一个按照时间片轮转法实现处理机调度的程序相关推荐
- c语言设计一个按时间片轮转法实现处理器调度的程序,设计一个按时间片轮转法实现处理器调度的程序...
实验一处理器调度 一.实习内容 选择一个调度算法,实现处理器调度. : 二.实习目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪进程个数大于处理器数时,就必须依照某种策略来决 ...
- (C++)一个按时间片轮转法实现进程调度的程序
文章目录 前言 一.时间片轮转算法是什么? 二.使用步骤 1.题目要求 2.代码 前言 这是我大二时的操作系统实验代码,编程语言选择的是C++,编程环境是WIN10的vs2022 一.时间片轮转算法是 ...
- 计算机编程题目身高计算,VB1设计一个由输入身高计算标准体重的程序。计算公式为:男:标准体重(kg)=身高(cm)-100;- 一起装修网...
VB1设计一个由输入身高计算标准体重的程序.计算公式为:男:标准体重kg=身高cm-100: 我来回答>> 百度用户(缘梦ym666) 浏览37次 2021-07-13 16:08 女:标 ...
- 排班系统c语言设计说明,帮我设计一个关于员工排班的C语言程序
给你个c++版本做参考: #include #include #include #include int main(int argc,char *argv[]) { std::vector arr[7 ...
- 操作系统课程设计--模拟时间片轮转法
课程设计题目 设计一个按照时间片轮转法实现处理机调度的程序. 实验内容 (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块的格式如下表所示,且参数意义也相同. 进程名 链 ...
- 操作系统课程设计-时间片轮转法
一.课程设计题目及内容 设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下: (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块的 ...
- 时间片轮转法(c语言)
一.实验目的及要求 题目一:设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下: (1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块 ...
- linux处理机调度实验报告,处理机调度试验
<处理机调度试验>由会员分享,可在线阅读,更多相关<处理机调度试验(19页珍藏版)>请在人人文库网上搜索. 1.实验报告的基本内容及要求1实验预习在实验前每位同学都需要对本次实 ...
- linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告
在采用多道系统的设计程序中,往往有若干进程同时处于就绪状态.当就绪状态进程数大于处理机数时,就必须按照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下处理机调度 处理机调度 一.实验目 ...
最新文章
- js中函数,方法,事件对比区分,什么是方法,什么是函数
- dora storm 文本_牛津版英语七年级下册课文文本.doc
- 第7章 Scrapy突破反爬虫的限制
- Java 算法 找素数
- C++static类静态成员函数及变量解析
- 宏碁Aspire 4560试用手记
- lte tm模式_LTE的几种模式介绍
- 广电行业编码传输系统调研
- I210 网卡设定 force link mode 并关闭 EEE mode
- 用Java做一个判断闰年和平年代码
- AD软件绘制stm32最小系统电路原理图与PCB图
- 在JS中如何获取时间以及转换时间
- 绘制森林资源图的工具介绍
- Excel数据透视表经典教程七《刷新及更改数据源》
- Proguard的介绍
- 中关村科技企业家协会网安创新分会在京成立,墨云科技成为首批会员单位
- C语言学生成绩管理系统源代码
- css中的伪元素、基线对齐、盒子模型
- 线性回归与岭回归以及LASSO回归结果比较
- 简单实现 飘浮 广告层特效
热门文章
- 设计一个Shape接口和它的两个实现类Square和Circle
- android自动弹出浏览器打开文件,android使用主流浏览器打开网页,无需弹出选择。...
- 30天自制操作系统——Day11实验报告
- BZOJ5084: hashit
- Linux学习笔记41——什么是 daemon 与服务 (service)
- 了解MSIL汇编和IL汇编评估堆栈
- Java实现将文本内容、网址链接url,生成二维码与反解析
- 如何获取SharePoint online(O365)的token
- 树莓派PICO入门:电脑连接简易树莓派PICO单片机,烧录,使用python进行简单代码操作。
- 美国家漏洞数据库显示苹果iOS漏洞最多