`

课程设计1

    博客分类:
  • java
阅读更多

采用的是C++语言编写的,但PCB的数据结构是符合要求的。

题目1:模拟进程调度
一、设计目的
1、理解PCB
2、理解进程的并发执行
3、理解进程的FCFS、动态优先权和时间片轮转三种调度算法,并模拟实现这三种算法
二、设计要求
1、PCB在本设计中的基本结构
Typedefstructnode
{
Char name[10];/*进程标识符*/
Int prin;/*进程的优先级*/
Int round;/*进程轮转的时间片*/
Int needtime;/*进程还需要的cpu时间*/
Int waittime;/*进程进入系统后等待cpu的时间*/
Char state;/*进程的状态*/
Struct node *next;/*链接指针*/
}PCB
设计三个队列:就绪、完成、运行,其中运行队列中应该只有一个进程。
创建进程,就是用户输入进程的标识符和运行所需时间,系统为其生成一个PCB,存放进程的信息,将新生成的PCB插入就绪队列。进程任务结束,系统将其PCB插入完成队列,该进程就消亡。
2、动态优先权调度算法模拟:
优先权= 1 + 等待时间/需要服务时间----最高响应比优先
(1) 输入一批作业的进程标识和估计运行时间,将其PCB插入就绪队列
(2) 当就绪队列非空、CPU空闲时,计算出每个就绪进程的优先权
(3) 将优先权最高的进程从就绪队列移入运行队列,状态改为运行
(4) 在屏幕上输出当前所有进程的状态和优先权信息(已完成进程不需此项)
(5) 让运行进程执行足够的服务时间
(6) 将运行进程移入完成队列
(7) 提示可以输入新的作业,如果有新作业输入,则转向(1) ,否则转向(2)
(8) 如果就绪队列为空,则结束
3、时间片轮转调度算法模拟
输入一批作业的进程标识和估计运行时间,由其PCB组成就绪队列。时间片轮转调度,系统要给就绪队列的第一个进程分配一个时间片,大小等于n (个时钟周期),再将它移入运行队列。注意,时间片的大小要比大多数进程的估计运行时间短。当时间片结束的时候,要将没有运行完的进程从运行队列移到就绪队列的末尾,再次进行调度。在每次调度时将所有进程的当前情况显示出来。
4、FCFS调度算法模拟
按一定的顺序输入一批作业的进程标识和估计运行时间,由其PCB按照进程标识输入的顺序组成就绪队列。当就绪队列非空、CPU空闲时,将就绪队列的第一个进程从就绪队列移入运行队列,状态改为运行。以后个步骤类似于2。

把源码也贴下来吧!!!

Code:
  1. /***********模拟进程调度2009.12.30biao************/
  2. #include"stdafx.h"
  3. #include<stdio.h>
  4. #include<iostream>
  5. #include<string>
  6. #include<windows.h>
  7. #include<ctype.h>
  8. #include<iomanip>
  9. #defineMAX10//最大进程数
  10. #defineROUND2//进程时间片默认为2
  11. intflag;
  12. intamount;
  13. intflagf=0;
  14. usingnamespacestd;
  15. classPCB
  16. {
  17. stringname;/*进程标识符*/
  18. floatprin;/*进程的优先级*/
  19. intround;/*进程轮转的时间片*/
  20. floatneedtime;/*进程还需要的cpu时间*/
  21. floatwaittime;/*进程进入系统后等待cpu的时间*/
  22. stringstate;/*进程的状态*/
  23. public:
  24. voidsetname(){
  25. stringm;
  26. cout<<"标识符:";
  27. cin>>m;
  28. name=m;
  29. }
  30. voidsetprin(floatp){
  31. prin=p;
  32. }
  33. voidsetround(){
  34. round=ROUND;
  35. }
  36. voidsetround(intr){
  37. round=r;
  38. }
  39. voidsetneedtime(){
  40. floatn;
  41. cout<<"执行时间:";
  42. cin>>n;
  43. needtime=n;
  44. }
  45. voidsetneedtime(floatt){
  46. needtime=t;
  47. }
  48. voidsetwaittime(floatw){
  49. waittime=w;
  50. }
  51. voidsetstate(strings){
  52. state=s;
  53. }
  54. stringgetname(){
  55. returnname;
  56. }
  57. floatgetprin(){
  58. returnprin;
  59. }
  60. intgetround(){
  61. returnround;
  62. }
  63. floatgetneedtime(){
  64. returnneedtime;
  65. }
  66. floatgetwaittime(){
  67. returnwaittime;
  68. }
  69. stringgetstate(){
  70. returnstate;
  71. }
  72. };
  73. classpro{/*一批进程*/
  74. private:
  75. PCBproready[MAX];
  76. PCBrunpro;
  77. PCBfinishpro[MAX];
  78. public:
  79. intinput(){
  80. //booltestName;//作为测试进程唯一的标志。
  81. stringyes;
  82. stringst1="ready";
  83. cout<<endl;
  84. cout<<"请输入进程数量(最大进程数为10):"<<endl;
  85. cin>>amount;
  86. while(amount<=0||amount>21){
  87. cin.clear();
  88. cin.ignore(1000,'/n');
  89. cout<<"请输入合法进程数量!"<<endl;
  90. cin>>amount;
  91. }
  92. cout<<"选择调度算法:1.动态优先权2.时间片轮转3.FCFS"<<endl;
  93. cin>>flag;
  94. while(flag!=1&&flag!=2&&flag!=3){
  95. cin.clear();
  96. cin.ignore(1000,'/n');
  97. cout<<"选择调度算法:1.动态优先权2.时间片轮转3.FCFS"<<endl;
  98. cin>>flag;
  99. }
  100. if(flag==1){//动态优先权
  101. for(intj=0;j<amount;j++){
  102. proready[j].setname();
  103. testName1(proready,j);
  104. proready[j].setneedtime();
  105. proready[j].setwaittime(0);
  106. proready[j].setround(0);
  107. proready[j].setstate(st1);
  108. proready[j].setprin(1);
  109. cout<<endl;
  110. }
  111. cout<<"*************执行动态优先权排列插入就绪队列**************"<<endl;
  112. dynamicsort(proready,amount);
  113. show(proready,amount);
  114. cout<<endl;
  115. dynamicrun(proready,amount);
  116. }
  117. elseif(flag==2){
  118. for(intj=0;j<amount;j++){
  119. proready[j].setname();
  120. testName1(proready,j);
  121. proready[j].setprin(j);
  122. proready[j].setneedtime();
  123. proready[j].setwaittime(0);
  124. proready[j].setround();
  125. proready[j].setstate(st1);
  126. cout<<endl;
  127. }
  128. cout<<"*************算法:时间片轮转执行调度的就绪队列**********"<<endl;
  129. show(proready,amount);
  130. cout<<endl;
  131. timeround(proready,amount);
  132. }
  133. elseif(flag==3){
  134. for(intj=0;j<amount;j++){
  135. proready[j].setname();
  136. testName1(proready,j);
  137. proready[j].setprin(j);
  138. proready[j].setneedtime();
  139. proready[j].setwaittime(0);
  140. proready[j].setround(0);
  141. proready[j].setstate(st1);
  142. cout<<endl;
  143. }
  144. cout<<"*************算法:FCFS执行调度的就绪队列**********"<<endl;
  145. show(proready,amount);
  146. cout<<endl;
  147. FCFS(proready,amount);
  148. }
  149. cout<<endl;
  150. cout<<"继续?(Y/N):";
  151. cin>>yes;
  152. if(yes=="Y"||yes=="y"){
  153. return1;
  154. }
  155. else{
  156. return0;
  157. }
  158. }
  159. voidtestName1(PCBproready[],intj){//判断进程名的唯一性
  160. booltestName=true;
  161. while(testName){
  162. if(j>0){
  163. for(inti=0;i<j;i++){
  164. if(proready[j].getname()==proready[i].getname()){
  165. cout<<"在就绪队列中,已存在该进程名,请重新输入进程名."<<endl;
  166. proready[j].setname();
  167. break;
  168. }else{
  169. testName=false;
  170. }
  171. }
  172. }else
  173. testName=false;
  174. }
  175. }
  176. voiddynamicsort(PCBproready[],inti){//动态排列就绪队列
  177. PCBtemp1;
  178. for(intj=0;j<i;j++){
  179. for(intk=0;k<i;k++){
  180. if(proready[k].getprin()<proready[k+1].getprin()){
  181. temp1=proready[k];
  182. proready[k]=proready[k+1];
  183. proready[k+1]=temp1;
  184. }
  185. }
  186. }
  187. }
  188. voidshow(PCBpro1[],inti){//显示进程信息
  189. cout<<"name"<<setw(10)<<"prin"<<setw(10)<<"round"<<setw(10)<<"needtime"<<setw(10)<<"waittime"<<setw(10)<<"state"<<endl;
  190. for(intj=0;j<i;j++){
  191. if(pro1[j].getstate()=="run"){
  192. cout<<setw(2)<<pro1[j].getname()<<setw(10)<<pro1[j].getprin()<<setw(10)<<pro1[j].getround()<<setw(10)<<pro1[j].getneedtime()<<setw(10)<<pro1[j].getwaittime()<<setw(10)<<pro1[j].getstate()<<endl;
  193. }elseif(pro1[j].getstate()=="ready"){
  194. cout<<setw(2)<<pro1[j].getname()<<setw(10)<<pro1[j].getprin()<<setw(10)<<pro1[j].getround()<<setw(10)<<pro1[j].getneedtime()<<setw(10)<<pro1[j].getwaittime()<<setw(12)<<pro1[j].getstate()<<endl;
  195. }
  196. else{
  197. cout<<setw(2)<<pro1[j].getname()<<setw(10)<<pro1[j].getprin()<<setw(10)<<pro1[j].getround()<<setw(10)<<pro1[j].getneedtime()<<setw(10)<<pro1[j].getwaittime()<<setw(14)<<pro1[j].getstate()<<endl;
  198. }
  199. }
  200. }
  201. voidadd(intm){//在队列尾巴添加进程
  202. if(m+1>=MAX){
  203. cout<<"就绪队列已满,不能再增加进程!"<<endl;
  204. exit(1);
  205. }
  206. stringst1="ready";
  207. proready[m+1].setstate(st1);
  208. if(flag==1){
  209. proready[m+1].setname();
  210. proready[m+1].setneedtime();
  211. proready[m+1].setround(0);
  212. proready[m+1].setprin(1);
  213. dynamicsort(proready,m+1);//加入动态分配中
  214. }
  215. elseif(flag==2){
  216. proready[m+1].setname();
  217. proready[m+1].setneedtime();
  218. proready[m+1].setround();
  219. proready[m+1].setwaittime(0);
  220. proready[m+1].setprin(m+1);
  221. }
  222. elseif(flag==3){
  223. proready[m+1].setname();
  224. proready[m+1].setround(0);
  225. proready[m+1].setneedtime();
  226. proready[m+1].setwaittime(0);
  227. proready[m+1].setprin(proready[m].getprin()+1);
  228. }
  229. }
  230. voiddynamicrun(PCBproready[],intamount){//动态优先权run
  231. inta1=amount;
  232. inti=1;
  233. intk=0;
  234. stringa,st3="finished";
  235. PCBtemp1;
  236. while(a1>0){
  237. cout<<endl;
  238. cout<<"进程第"<<i<<"次调度"<<endl;
  239. runpro=proready[0];
  240. temp1=proready[0];
  241. /*输出运行时的进程*/
  242. proready[0].setstate("run");
  243. cout<<"**********插入运行队列,进行处理**************"<<endl;
  244. show(proready,1);
  245. for(intj=0;j<a1-1;j++){//对所有的PCB的等待时间加上运行的时间同时修改优先级
  246. proready[j]=proready[j+1];
  247. proready[j].setwaittime(proready[j].getwaittime()+runpro.getneedtime());
  248. proready[j].setprin(1+proready[j].getwaittime()/proready[j].getneedtime());
  249. }
  250. cout<<endl;
  251. Sleep(runpro.getneedtime());
  252. cout<<"**********运行完成,插入完成队列**************"<<endl;
  253. finishpro[k]=temp1;
  254. finishpro[k].setstate(st3);
  255. show(finishpro,k+1);
  256. k++;
  257. cout<<endl;
  258. a1--;
  259. cout<<"是否添加新进程?(Y/N):";
  260. cin>>a;
  261. if(a=="Y"||a=="y"){
  262. add(a1-1);
  263. a1++;
  264. }
  265. if(a1>0){
  266. dynamicsort(proready,a1);
  267. cout<<"******重新分配优先权后的就绪队列*******"<<endl;
  268. show(proready,a1);
  269. }
  270. i++;
  271. }
  272. }
  273. voidFCFS(PCBproready[],intamount){
  274. inta1=amount;
  275. inti=1;
  276. intk=0;
  277. stringa,st3="finished";
  278. PCBtemp1;
  279. while(a1>0){
  280. cout<<"进程第"<<i<<"次调度"<<endl;
  281. runpro=proready[0];
  282. temp1=proready[0];
  283. proready[0].setstate("run");
  284. cout<<"**********插入运行队列,进行处理**************"<<endl;
  285. show(proready,1);
  286. Sleep(runpro.getneedtime());
  287. for(intj=0;j<a1-1;j++){
  288. proready[j]=proready[j+1];
  289. proready[j].setwaittime(proready[j].getwaittime()+runpro.getneedtime());
  290. }
  291. cout<<"**********运行完成,插入完成队列**************"<<endl;
  292. finishpro[k]=temp1;
  293. finishpro[k].setstate(st3);
  294. a1--;
  295. show(finishpro,k+1);
  296. k++;
  297. cout<<endl;
  298. cout<<"**************就绪队列****************"<<endl;
  299. show(proready,a1);
  300. cout<<"是否添加新进程?(Y/N):";
  301. cin>>a;
  302. if(a=="Y"||a=="y"){
  303. add(a1-1);
  304. a1++;
  305. }
  306. i++;
  307. }
  308. }
  309. voidtimeround(PCBproready[],intamount){//时间片轮转调度算法
  310. inti=1;//进程调度次数
  311. floattime;
  312. floatt=0;
  313. inta1=amount;//记录剩余进程
  314. boolt1=true;
  315. stringst2="run",st3="finished";
  316. intflag1=0;
  317. while(t1){
  318. PCBtemp1;
  319. cout<<endl;
  320. cout<<"进程第"<<i<<"次调度"<<endl;
  321. runpro=proready[0];
  322. runpro.setstate(st2);
  323. temp1=proready[0];
  324. proready[0].setstate("run");
  325. cout<<"**********插入运行队列,进行处理**************"<<endl;
  326. show(proready,1);
  327. Sleep(runpro.getround());
  328. for(intj=0;j<a1-1;j++){//前移就绪队列,并修改等待时间
  329. proready[j]=proready[j+1];
  330. proready[j].setwaittime(proready[j].getwaittime()+runpro.getround());
  331. }
  332. time=temp1.getneedtime()-temp1.getround();//减去此次CPU给的时间片,并判断。
  333. if(time<=0){
  334. finishpro[flag1]=runpro;
  335. finishpro[flag1].setneedtime(t);
  336. finishpro[flag1].setstate(st3);
  337. flag1++;
  338. a1--;
  339. if(a1<=0)t1=false;
  340. }
  341. else{
  342. proready[a1-1]=temp1;
  343. proready[a1-1].setwaittime(t);
  344. proready[a1-1].setneedtime(time);
  345. }
  346. if(flag1>0){//如果完成队列不为空,才打印完成队列的情况
  347. cout<<"****************完成队列******************"<<endl;
  348. show(finishpro,flag1);
  349. cout<<endl;
  350. }
  351. if(a1>0){
  352. cout<<"****************就绪队列******************"<<endl;
  353. show(proready,a1);
  354. }else{
  355. cout<<"就绪队列为空!"<<endl;
  356. }
  357. i++;
  358. }
  359. }
  360. };
  361. intmain(intargc,char*argv[])
  362. {
  363. inttest;
  364. prop;
  365. test=p.input();
  366. while(test){
  367. system("cls");
  368. test=p.input();
  369. }
  370. return0;
  371. }

小结:没有用数组来表示运行队列,实际上个人也觉得没必要。因为是模拟的,直接修改了PCB的运行状态就OK了。或者当运行时写个sleep(PCB.getNeedtime())来模拟时间的长短即可!

分享到:
评论

相关推荐

    课程设计1正交幅度调制(QAM)及设计与仿真.pdf

    课程设计1正交幅度调制(QAM)及设计与仿真.pdf课程设计1正交幅度调制(QAM)及设计与仿真.pdf课程设计1正交幅度调制(QAM)及设计与仿真.pdf课程设计1正交幅度调制(QAM)及设计与仿真.pdf课程设计1正交幅度调制(QAM)及设计...

    c&c++课程设计1至3报数.rar

    c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报数 c&c++课程设计1至3报...

    课程设计1---正交幅度调制(QAM)的设计与仿真.docx

    课程设计1---正交幅度调制(QAM)的设计与仿真.docx课程设计1---正交幅度调制(QAM)的设计与仿真.docx课程设计1---正交幅度调制(QAM)的设计与仿真.docx课程设计1---正交幅度调制(QAM)的设计与仿真.docx课程设计1---正交...

    电气工程基础课程设计1.ppt

    电气工程基础课程设计1.ppt电气工程基础课程设计1.ppt

    课程设计1.cpp

    课程设计1.cpp

    matlab课程设计1.pdf

    matlab课程设计1.pdf

    小区物业管理系统数据库课程设计1.docx

    小区物业管理系统数据库课程设计1.docx小区物业管理系统数据库课程设计1.docx小区物业管理系统数据库课程设计1.docx小区物业管理系统数据库课程设计1.docx小区物业管理系统数据库课程设计1.docx小区物业管理系统...

    投影镜头课程设计1.zmx

    投影镜头课程设计1.zmx

    C++课程设计1

    C++课程设计

    班级的数据库课程设计 源代码 文档 使用说明6

    数据库课程设计1(3个项目)2(3个项目)3(2个)4(4个)5(5个)6(2个)7/8/9/10/11各一个较大些 数据库课程设计n==为班级的数据库课程设计 源代码 文档 使用说明n-1 哈哈~~~传了才知道不显示名字 所以就这么...

    糕点切片机课程设计1(给正需要的同学)

    比较全面的设计过程,正在做课程设计,有需要的看看

    王爽《汇编语言》课程设计2源程序.asm

    王爽《汇编语言》课程设计2源程序.asm。测试环境:VMware创建XP虚拟机和软盘镜像,运行编译后的可执行文件.exe。重启XP虚拟机查看效果。

    数据库课程设计1.md

    数据库课程设计

    \软件工程课程设计\软件工程课程设计.doc

    软件工程课程设计 软件工程课程设计是软件工程专业学生的一门重要课程,旨在培养学生设计、开发和测试软件系统的能力。本文档旨在介绍软件工程课程设计的基本概念、方法和技术。 1. 绪论 软件工程课程设计是一个...

    二级斜齿轮机械设计课程设计1

    二级斜齿轮-------机械设计课程设计

    android课程表课程设计

    在Android平台上进行课程表课程设计是一项综合性的任务,涉及到用户界面设计、数据管理、事件处理等多个方面的技术。在这个项目中,我们将深入探讨如何利用Android SDK和相关开发工具来创建一个功能完善的课程表应用...

    数据库课程设计----学校的工资管理系统的设计

    数据库原理及应用课程设计报告---学校的工资管理系统的设计 里面包含了sql源码和课程设计报告,可供学习参考。高分课设。 一、课程设计目的及基本要求 数据库系统课程设计是为数据库原理及应用课程而独立开设的实践...

    软件工程课程设计飞机订票系统源代码.zip

    软件工程课程设计飞机订票系统源代码软件工程课程设计飞机订票系统源代码软件工程课程设计飞机订票系统源代码软件工程课程设计飞机订票系统源代码软件工程课程设计飞机订票系统源代码软件工程课程设计飞机订票系统源...

    ssh课程设计--课程设计管理系统

    学习ssh课程设计,课程设计管理系统具有教师管理学生成绩和学生文档,学生信息等功能,学生具有选择课题,提交毕业设计题目,提交学生成绩功能。学生实践的一个重要部分是高等学府的计算机专业课程设计。教师在专业...

    计算机网络课程设计 课程设计 网络课程设计 计算机网络

    综合网络大量资源,节约大家时间:大学校园网网络建设方案的设计 高校校园网组网实例 计算机网络课程设计-学校校园网络规划 计算机网络课设 计算机网络校园网设计 兰州市第三十三中学校园网规划 苏州职业大学校园网...

Global site tag (gtag.js) - Google Analytics