`

课程设计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())来模拟时间的长短即可!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics