要求:书写课程设计报告,报告中应该包含如下内容:
(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. androidx FloatingActionButton 中间加载的图片显示黑色
  2. Linux学习(一)--目录结构
  3. python输出文本-使用python输出指定格式文本的内容
  4. Cisco ASA 5500系列防火墙 Series Adaptive Security Appliances
  5. python的threading库_python标准库介绍——31 threading 模块详解
  6. android微信支付服务端,Android 微信支付返回-1
  7. CVE-2021-41773 CVE-2021-42013 Apache HTTPd最新RCE漏洞复现 目录穿越漏洞
  8. html表格内文字置顶,css如何让table里的字居中?
  9. 谈谈asp.net中的% %,%= %,%# %%$ %的使用
  10. 使用 Gatsby.js 搭建静态博客 2 实现分页
  11. XNA 三维入门讲解
  12. 区块链 用户身份权限模式 方案
  13. cas4实现sso(一)cas简介
  14. K近邻算法与K均值算法的区别
  15. matlab 交互效应三维图,【MATLAB】使用MATLAB绘制心理学中的交互作用图
  16. 交付管理——怎样写用户手册
  17. 从铁路订票系统问题看应用监控的作用
  18. Python定时爬虫脚本
  19. mysql latch和缓存关系_latch:cachebufferschains等待事件导致的latch争用的原理原因与...
  20. ctor/dtor 与线程安全

热门文章

  1. Mars3D开发基础学习:矢量图层
  2. 卡方分布Chi-squared Distribution
  3. 手撕龙书 第一章 认识编译器
  4. MongoDB可视化工具robomongo走起~
  5. JAVA,中使用do - while格式 得出5的阶乘
  6. 倉頡造字(歌詞+注釋)
  7. 成都UI设计培训机构如何选择?
  8. 乐鑫(ESPRESSIF) ESP32 ESP-IDF设置环境变量出现“安全频道支持出错”问题的解决办法
  9. 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档)
  10. LiteOS内核开发(二)