ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:51.25KB ,
资源ID:5415397      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5415397.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(魏多FCFSSJF实验报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

魏多FCFSSJF实验报告.docx

1、魏多FCFSSJF实验报告操作系统实验报告 学院:软件学院 班级:过程控制12-02 姓名:魏多 学号:541213470244目录1、实验目的: 32、问题描述: 3FCFS算法 3实验程序 3实验结果截图 7测试结果描述 7SJF算法 7实验程序 7实验结果截图 11测试结果描述 121、实验目的:通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。2、问题描述:假设有n个进程分别在T1, ,Tn时刻到达系统,它们需要的服务时间分别为S1, ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转

2、时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。FCFS算法实验程序#include#include /#include /c里面没有string,因为string是一个类,而c没有类#include /using namespace std;struct PCB int ProcessReachTime;/标志进程到达时间 char PID10;/进程ID /int priority;/进程优先数,在这里的FCFS没有用 /int chip;/时间片 int needTime; int cputime;/进程已经占用CPU的时间 int alltime;/进程还需要运行

3、的时间(当进程运行完毕时,其值为0) char state;/进程的状态STATE(为简化起见。设每个进程处于运行E(excecuting)、就绪R(ready)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态R。) struct PCB* next;/进程队列指针NEXT(用来将PCB排成队列)等;int time;/用于进程到达时间和需要时间char strPID10;int num;struct PCB *start,*startHead,*temp,*newNode;int totalTime=0;int main() printf(请输入进程数:); scanf(%d

4、,&num); start=(PCB*)malloc(sizeof(PCB); startHead=(PCB*)malloc(sizeof(PCB); start=NULL; startHead=start; temp=(PCB*)malloc(sizeof(PCB); temp=startHead; for (int i=0;iPID,strPID);/不能用newNode-PID=strPID;因为PID是一个字符数组newNode-PID是一个常量,不能复制 /- printf(请输入进程到达时间:); scanf(%d,&time); newNode-ProcessReachTime=

5、time; /- printf(请输入进程需要时间:); scanf(%d,&time); newNode-needTime=time; /- newNode-state=R; newNode-next=NULL; if(i=0) start=newNode; startHead=start; else if (i=1) if(start-ProcessReachTimeProcessReachTime) startHead-next=newNode; else newNode-next=startHead; start=newNode; else for(startHead=start;st

6、artHead!=NULL;startHead=startHead-next) temp=startHead; if(start-ProcessReachTimenewNode-ProcessReachTime) newNode-next=startHead; start=newNode; break; else if(startHead-ProcessReachTimeProcessReachTime &startHead-next!=NULL& startHead-next-ProcessReachTimenewNode-ProcessReachTime)/注意后面两个的顺序,如果顺序调换

7、会发生错误 newNode-next=startHead-next; temp-next=newNode; break; else if(startHead-next=NULL) temp-next=newNode; break; int startTime=0;/用于记录一个进程开始运行的时间 startHead=start; for(int i=0;startHead!=NULL;i+) if (startHead-ProcessReachTimestate=R) startTime=i;/记录开始时间i为astartTime startHead-state=E;/进程为执行状态 prin

8、tf(在%d时刻:,i); printf(进程%s开始运行n,startHead-PID); else if (i-startTimeneedTime&i-startTime0&startHead-state=E) printf(在%d时刻:,i); printf(进程%s正在运行n,startHead-PID); else if (i-startTime=startHead-needTime&startHead-state=E) startHead-state=F; printf(在%d时刻:,i); printf(进程%s结束运行n,startHead-PID); startHead=st

9、artHead-next; i-;/这个很重要,主要在结束时刻是否有进程执行 if(startHead=NULL) printf(进程调度结束); while(1);实验结果截图测试结果描述假设两个进程编号为001,002001进程5时刻到达 运行3002进程0时刻到达 运行6先运行002进程6时间段之后运行0013时间段SJF算法实验程序#include#define MaxNum 100 using namespace std; struct Process_struct int Number; /进程编号 char NameMaxNum; /进程名称 int ArrivalTime; /

10、到达时间 int ServiceTime; /开始运行时间 int FinishTime; /运行结束时间 int WholeTime; /运行时间 int run_flag; /调度标志 int order; /运行次序 double WeightWholeTime; /周转时间 double AverageWT_FCFS,AverageWT_SJF; /平均周转时间 double AverageWWT_FCFS,AverageWWT_SJF; /平均带权周转时间 ProcessMaxNum; int N; /实际进程个数int SJF(); /短作业优先 int SJF() /短作业优先算

11、法 int temp_time=0; /当期那时间 int i=0,j; int number_schedul,temp_counter; /进程编号,当前已执行进程个数 float run_time; run_time=Processi.WholeTime; j=1; while(jN)&(Processi.ArrivalTime=Processj.ArrivalTime) /判断是否有两个进程同时到达 if(Processj.WholeTimeProcessi.WholeTime) run_time=Processi.WholeTime; i=j; j+; /查找下一个被调度的进程 /对找

12、到的下一个被调度的进程求相应的参数 number_schedul=i; Processnumber_schedul.ServiceTime=Processnumber_schedul.ArrivalTime; Processnumber_schedul.FinishTime=Processnumber_schedul.ServiceTime+Processnumber_schedul.WholeTime; Processnumber_schedul.run_flag=1; temp_time=Processnumber_schedul.FinishTime; Processnumber_sch

13、edul.order=1; temp_counter=1; while(temp_counterN) for(j=0;jN;j+) if(Processj.ArrivalTime=temp_time)&(!Processj.run_flag) run_time=Processj.WholeTime; number_schedul=j; break; for(j=0;jN;j+) if(Processj.ArrivalTime=temp_time)&(!Processj.run_flag) if(Processj.WholeTimerun_time) run_time=Processj.Whol

14、eTime; number_schedul=j; /查找下一个被调度的进程 /对找到的下一个被调度的进程求相应的参数 Processnumber_schedul.ServiceTime=temp_time; Processnumber_schedul.FinishTime=Processnumber_schedul.ServiceTime+Processnumber_schedul.WholeTime; Processnumber_schedul.run_flag=1; temp_time=Processnumber_schedul.FinishTime; temp_counter+; Pro

15、cessnumber_schedul.order=temp_counter; return 0;int Pinput(); /进程参数输入 int Poutput(); /调度结果输出 void main() system(cls); int option; printf( *主菜单*n); printf( * 1 使用短作业优先 *n); printf( * 0 退出 *n); printf( *n); / /system(color 1f); scanf(%d,&option); switch(option) case 0: printf(运行结束。n); break; case 1: p

16、rintf(对进程用短作业优先调度。nn); Pinput(); SJF(); Poutput(); break; int Pinput() /进程参数输入 int i; printf(请输入进程个数:n); scanf(%d,&N); for(i=0;iN;i+) printf(*n); printf(请输入一个进程:n,i+1); printf(请输入进程名称:n); scanf(%s,Processi.Name); printf(请输入到达时间:n); scanf(%d,&Processi.ArrivalTime); printf(请输入服务时间:n); scanf(%d,&Proces

17、si.WholeTime); Processi.ServiceTime=0; Processi.FinishTime=0; Processi.WeightWholeTime=0; Processi.order=0; Processi.run_flag=0; system(cls); return 0; int Poutput() /调度结果输出 int i; float turn_round_time=0,f1,w=0; printf( 进程名称 到达T 运行T 开始运行T 结束T 执行顺序 周转T 带权周转Tn); for(i=0;iN;i+) Processi.WeightWholeTim

18、e=Processi.FinishTime-Processi.ArrivalTime; f1=Processi.WeightWholeTime/Processi.WholeTime; turn_round_time+=Processi.WeightWholeTime; w+=f1; printf(时刻%d :,Processi.ServiceTime,Processi.Name); printf( %s %d %d %d %d %d %f %fn,Processi.Name,Processi.ArrivalTime,Processi.WholeTime,Processi.ServiceTime

19、,Processi.FinishTime,Processi.order,Processi.WeightWholeTime,f1); printf(average_turn_round_timer=%fn,turn_round_time/N); printf(weight_average_turn_round_timer=%fn,w/N); return 0; 实验结果截图测试结果描述假设有3个进程001,002,003进程1:0时刻到达,运行5进程2:2时刻到达,运行3进程3:3时刻到达,运行1当进程1进入时,还没有其它进程所以先处理进程1,在处理进程1期间进入的进程2,进程3 ,因为进程3的运行时间短,所以先处理进程3,最后处理进程2。实验心得先来先服务算法:该算法是根据进程到达的时间来决定哪个进程先执行,进程一旦执行,就一直运行到完成或发生某事件而阻塞才放弃处理机。当进程调度中采用该算法是,系统按照作业到达的先后次序进行调度算法容易实现。但效率不高,只顾及作业等候时间,没考虑作业要求服务时间的长短。因此优待了长作业而不利于短作业。短作业优先算法:对FCFS算法的改进,其目标是减少平均周转时间,该算法是根据进程的服务时间长短来判断哪个进程先执行,当一个进程执行完后,根据进程的到达情况将进程按照其服务时间进行排序并放入就绪队列中。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1