操作系统课程设计报告Word文档格式.docx
- 文档编号:8185233
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:69
- 大小:477.17KB
操作系统课程设计报告Word文档格式.docx
《操作系统课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告Word文档格式.docx(69页珍藏版)》请在冰点文库上搜索。
3.4程序运行分析…………………………………………………………………………40
六总结……………………………………………………………………………………………42
一课程设计的目的和意义
目的:
1、根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容。
2、通过调试典型列题或习题积累调试程序的经验
3、通过完成辅导教材中的编程题,逐渐培养学生的编程能力,用计算机解决实际问题的能力。
4、通过最终的课程设计锻炼学生独立思考及实践与动手能力
意义:
1、有助于加深我们对操作系统这门课程的理解,我们课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度,通过课程设计,我们可以真正理解其内涵。
2、有利于我们逻辑思维的锻炼,程序设计能直接有效的训练学生的创新思维、培养分析问题、解决问题、预测目标的能力。
即使是一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,依然需要学生有条不紊的构思。
3、有利于培养严谨认真的学习态度,在程序设计过程里,当我们输入程序代码的时候,如果不够认真或仔细,那么可能就导致语法错误,从而无法得出运行结果。
那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。
4、通过几个课题把所学的理论知识融入实践,有利于基础知识的理解,即可以巩固所学的理论知识,同时还可以在实践中认识不足。
5、有利于与其他学科的整合,在操作系统程序设计中,我们可以解决其他学科有关问题,也可利用其他课程的有关知识来解决操作系统中比较抽象很难理解的只是。
在操作系统课中整合其他学科的知识,发挥信息技术的优势。
6、有利于治学态度的培养,程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
这种现象会随着学习的深入而慢慢改观。
二进程调度算法模拟
1、设计目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
2、设计内容
(1)用C语言来实现对N个进程采用动态优先算法的进程调度;
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识符id
进程优先数priority,并规定优先数越大的进程,其优先权越高;
进程已占用的CPU时间cputime;
进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0;
进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;
进程被阻塞的时间blocktime,表示已阻塞的进程再等待blocktime个时间片后,将转换成就绪态
进程状态state;
队列指针next,用来将PCB排成队列
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们的初始状态如下:
ID01234PRIORITY93830290CPUTIME00000ALLTIME33634STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEREADYREADYREADYREADYREADY
(5)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNINGPROG:
i
READY_QUEUE:
->
id1->
id2
BLOCK_QUEUE:
id3->
id4
==================================
ID01234
PRIORITY
P0P1P2P3P4
CPUTIMEC0C1C2C3C4
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4
BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
3、使用动态优先权的进程调度算法的模拟程序
3.1程序设计思路
通过VC++程序模拟动态优先权程序调度算法,主要思路和方法就是,通过结构体模拟计算机的控制模组,构造一个PCB结构体即进程控制块结构体,用来记录当前进程的的相关状态信息,包括进程标识符、处理机状态、进程调度信息、进程控制信息。
并通过C++语言模拟计算机的相关调度算法,对构建的PCB进程进行模拟调度和运行,从而实现用计算机对进程的调度过程进行过程仿真。
3.2进程控制块等主要数据结构设计
数据结构:
1.包含PCB信息的结构体
2.包含进程信息的顺序表结构
算法:
优先权=(等待时间+要求服务时间)/要求服务时间
Rp=(等待时间+要求服务时间)/要求服务时间=相应时间/要求服务时间
系统将所有就绪队列按优先级高低排成一个队列,每次调度时,将CPU分配给优先级最高的进程,并令其执行一个时间片,而后中断,寻找并运行下一个优先级最高的进程。
而所有进程的优先权在随进程的推进或随其等待时间的增加而增加,而被调度之后的程序则降低一定的优先级,从而使所有进程都有运行的机会,从而保证系统能在给定的时间内响应所有用户的请求。
3.3程序代码实现:
#include<
stdio.h>
//头文件
#defineN5//静态变量
//声明各个需要调用的函数
voidinit();
voidprint();
intgetRunning();
voidsort();
intrun(inttime);
enumSTATE{Ready,Run,Block,RunOut};
//枚举进程的状态:
就绪、执行、阻塞、完成
//建立PROCESS结构体
structPROCESS{
intID;
//标志数
intPriority;
//优先数
intCputime;
//已占CPU时间
intAlltime;
//还需占CPU时间
intStartblock;
//开始阻塞时间
intBlocktime;
//已被阻塞时间
enumSTATEState;
//进程状态
}
}Process[N];
intREADY[N];
//定义就绪数组
intBLOCK[N];
//定义阻塞数组
intRUNOUT[N][2];
//完成数组
intmain(){//调用主函数
intTime=0;
//定义time变量
init();
//输入函数
printf("
Time:
%d\n"
Time);
//输出time值
sort();
//整理函数
print();
//输出函数
while
(1){//所需时间循环
Time++;
getchar();
printf("
if(run(Time))//返回值
break;
//跳出
//sort();
//print(Time);
return0;
voidinit()//调用init函数
{inti;
//为PRIORITY,ALLTIME,STARTBLOCK,BLOCKTIME各个变量赋初始值
process(PRIORITY,ALLTIME,STARTBLOCK,BLOCKTIME):
\N"
N);
for(i=0;
i<
N;
++i){
READY[i]=-1;
BLOCK[i]=-1;
RUNOUT[i][0]=-1;
RUNOUT[i][1]=-1;
Process[i].ID=i;
Process[i].Cputime=0;
Process[i].State=Ready;
Process[i].Startblock=-1;
Process[i].Blocktime=0;
Process[0].Priority=9;
Process[0].Alltime=3;
Process[0].Startblock=2;
Process[0].Blocktime=3;
Process[1].Priority=38;
Process[1].Alltime=3;
Process[2].Priority=30;
Process[2].Alltime=6;
Process[3].Priority=29;
Process[3].Alltime=3;
Process[4].Priority=0;
Process[4].Alltime=4;
voidprint()//调用print函数
{
inti;
//定义i变量
if(getRunning()>
=0)//如果正在执行
\tRUNNINGPROG:
%d\n"
getRunning());
//显示正在执行的进程
\tREADY_QUEUE:
"
);
//显示正要等待执行的队列
for(i=0;
++i){//进程执行过程
if(READY[i]>
=0)//如果就绪
%d"
Process[READY[i]].ID);
//显示输出正在执行的进程id
else{//否则
break;
//跳出继续执行
}
}
\n\tBLOCK_QUEUE:
//输出阻塞队列
if(BLOCK[i]>
=0)//如果阻塞
Process[BLOCK[i]].ID);
//输出阻塞进程id
}
printf("
\n=====================================================\n"
ID\t"
//输出进程id
++i){
\t%d"
Process[i].ID);
//显示输出进程id
\nPRIORITY"
//输出优先数
Process[i].Priority);
//显示输出优先数
printf("
\nCPUTIME\t"
//输出已占CPU时间
for(i=0;
Process[i].Cputime);
//显示输出已占CPU时间
}
\nALLTIME\t"
//输出还需占CPU时间
Process[i].Alltime);
//显示输出还需占CPU时间
\nSTARTBLOCK"
//输出开始阻塞时间
Process[i].Startblock);
//显示输出开始阻塞时间
\nBLOCKTIME"
//输出已被阻塞时间
Process[i].Blocktime);
//显示输出已被阻塞时间
\nSTATE\t"
//输出进程状态
//根据进程执行阻塞就绪进行显示输出进程状态
switch(Process[i].State){//选择进程状态
case0:
\tReady"
break;
//若第一种情况输出Ready跳出
case1:
\tRun"
//若第二种情况输出Run
if(Process[i].Alltime==0)//若还需占用时间等价为0
{
Process[i].State=RunOut;
//则将赋值为RunOut
elseProcess[i].State=Ready;
//否则赋值为Ready
case2:
\tBlock"
//输出阻塞
case3:
\tRunOut"
//输出执行完成
\n"
//换行
\tRUNOUTLIST:
//输出RUNOUTLIST
++i){//如果进程执行完成则将相应进程指针输出到RUNOUTLIST
if(RUNOUT[i][0]>
=0)
%d(%d)"
Process[RUNOUT[i][0]].ID,RUNOUT[i][1]);
else{
intgetRunning()//执行函数
inti;
//定义变量i
if(Process[i].State==Run)//若进程状态执行
returni;
//返回i值
if(Process[i].Startblock==0)//若状态阻塞
return-1;
//否则返回-1
voidsort(){//sort函数
inti,j,k;
//定义变量i、j、k
READY[i]=-1;
//将-1赋值给ready数组
BLOCK[i]=-1;
//将-1赋值给block数组
if(Process[i].State==Ready||Process[i].State==Run){//若进程状态就绪或执行
if(Process[i].Alltime==0)//还需占cpu时间等价为0
continue;
//继续向下执行
for(j=0;
j<
++j){
if(READY[j]<
0){//若ready数值小于零
READY[j]=i;
//则将i值赋值给ready数组
elseif(Process[i].Priority<
=Process[READY[j]].Priority)//若就绪优先数大于等于优先数
}//继续向下执行
for(k=N-1;
k>
j;
--k){
READY[k]=READY[k-1];
//将ready数组前一个数值赋值给后一个
//将i赋值给ready数值
elseif(Process[i].State==Block){//若进程状态阻塞
if(BLOCK[j]<
0){//若阻塞数值中有值小于零
BLOCK[j]=i;
//则将i赋值给block数组
elseif(Process[i].Blocktime>
=Process[BLOCK[j]].Blocktime)//若阻塞已被阻塞时间小于等于阻塞时间
{continue;
}//继续执行循环体
BLOCK[k]=BLOCK[k-1];
//将阻塞值向前移
//将i赋值给block数组
intrun(inttime)//run函数
inti,runNum;
//定义变量I,runNum
runNum=READY[0];
//将ready的第一个值赋值给runNum
if(runNum<
0&
&
BLOCK[0]<
0){//若阻塞第一个值为负且runNum的值小于零
EveryprocessisOVER!
//则输出EveryprocessisOVER!
return1;
//返回值1
else{//否则
if(runNum>
=0){//若runNum值大于等于0
Process[runNum].Priority-=3;
//赋值为3
Process[runNum].Alltime-=1;
//赋值为1
Process[runNum].Cputime+=1;
Process[runNum].State=Run;
//进程状态为执行
if(i!
=runNum){//若i不等于runNum
if(Process[i].State==Ready){//若进程状态为就绪
Process[i].Priority+=1;
//优先数自动加1
elseif(Process[i].State==Block){//若进程状态为阻塞
Process[i].Startblock-=1;
//开始阻塞时间为1
if(Process[i].Blocktime==0){//若阻塞时间等价于0
Process[i].State=Ready;
//进程状态就绪
if(Process[runNum].Alltime==0)//对应进程runNum值前提还需占cpu时间等价为0
if(RUNOUT[i][0]<
0){//若完成进程数组值小于零
RUNOUT[i][0]=runNum;
//runNum值赋值给runout数组第一行
RUNOUT[i][1]=time;
//time值赋值给runout数组第一行
elseif(Process[runNum].Startblock>
=0){//在runNum值前提下的阻塞状态大于等于0
Process[runNum].Startblock-=1;
if(Process[runNum].Startblock==0){//等价为0
Process[runNum].State=Block;
//阻塞状态
//Process[runNum].Startblock-=1;
elseif(BLOCK[0]>
=0){//第一个阻塞数值大于等于0
if(Process[i].State==Block){//若阻塞状态
Process[i].Startblock=-1;
//赋值为-1
Process[i].Blocktime-=1;
if(Process[i].Blocktime==0){//若开始阻塞时间等价为0
//就绪状态
sort();
print();
return0;
}
3.4程序运行分析
图1.1
图1.2
感觉难度比较大,有很多生疏的指令。
但在老师和同学的帮助下都解决了。
总体上还是对进程概念和进程调度过程有了一个更深的理解。
在这次试验中也暴露出自己不少的缺点,希望以后试验中可以改正!
三动态分区内存分配算法模拟
1、设计目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及实现过程的理解。
2、设计内容
(1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链来管理;
在进行内存分配时,系统优先使用空闲区低端的空间。
(2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 报告