要求:书写课程设计报告,报告中应该包含如下内容:
(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++的使用更加熟练了。

设计一个按照时间片轮转法实现处理机调度的程序相关推荐

  1. c语言设计一个按时间片轮转法实现处理器调度的程序,设计一个按时间片轮转法实现处理器调度的程序...

    实验一处理器调度 一.实习内容 选择一个调度算法,实现处理器调度. : 二.实习目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪进程个数大于处理器数时,就必须依照某种策略来决 ...

  2. (C++)一个按时间片轮转法实现进程调度的程序

    文章目录 前言 一.时间片轮转算法是什么? 二.使用步骤 1.题目要求 2.代码 前言 这是我大二时的操作系统实验代码,编程语言选择的是C++,编程环境是WIN10的vs2022 一.时间片轮转算法是 ...

  3. 计算机编程题目身高计算,VB1设计一个由输入身高计算标准体重的程序。计算公式为:男:标准体重(kg)=身高(cm)-100;- 一起装修网...

    VB1设计一个由输入身高计算标准体重的程序.计算公式为:男:标准体重kg=身高cm-100: 我来回答>> 百度用户(缘梦ym666) 浏览37次 2021-07-13 16:08 女:标 ...

  4. 排班系统c语言设计说明,帮我设计一个关于员工排班的C语言程序

    给你个c++版本做参考: #include #include #include #include int main(int argc,char *argv[]) { std::vector arr[7 ...

  5. 操作系统课程设计--模拟时间片轮转法

    课程设计题目 设计一个按照时间片轮转法实现处理机调度的程序. 实验内容 (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块的格式如下表所示,且参数意义也相同. 进程名 链 ...

  6. 操作系统课程设计-时间片轮转法

    一.课程设计题目及内容 设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下: (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块的 ...

  7. 时间片轮转法(c语言)

    一.实验目的及要求 题目一:设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下: (1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块 ...

  8. linux处理机调度实验报告,处理机调度试验

    <处理机调度试验>由会员分享,可在线阅读,更多相关<处理机调度试验(19页珍藏版)>请在人人文库网上搜索. 1.实验报告的基本内容及要求1实验预习在实验前每位同学都需要对本次实 ...

  9. linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告

    在采用多道系统的设计程序中,往往有若干进程同时处于就绪状态.当就绪状态进程数大于处理机数时,就必须按照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下处理机调度 处理机调度 一.实验目 ...

最新文章

  1. js中函数,方法,事件对比区分,什么是方法,什么是函数
  2. dora storm 文本_牛津版英语七年级下册课文文本.doc
  3. 第7章 Scrapy突破反爬虫的限制
  4. Java 算法 找素数
  5. C++static类静态成员函数及变量解析
  6. 宏碁Aspire 4560试用手记
  7. lte tm模式_LTE的几种模式介绍
  8. 广电行业编码传输系统调研
  9. I210 网卡设定 force link mode 并关闭 EEE mode
  10. 用Java做一个判断闰年和平年代码
  11. AD软件绘制stm32最小系统电路原理图与PCB图
  12. 在JS中如何获取时间以及转换时间
  13. 绘制森林资源图的工具介绍
  14. Excel数据透视表经典教程七《刷新及更改数据源》
  15. Proguard的介绍
  16. 中关村科技企业家协会网安创新分会在京成立,墨云科技成为首批会员单位
  17. C语言学生成绩管理系统源代码
  18. css中的伪元素、基线对齐、盒子模型
  19. 线性回归与岭回归以及LASSO回归结果比较
  20. 简单实现 飘浮 广告层特效

热门文章

  1. 设计一个Shape接口和它的两个实现类Square和Circle
  2. android自动弹出浏览器打开文件,android使用主流浏览器打开网页,无需弹出选择。...
  3. 30天自制操作系统——Day11实验报告
  4. BZOJ5084: hashit
  5. Linux学习笔记41——什么是 daemon 与服务 (service)
  6. 了解MSIL汇编和IL汇编评估堆栈
  7. Java实现将文本内容、网址链接url,生成二维码与反解析
  8. 如何获取SharePoint online(O365)的token
  9. 树莓派PICO入门:电脑连接简易树莓派PICO单片机,烧录,使用python进行简单代码操作。
  10. 美国家漏洞数据库显示苹果iOS漏洞最多