魏多FCFSSJF实验报告Word文件下载.docx
- 文档编号:18402913
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:13
- 大小:51.25KB
魏多FCFSSJF实验报告Word文件下载.docx
《魏多FCFSSJF实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《魏多FCFSSJF实验报告Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
#include<
malloc.h>
//#include<
string>
//c里面没有string,因为string是一个类,而c没有类
string.h>
//usingnamespacestd;
structPCB
{
intProcessReachTime;
//标志进程到达时间
charPID[10];
//进程ID
//intpriority;
//进程优先数,在这里的FCFS没有用
//intchip;
//时间片
intneedTime;
intcputime;
//进程已经占用CPU的时间
intalltime;
//进程还需要运行的时间(当进程运行完毕时,其值为0)
charstate;
//进程的状态STATE(为简化起见。
设每个进程处于运行E(excecuting)、就绪R(ready)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态R。
)
structPCB*next;
//进程队列指针NEXT(用来将PCB排成队列)等
};
inttime;
//用于进程到达时间和需要时间
charstrPID[10];
intnum;
structPCB*start,*startHead,*temp,*newNode;
inttotalTime=0;
intmain()
printf("
请输入进程数:
"
);
scanf("
%d"
&
num);
start=(PCB*)malloc(sizeof(PCB));
startHead=(PCB*)malloc(sizeof(PCB));
start=NULL;
startHead=start;
temp=(PCB*)malloc(sizeof(PCB));
temp=startHead;
for(inti=0;
i<
num;
i++)
{
startHead=start;
temp=startHead;
newNode=(PCB*)malloc(sizeof(PCB));
//--------------------------
printf("
请输入进程ID:
scanf("
%s"
strPID);
strcpy(newNode->
PID,strPID);
//不能用newNode->
PID=strPID;
因为PID是一个字符数组newNode->
PID是一个常量,不能复制
请输入进程到达时间:
time);
newNode->
ProcessReachTime=time;
请输入进程需要时间:
needTime=time;
state='
R'
;
next=NULL;
if(i==0)
{
start=newNode;
startHead=start;
}
elseif(i==1)
if(start->
ProcessReachTime<
=newNode->
ProcessReachTime)
{
startHead->
next=newNode;
}
else
newNode->
next=startHead;
start=newNode;
else
for(startHead=start;
startHead!
=NULL;
startHead=startHead->
next)
temp=startHead;
if(start->
ProcessReachTime>
newNode->
{
newNode->
start=newNode;
break;
}
elseif(startHead->
ProcessReachTime&
&
startHead->
next!
=NULL&
startHead->
next->
ProcessReachTime)//注意后面两个的顺序,如果顺序调换会发生错误
next=startHead->
next;
temp->
next==NULL)
}
intstartTime=0;
//用于记录一个进程开始运行的时间
for(inti=0;
if(startHead->
=i&
state=='
startTime=i;
//记录开始时间i为astartTime
startHead->
E'
//进程为执行状态
printf("
在%d时刻:
i);
进程%s开始运行\n"
startHead->
PID);
elseif(i-startTime<
needTime&
i-startTime>
0&
进程%s正在运行\n"
elseif(i-startTime==startHead->
F'
进程%s结束运行\n"
startHead=startHead->
i--;
//这个很重要,主要在结束时刻是否有进程执行
if(startHead==NULL)
进程调度结束"
while
(1);
}
实验结果截图
测试结果描述
假设两个进程编号为001,002
001进程5时刻到达运行3
002进程0时刻到达运行6
先运行002进程6时间段之后运行0013时间段
SJF算法
iostream>
#defineMaxNum100
usingnamespacestd;
structProcess_struct
{
intNumber;
//进程编号
charName[MaxNum];
//进程名称
intArrivalTime;
//到达时间
intServiceTime;
//开始运行时间
intFinishTime;
//运行结束时间
intWholeTime;
//运行时间
intrun_flag;
//调度标志
intorder;
//运行次序
doubleWeightWholeTime;
//周转时间
doubleAverageWT_FCFS,AverageWT_SJF;
//平均周转时间
doubleAverageWWT_FCFS,AverageWWT_SJF;
//平均带权周转时间
}Process[MaxNum];
intN;
//实际进程个数
intSJF();
//短作业优先
intSJF()
{//短作业优先算法
inttemp_time=0;
//当期那时间
inti=0,j;
intnumber_schedul,temp_counter;
//进程编号,当前已执行进程个数
floatrun_time;
run_time=Process[i].WholeTime;
j=1;
while((j<
N)&
(Process[i].ArrivalTime==Process[j].ArrivalTime))//判断是否有两个进程同时到达
if(Process[j].WholeTime<
Process[i].WholeTime)
{
run_time=Process[i].WholeTime;
i=j;
}
j++;
}
//查找下一个被调度的进程
//对找到的下一个被调度的进程求相应的参数
number_schedul=i;
Process[number_schedul].ServiceTime=Process[number_schedul].ArrivalTime;
Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime+Process[number_schedul].WholeTime;
Process[number_schedul].run_flag=1;
temp_time=Process[number_schedul].FinishTime;
Process[number_schedul].order=1;
temp_counter=1;
while(temp_counter<
N)
{
for(j=0;
j<
N;
j++)
if((Process[j].ArrivalTime<
=temp_time)&
(!
Process[j].run_flag))
{
run_time=Process[j].WholeTime;
number_schedul=j;
break;
}
if(Process[j].WholeTime<
run_time)
{
run_time=Process[j].WholeTime;
number_schedul=j;
}
//查找下一个被调度的进程
//对找到的下一个被调度的进程求相应的参数
Process[number_schedul].ServiceTime=temp_time;
Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime+Process[number_schedul].WholeTime;
Process[number_schedul].run_flag=1;
temp_time=Process[number_schedul].FinishTime;
temp_counter++;
Process[number_schedul].order=temp_counter;
}return0;
intPinput();
//进程参数输入
intPoutput();
//调度结果输出
voidmain()
system("
cls"
intoption;
********************主菜单************************\n"
*1使用短作业优先*\n"
*0退出*\n"
**************************************************\n"
//
//system("
color1f"
option);
switch(option)
case0:
运行结束。
\n"
break;
case1:
对进程用短作业优先调度。
\n\n"
Pinput();
SJF();
Poutput();
intPinput()//进程参数输入
inti;
请输入进程个数:
N);
for(i=0;
i++)
***************************************\n"
请输入一个进程:
i+1);
请输入进程名称:
Process[i].Name);
请输入到达时间:
Process[i].ArrivalTime);
请输入服务时间:
Process[i].WholeTime);
Process[i].ServiceTime=0;
Process[i].FinishTime=0;
Process[i].WeightWholeTime=0;
Process[i].order=0;
Process[i].run_flag=0;
system("
intPoutput()//调度结果输出
floatturn_round_time=0,f1,w=0;
进程名称到达T运行T开始运行T结束T执行顺序周转T带权周转T\n"
Process[i].WeightWholeTime=Process[i].FinishTime-Process[i].ArrivalTime;
f1=Process[i].WeightWholeTime/Process[i].WholeTime;
turn_round_time+=Process[i].WeightWholeTime;
w+=f1;
时刻%d:
Process[i].ServiceTime,Process[i].Name);
%s%d%d%d%d%d%f%f\n"
Process[i].Name,Process[i].ArrivalTime,Process[i].WholeTime,Process[i].ServiceTime,Process[i].FinishTime,Process[i].order,Process[i].WeightWholeTime,f1);
average_turn_round_timer=%f\n"
turn_round_time/N);
weight_average_turn_round_timer=%f\n"
w/N);
return0;
假设有3个进程001,002,003
进程1:
0时刻到达,运行5
进程2:
2时刻到达,运行3
进程3:
3时刻到达,运行1
当进程1进入时,还没有其它进程所以先处理进程1,在处理进程1期间进入的进程2,进程3,因为进程3的运行时间短,所以先处理进程3,最后处理进程2。
实验心得
先来先服务算法:
该算法是根据进程到达的时间来决定哪个进程先执行,进程一旦执行,就一直运行到完成或发生某事件而阻塞才放弃处理机。
当进程调度中采用该算法是,系统按照作业到达的先后次序进行调度算法容易实现。
但效率不高,只顾及作业等候时间,没考虑作业要求服务时间的长短。
因此优待了长作业而不利于短作业。
短作业优先算法:
对FCFS算法的改进,其目标是减少平均周转时间,该算法是根据进程的服务时间长短来判断哪个进程先执行,当一个进程执行完后,根据进程的到达情况将进程按照其服务时间进行排序并放入就绪队列中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 魏多 FCFSSJF 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)