先来先服务算法的实现报告.docx
- 文档编号:27276945
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:11
- 大小:75.70KB
先来先服务算法的实现报告.docx
《先来先服务算法的实现报告.docx》由会员分享,可在线阅读,更多相关《先来先服务算法的实现报告.docx(11页珍藏版)》请在冰豆网上搜索。
先来先服务算法的实现报告
操作系统实习报告
先来先服务算法的实现
一、设计目的
加深对进程调度工作的理解,了解其优点缺点。
二、设计内容
设计一个按先来先服务算法实现处理器调度的程序。
三、开发环境
windows环境,VC6.0平台。
四、分析设计
(一)实验原理
1.每个进程由一个进程控制块来识别,进程控制块的内容如下所示:
进程名
到达时间
服务时间
开始时间
结束时间
进程名:
进程表示。
到达时间:
进程创建时的系统时间或者用户指定,调度时选择到达时间最早
的进程。
服务时间:
进程运行所需的时间。
开始时间:
进程开始执行的时间。
结束时间:
进程执行结束时的时间。
2.设置一个数组,用来存放进入系统的进程。
3.处理机调度时,总是选择通过冒泡排序选出的到达时间靠前的进程投入运行。
4.在所设计的程序中应该有显示或打印语句,能显示或者打印正在运行的进程的进程名进程到达时间、进程服务时间、进程开始执行时间、进程完成时间、进程周转时间、进程带权周转时间。
(二)程序结构
通过输入函数input创建进程后,送入数组中,通过冒泡排序对数组中各进程的到达时间进行排序,到达时间小的会优先得到处理机的分配。
进行进程调度前,进程的各个信息如下:
arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0
假设进程K的到达比进程K-1提前到达,得到分配处理机后,通过deal函数处理:
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].dqzztime=p[k].zztime/p[k].servicetime;
最后调用输出函数Print()对进程的各个信息进行输出。
(三)数据结构1.主函数
2.进程控制块的内容如下:
3.创建进程算法,根据输入的个数存储到数组中,创建时信息包括进程名、到达时间、服务时间,创建进程后可在主函数调用FCFS()函数进行处理。
4.输出函数,输出信息包括:
进程名、到达时间、服务时间、开始时间、完成时间、周转时间、带权周转时间以及进程执行顺序。
5.排序函数,对到达时间进行排序,对先来的进程进行调度
6.运行函数,处理进程开始执行时间、完成时间、周转时间、带权周转时间。
7.调用处理函数
(四)程序流程图
开始
初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队
时间、
时间
开始时间
Y
结束
五、运行实例与结果分析如下表,输入一下三个进程A、B、C
作业名
到达时间
服务时间
A
1
4
B
5
2
C
2
5
实验结果如下:
根据先来先服务的算法,进程A到达时间为1,服务时间为4,进程A开始执行后,随后的作业先到的就能够排在前面,而B的到达时间为5,C的到达时间则为2,所以B在C之后执行,知道执行完。
这个算法和进程的运行所需的时间无关,只和先后到达顺序有关。
六、实验心得
通过这次实习,让我对进程作业先来先服务和进程调度的概念和算法,有了更深入的认识!
初步理解了操作系统对于作业处理的基本思想!
同时这次实习也是自己编程能力的一种考验,加深了理论知识的实际应用!
在实验的过程中遇到了很多困难,感谢同学们的帮助。
七、实验源代码
#include
{
charname[10];/进程名
floatarrivetime;/到达时间
floatservicetime;/服务时间floatstarttime;/开始时间
floatfinishtime;/完成时间
floatzztime;/周转时间
floatdqzztime;/带权周转时间
};
fcfsa[100];
/////////////输入////////////////voidinput(fcfs*p,intN)
{
inti;
printf("请输入进程名到达时间服务时间:
\n");for(i=0;i<=N-1;i++)
{
printf("请输入第%d个进程:
\n",i+1);
scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
}
}
/////////////输出////////////////
voidPrint(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN)
{
intk;
printf("运行顺序为:
");printf("%s",p[0].name);for(k=1;k { printf("-->%s",p[k].name); } printf("\n进程信息如下: \n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //////////排序函数////////////voidsort(fcfs*p,intN) { for(inti=0;i<=N-1;i++)for(intj=0;j<=i;j++) if(p[i].arrivetime { fcfstemp;temp=p[i];p[i]=p[j];p[j]=temp; } } /////////////运行函数////////// voiddeal(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,intN) { intk; for(k=0;k<=N-1;k++) { if(k==0)/第一个到达的进程 { p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime; } else/第一个以后到达的 { p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime; } } for(k=0;k<=N-1;k++)/周转时间和带权周转时间的计算 { p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime; } } //////////调用处理////////voidFCFS(fcfs*p,intN) { floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;sort(p,N); deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); } //////////主函数////////voidmain() { intN;printf("请输入进程数: \n");scanf("%d",&N);input(a,N); FCFS(a,N); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 先来先 服务 算法 实现 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)