操作系统课程设计计算机14-1c讲解x文档格式.docx
- 文档编号:942718
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:20
- 大小:95.55KB
操作系统课程设计计算机14-1c讲解x文档格式.docx
《操作系统课程设计计算机14-1c讲解x文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计计算机14-1c讲解x文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
本课程设计采用多级反馈队列调度算法,设立4个进程队列,分给队列1的时间片为3秒,队列2的时间片为6秒,队列3的时间片为12秒,队列4的时间片为24秒。
队列1的优先级最高,队列4的优先级最低。
高优先级的队列没执行完,即不为空,就永远不执行其下面的低优先级的队列里面的
19
进程。
当执行低优先级队列里面的进程时,突然间高优先级的队列插入了进程就立刻跳到高优先级的队列执行其里面的进程。
每个队列的进程都是按先来先执行的顺序执行。
进程初次执行肯定要进入队列1。
如何从头到尾执行一遍队列1中的进程是,存在某些进程在队列1的时间片内还没执行完,就把进程移交到下一个队列中。
每个队列都如此类推。
直到最后一个队列4,如果在队列
4还有进程在本时间片内还没没执行完,就把该程序放到队尾,从新等待时间片执行。
四、算法流程
1.算法流程图
对各进程按到达
时间进行排序
判断是否所有
进程都被调度
是
结束
挑选最先到达的程序一次性执行完
(1)FCFS调度算法流程图
(2)SPJ调度算法流程图
判断所有进程是
否已经结束
否
查找当前已经到达的最短进
调用该进程
高优先权调度算法流程图
所有进程按到达时间排序
进程是否已经
调度完毕
调度该进程至结束
按优先级大小选定一个已到达的进程
(4)时间片轮转调度算法
当前进程减去一个时间片单位
按轮转顺序选定一个已到达的进程
2.进程控制块PCB的设计
进程属性
变量名
数据类型
进程名
sName
char
进程状态
iStatus
int
优先级
iPrivilege
服务时间
iRunTime
进程等待时间
iWaitTime
进程控制块PCB是进程存在的唯一标志,主要包括进程的以下的信息:
进程标识符、处理机状态、进程调度信息(进程状态、进程优先级、进程调度所需要的其他信息、事件)、进程的控制信息。
五、实现过程与结果
1.先来先服务算法运行结果
短进程优先算法运行结果
3.髙相应比优先算法运行结果
4.时间片轮转算法运行结果
六、源程序#include<
stdio.h>
#include<
string.h>
iostream.h>
constintblock_time=10;
//定义时间片的长度为10秒constintMAXPCB=100;
//定义最大进程数
//定义进程结构体typedefstructnode{
charsName[20];
//进程名
intiStatus;
//进程状态
intiRunTime;
//进程需运行的时间intiPrivilege;
//进程的优先数
intiFinished;
//标志进程是否执行完成intiWaitTime;
//进程的等待时间
}pcb;
pcbpcbs[MAXPCB];
intiPCBNum;
voidinitPCB() //PCB初始化函数
{
inti;
for(i=0;
i<
MAXPCB;
i++)
strcpy(pcbs[i].sName,"
"
);
pcbs[i].iStatus=0;
pcbs[i].iRunTime=0;
pcbs[i].iPrivilege=0;
pcbs[i].iFinished=0;
pcbs[i].iWaitTime=0;
}//for(i=0;
iPCBNum=0;
}//voidinitPCB()
intreadData() //读进程流文件数据函数
FILE*fp;
charsFile[20];
inti;
cout<
<
请输入进程流文件名(注意:
包括后缀名):
"
;
cin>
>
sFile;
if((fp=fopen(sFile,"
r"
))==NULL)
错误,文件打不开,请检查文件名"
endl;
}
else{
while(!
feof(fp))
fscanf(fp,"
%s %d %d
%d"
pcbs[iPCBNum].sName,&
pcbs[iPCBNum].iStatus,&
pcbs[iPCBNum].iRunTime,&
pcbs[iPCBNum].iPrivilege);
iPCBNum++;
} //while(!
//输出所读入的数据
endl<
输出所读入的数据:
进程名 进程状态 所需时间 优先数"
for(i=0;
iPCBNum;
"
pcbs[i].sName <
"
pcbs[i].iStatus<
pcbs[i].iRunTime<
pcbs[i].iPrivilege<
return
(1);
} //if((fp=fopen(sFile,"
return(0);
}//intreadData()
voidreInitPCB()//重置PCB数据,以供另一个算法使用
}//voidreInitPCB()
voidsorttime()//短进程优先
reInitPCB();
--------------------------------------------------------
-------"
短进程优先算法执行流:
进程名 等待时间 运行时间"
//请大家补充完整inti,j;
for(i=1;
iPCBNum-1;
for(j=0;
j<
iPCBNum-i-1;
j++)
if(pcbs[j].iRunTime>
pcbs[j+1].iRunTime)
{pcbtemp;
strcpy(temp.sName,pcbs[j+1].sName);
temp.iRunTime=pcbs[j+1].iRunTime;
temp.iPrivilege=pcbs[j+1].iPrivilege;
temp.iStatus=pcbs[j+1].iStatus;
strcpy(pcbs[j+1].sName,pcbs[j].sName);
pcbs[j+1].iRunTime=pcbs[j].iRunTime;
pcbs[j+1].iPrivilege=pcbs[j].iPrivilege;
pcbs[j+1].iStatus=pcbs[j].iStatus;
strcpy(pcbs[j+1].sName,temp.sName);
pcbs[j].iRunTime=temp.iRunTime;
pcbs[j].iPrivilege=temp.iPrivilege;
pcbs[j].iStatus=temp.iStatus;
pcbs[0].iFinished=1;
pcbs[0].iWaitTime=0;
intiTotal=pcbs[0].iWaitTime;
pcbs[0].sName<
pcbs[0].iWaitTime
"
pcbs[0].iRunTime<
for(i=1;
pcbs[i].iWaitTime+=pcbs[i-1].iWaitTime+pcbs[i-1].iRunTime;
iTotal+=pcbs[i].iWaitTime;
pcbs[i].iFinished=1;
pcbs[i].sName<
pcbs[i].iWaitTime
pcbs[i].iRunTime<
总等待时间:
iTotal<
平均等待时间:
iTotal/(iPCBNum-1)
----------------------------------------------------
-----------"
}//voidsorttime()
voidFIFO()//先进先出算法
inti,j;
intiTotal;
//重置PCB数据,以供另一个算法使用
//输出FIFO算法执行流
FIFO算法执行流:
pcbs[i].iWaitTime<
for(j=i+1;
pcbs[j].iWaitTime+=pcbs[i].iRunTime;
iTotal=0;
iTotal+=pcbs[i].iWaitTime;
iTotal/iPCBNum<
}//voidFIFO()
voidprivilege()//优先数调度算法
inti,j,iCurMin;
intiPassedTime=0;
intiQueue[MAXPCB];
intiCurPriority=1000;
i++) //按优先数递增排序PCB
iCurPriority=1000;
for(j=0;
if((pcbs[j].iFinished==0)&
&
(pcbs[j].iPrivilege<
iCurPriority))
iCurMin=j;
iCurPriority=pcbs[j].iPrivilege;
}//for(j=0;
iQueue[i]=iCurMin;
pcbs[iCurMin].iFinished=1;
pcbs[iCurMin].iWaitTime+=iPassedTime;
iPassedTime+=pcbs[iCurMin].iRunTime;
} //for(i=0;
//输出优先数调度执行流
优先数调度执行流:
进程名优先数等待时间"
pcbs[iQueue[i]].sName<
pcbs[iQueue[i]].iPrivilege<
pcbs[iQueue[i]].iWaitTime<
}//voidprivilege()
voidtimer() //时间片轮转调度算法
inti,iNum,iFlag=1;
intiRound=0;
//轮转周期数intiTotal=0;
//总时间片数
时间片轮转调度执行流(时间片的长度为10秒):
while(iFlag==1)
iFlag=0;
iNum=0;
i++) //统计末执行完的进程数iNum
if(pcbs[i].iFinished==0)
iNum++;
}//if(pcbs[i].iFinished==0)
if(iNum>
0)
iRound++;
iRound<
轮:
iFlag=1;
iTotal++;
if(pcbs[i].iRunTime<
=block_time*(iRound))
}//if(pcbs[i].iRunTime<
=block_time*(iRound+1))
}//if(pcbs[i].iFinished==0)
}//if(iNum>
}//while(iFlag==1)
轮转周期数:
总时间片数:
cout<
}//voidtimer()
voidversion() //显示版权信息函数
┏━━━━━━━━━━━━━━━━━━━━━━━┓"
┃ 进程调度算法模拟系统 ┃
┠───────────────────────┨"
┃ (c)All Right Reserved
┃"
┃ 作者 ┃
┃ version 2008 build 1.1
┗━━━━━━━━━━━━━━━━━━━━━━┛"
}//voidversion()
//主函数voidmain()
intiInput;
boolbGoOn;
charsGoOn[1];
version();
//显示版权信息函数initPCB();
//PCB初始化函数
bGoOn=true;
strcpy(sGoOn,"
if(readData()==1)//标志读进程流文件数据函数执行是否正确
while(bGoOn)
请输入算法编号(1OR2OR3 4)选择进程调度功能:
1 先进先出算法"
2 优先数调度算法
3 时间片轮转调度算法 "
4 短进程优先调度算法
cin>
iInput;
switch(iInput)
case1:
FIFO();
//先进先出算法break;
case2:
privilege();
//优先数调度算法break;
case3:
timer();
//时间片轮转调度算法break;
case4:
sorttime();
//短进程优先调度算法break;
default:
printf("
\n输入的算法编号错误!
!
\n"
break;
} //switch(iInput)
bGoOn=false;
要继续进行进程调度算法模拟吗?
(Y/N)"
sGoOn;
bGoOn=(sGoOn[0]=='
y'
||sGoOn[0]=='
Y'
}//whilebGoOn
}//if(readData()==1)
}//voidmain()
七、实验总结
一周的课程设计结束了,在本次课程设计中遇到了不少问题,但通过查询资料以及与同学交流,最终解决了问题。
本次课程设计,让我更好地掌握操作系统的原理及实现方法,加深了我对操作系统基础理论和重要算法的理解。
课程设计是我们专业课程知识综合应用的实践训练,也是为我们以后的工作夯实基础。
通过改程序对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法——先来先服务算法,短进程优先调度算法,时间片轮转调度算法,动态优先级调度有了更深刻的理解和掌握,使我能够为进程调度选择适当的算法,提高CPU工作效率。
实验过程中遇到了不少问题,但通过查询资料以及与同学交流,最终解决了问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 计算机 14 讲解
![提示](https://static.bingdoc.com/images/bang_tan.gif)