二进程同步算法模拟.docx
- 文档编号:25960383
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:12
- 大小:52.03KB
二进程同步算法模拟.docx
《二进程同步算法模拟.docx》由会员分享,可在线阅读,更多相关《二进程同步算法模拟.docx(12页珍藏版)》请在冰豆网上搜索。
二进程同步算法模拟
实验二进程同步算法模拟
一、实验目的
1、模拟设计一种进程调度过程:
FCFS、短作业优先、高响应比优先(任选其一)。
2、算法代码实现,模拟数据演示,模拟结果验证。
二、实验学时
4课时
三、实验环境与平台
Windows2000,C/C++程序开发集成环境(开发语言可自选)
四、实验内容及要求
1、实验内容:
(1)自定义PCB的数据结构;
(2)针对资源分配中出现的问题,选择适合的算法,实现资源的合理分配。
2、实验要求:
(1)完成规定的实验内容;
(2)在实验之前,利用课外时间浏览帮助文件的相关主题内容;(3)实验时保存程序代码;(4)写出实验报告.(实验目的、实验时间、实验设备和实验环境平台、完成的实验内容、实验结果和结论)。
五、完成的实验内容
下例是用C语言编写,用TC2.0调试结果
六、实现代码如下:
#include"stdio.h"
#definegetjcb(type)(type*)malloc(sizeof(type))
#defineNULL0
intn=0,time=0;floateti,ewi;
structjcb{charname[10];/*作业名*/
charstate;/*作业状态*/
intts;/*提交时间*/
floatsuper;/*优先权*/
inttb;/*开始运行时间*/
inttc;/*完成时间*/
floatti;/*周转时间*/
floatwi;/*带权周转时间*/
intntime;/*作业所需运行时间*/
charresource[10];/*所需资源*/
structjcb*link;/*结构体指针*/
}*p,*q,*head=NULL;
typedefstructjcbJCB;
inital(){
inti;
printf("\nInputjcbnum\n");
scanf("%d",&n);
printf("Input\nname\tts\tntime\tresource\n");
for(i=0;i {p=getjcb(JCB);scanf("%s\t%d\t%d\t%s",&p->name,&p->ts,&p->ntime,&p->resource); p->state='W'; p->link=NULL; if(head==NULL)head=q=p; else{q->link=p;q=p;} } } fileinput(){ FILE*fp; inti; if((fp=fopen("os2.txt","r"))==NULL)printf("openerror! "); fscanf(fp,"%d\n",&n); for(i=0;i p->state='W'; p->link=NULL; if(head==NULL)head=q=p; else{ q->link=p; q=p; } }fclose(fp);} voidprint(JCB*pr,intm){ JCB*p; printf("\ntime=%d",time); if(m==3){ printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n"); printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n", pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi); }else{ printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);} p=head; do{if(p->state=='W') if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n", p->name,p->state,p->ts,p->ntime,p->super,p->resource); } else{ printf("%s\t%c\t%d\t%d\t%s\n", p->name,p->state,p->ts,p->ntime,p->resource); } p=p->link; }while(p! =NULL); p=head; do{ if(p->state=='F') if(m==3){ printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n", p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti,p->wi); } else{ printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n", p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p->ti,p->wi); } p=p->link; }while(p! =NULL); } voidlast(){ eti/=n;ewi/=n; printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi); } super(){ JCB*padv; padv=head; do{ if(padv->state=='W'&&padv->ts<=time) padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime; padv=padv->link; }while(padv! =NULL); } voidhrn(m){ JCB*min; inti,iden; for(i=0;i p=min=head;iden=1; super(); do{ if(p->state=='W'&&p->ts<=time) if(iden){ min=p;iden=0; } elseif(p->super>min->super)min=p; p=p->link; }while(p! =NULL); if(iden){ i--;time++;printf("\ntime=%d: \tnoJCBsubmib...wait...",time); if(time>1000){printf("\nruntimeistoolong...error...");getch();} } else{ running(min,m); } } } voidsjf(intm){ JCB*min; inti,iden; for(i=0;i p=min=head;iden=1; do{ if(p->state=='W'&&p->ts<=time) if(iden){ min=p;iden=0; } elseif(p->ntime p=p->link; }while(p! =NULL); if(iden){ i--;printf("\ntime=%d: \tnoJCBsubmib...wait...",time);time++; if(time>100){printf("\nruntimeistoolong...error");getch();} } else{ running(min,m); } } } fcfs(intm){ inti,iden; printf("\n\nthejcbisruning..."); for(i=0;i p=head;iden=1; do{ if(p->state=='W'&&p->ts<=time)iden=0; if(iden)p=p->link; }while(p! =NULL&&iden); if(iden){ i--;printf("\ntime=%d: \tnoJCBsubmib...wait...",time);time++; if(time>100){printf("\nruntimeistoolong...error");getch();} } else{ running(p,m); } } } running(JCB*p,intm){ p->tb=time;p->state='R'; p->tc=p->tb+p->ntime; p->ti=(float)(p->tc-p->ts); p->wi=(float)(p->ti/p->ntime); eti+=p->ti; ewi+=p->wi; print(p,m); time+=p->ntime; p->state='F'; printf("\n%shasbeenfinished! \npressanykeytocontinue...\n",p->name); getch(); } voidrunjcb(intm){ printf("\n\nstartrunningjcb..."); switch(m){ case1: fcfs(m);break; case2: sjf(m);break; case3: hrn(m);break; default: printf("\nrunjcberror...\n");exit(); } } fileway(){ printf("\nadoptsthefilewaytoinputthedatas...y/n: "); if(getch()=='y')fileinput(); elseinital(); } start(){ intm; charstr[100]="\nselectalgorithm\n1.FCFS\n2.SJF\n3.HRN\n"; printf("%s",str); m=getch()-48; fileway(); if(1<=m&&m<=3)runjcb(m); else{ printf("\nselecterror! tryagain...\n"); start(); } last(); } main() { start(); printf("\nfinished! "); getch(); } 六、实验结果 七、结论分析 本例依次实现了FCFS,SJF,HRN算法,我只对SJF算法即短作业优先调度算法进行了实验 按要求输入数据,如上图所示,即: 进程个数(jcdnum): 5 SJF 进程名 name A B C D E 到达时间ts 0 1 2 3 4 运行时间ntime 4 3 5 2 4 所需资源resource 4 9 18 6 13 执行后,输出周转时间ti、带权周转时间wi,而且是逐次运行。 通过上面的运行过程可看出,短作业优先调度算法是对短作业优先进行调度的算法。 根据所需资源由少到多进行调度。 所以,顺序依次是ADBEC。 此算法对短进程有利,对长进程不利,且没有考虑作业的紧迫度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 同步 算法 模拟