广工操作系统试验报告_第1页
广工操作系统试验报告_第2页
广工操作系统试验报告_第3页
广工操作系统试验报告_第4页
广工操作系统试验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——广工操作系统试验报告

操作系统试验报告

学生学院计算机学院专业班级2023级计算机科学与技术四班学号3110006015学生姓名张法光指导教师何翠红

2023年1月05日

目录

试验一、进程调度4试验二、作业调度8试验三、动态分区分派方式的模拟16试验四、文件系统24

3

1试验一进程调度

1、试验目的

编写并调试一个模拟的进程调度程序,采用“短进程优先〞调度算法对五个进程进行调度。以加深对进程的概念及进程调度算法的理解.

2、试验原理

在多道程序系统中,一个作业被提交后必需经过处理机调度后,方能获

得处理机执行。对调度的处理又都可采用不同的调度方式和调度算法。调度算法是指:根据系统的资源分派策略所规定的资源分派算法。

短进程优先调度算法是指对短进程优先调度的算法,它是从后备队列中选

择一个或者若干个进程,将处理机分派给它,使它马上执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

短进程优先调度源程序如下:

#include#definen5#definenum5#definemax65535typedefstructpro{

intPRO_ID;//进程号intarrive_time;//到达时间intsum_time;//运行总时间intflag;

}Pro;

//整数排序

intbubble(inttemp[]){

inti,j,tem=0;

for(i=1;itemp[j+1])}

{

tem=temp[j];temp[j]=temp[j+1];temp[j+1]=tem;lastX=0;}

if(lastX==1)break;

}

returntemp[0];

//进程排序

Probubble(Prop[]){

inti,j;

Protemp={0};Pros[num];

for(i=0;is[j+1].sum_time){

temp=s[j];s[j]=s[j+1];s[j+1]=temp;lastX=0;}

if(lastX==1)break;

}

5

voidSPF(intp){

if(n>0){

inti,j,k,l,tc=0;

Proseq[n];Protemp_seq[n];

printf(\printf(\计科4班张法光3110006015\\n\

printf(\

printf(\试验一:短进程优先调度算法SPF\\n\

printf(\请依次输入5个进程的进程号、到达时间和执行时间\\n\printf(\成员变量用逗号隔开;进程间用回车隔开\\n\

printf(\for(i=0;i#include#include

#definegetpch(type)(type*)malloc(sizeof(type))#definenull0intn;

floatT1=0,T2=0;inttimes=0;

structjcb//作业控制块{

charname[10];//作业名

intreachtime;//作业到达时间intstarttime;//作业开始时间

intneedtime;//作业需要运行的时间floatsuper;//作业的响应比intfinishtime;//作业完成时间floatcycletime;//作业周转时间

floatcltime;//作业带权周转时间charstate;//作业状态structjcb*next;//结构体指针}*ready=NULL,*p,*q;

typedefstructjcbJCB;

voidinital()//建立作业控制块队列,先将其排成先来先服务的模式队列{

inti;

printf(\输入作业数:\scanf(\for(i=0;ireachtime=i;

printf(\作业默认到达时间:%d\printf(\输入作业要运行的时间:\scanf(\p->state='W';

9

p->next=NULL;

if(ready==NULL)ready=q=p;else{

q->next=p;q=p;}}

}

voidoutput(JCB*q,intj){/*显示所有作业的状况*/JCB*pr=ready;floatf=0.0;

printf(\所有作业的状况:\\n\列表显示所有作业的状况

if(j==3){

printf(\作业名\\t\\t到达时间\\t所需运行间\\t响应比\\t\\t作业状态\\n\printf(\while(pr){

if(pr->supername,pr->reachtime,pr->needtime,f,pr->state);elseprintf(\pr->name,pr->reachtime,pr->needtime,pr->super,pr->state);

pr=pr->next;}

}

else{

printf(\作业名\\t\\t到达时间\\t所需运行间\\t作业状态\\n\

printf(\while(pr){printf(\pr->name,pr->reachtime,pr->needtime,pr->state);pr=pr->next;}}

}

voiddisp(JCB*q,intm)//显示作业运行后的周转时间及带权周转时间等{

if(m==3)//显示高响应比算法调度作业后的运行状况{output(q,m);

printf(\作业%s正在运行,估计其运行状况:\\n\

printf(\开始运行时刻\\t完成时刻\\t周转时间\\t带权周转时间\\t相应比\\n\\n\printf(\getch();

}

else//显示先来先服务,最短作业优先算法调度后作业的运行状况{

output(q,m);

printf(\作业%s正在运行,估计其运行状况:\\n\

10

printf(\开始运行时刻\\t完成时刻\\t周转时间\\t带权周转时间\\n\\n\

printf(\getch();}}

voidrunning(JCB*p,intm)//运行作业

{

if(p==ready)//先将要运行的作业从队列中分开出来{ready=p->next;p->next=NULL;}else{q=ready;while(q->next!=p)q=q->next;q->next=p->next;}

p->starttime=times;//计算作业运行后的完成时间,周转时间等等p->state='R';

p->finishtime=p->starttime+p->needtime;

p->cycletime=(float)(p->finishtime-p->reachtime);

p->cltime=(float)(p->cycletime/p->needtime);T1+=p->cycletime;T2+=p->cltime;

disp(p,m);//调用disp()函数,显示作业运行状况

times+=p->needtime;p->state='F';

printf(\作业%s已经完成!\\n请输入任意键继续\\n\free(p);//释放运行后的作业

getch();

}

voidsuper()//计算队列中作业的高响应比{

JCB*padv;

padv=ready;

do{if(padv->state=='W'

}

padv=padv->next;}while(padv!=NULL);

}

voidfinal()//最终打印作业的平均周转时间,平均带权周转时间{

floats,t;

11

t=T1/n;

s=T2/n;getch();

printf(\作业已经全部完成!\

printf(\个作业的平均周转时间是:%f\

printf(\个作业的平均带权周转时间是%f:\\n\\n\\n\}

voidhrn(intm)//高响应比算法{

JCB*min;inti,iden;system(\inital();

for(i=0;istate=='W'iden=0;}elseif(p->super>min->super)min=p;p=p->next;}while(p!=NULL);

running(min,m);//调用running()函数}//for

final();//调用running()函数}

voidfcfs(intm)//先来先服务算法{

inti,iden;system(\inital();

for(i=0;istate=='W'if(iden)p=p->next;}while(p!=NULLif(iden)

{

i--;printf(\没有满足要求的进程,需等待\times++;

12

if(times>100){printf(\时间过长\}else{

running(p,m);//调用running()函数}

}

final();//调用running()函数}

voidmain()//主函数{

intm;

while(1){

printf(\printf(\计科4班张法光3110006015\\n\printf(\试验2-作业调度系统\\n\printf(\先来先服务算法\\n\

printf(\响应比高者优先算法\\n\printf(\退出程序\\n\

printf(\printf(\选择所要操作:\\n\

scanf(\switch(m){

case1:fcfs(m);

getch();

times=0;main();break;case2:hrn(m);getch();times=0;main();break;case3:exit(0);

default:

printf(\选择错误,重新选择.\getch();

system(\}

13

}}

5、程序运行结果

5.1先来先服务算法

14

5.2响应比高者优先算法

6、结果分析与试验小结

参考了几个作业调度的范例,作业调度实践起来并不难,但需要渐渐调试。和同学探讨了设计思路之后就开始做了,虽然有小错误,但是经过反复调试也修正了BUG。

15

printf(\请输入登录用户名:\/*用户登陆*/scanf(\

for(userid=0;userid>\\n\

printf(\printf(\create新建文件.\printf(\delete删除文件.\printf(\open开启文件.\printf(\close关闭文件.\printf(\read读出文件.\printf(\write写进文件.\printf(\display显示用户列表.\printf(\quit安全退出.\

printf(\printf(\操作命令:createdeleteopenclosereadwritedisplayquit\\n\printf(\请输入操作命令:\

36

scanf(\getchar();

for(i=0;iDuLNode*p=block_first;while(p){if(p->data.ID==ID){p->data.state=Free;p->data.ID=Free;if(p->prior->data.state==Free)//与前面的空闲块相连{p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;}if(p->next->data.state==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;p->next->next->prior=p;p->next=p->next->next;}break;}p=p->next;}returnOK;}

//显示主存分派状况voidshow(){coutnext;while(p){coutdata.ID==Free)coutdata.state==Free)coutnext;}}

//主函数voidmain(){intch;//算法选择标记cout>ch;Initblock();//开创空间表intchoice;//操作选择标记while(1){

cout>choice;if(choice==1)alloc(ch);//分派内存elseif(choice==2)//内存回收{intID;cout>ID;free(ID);}elseif(choice==3)show();//显示主存elseif(choice==0)break;//退出else//输入操作有误{cout5、源程序清单(需附详细的解释)#include#include#include#defineNULL0

#definegetpch(type,num)(type*)malloc(sizeof(type)*num)

structufd{/*其次级:用户文件目录UFD*/charfilename[10];/*文件名*/

charprocode[3];/*保护码1:读2:写3:执行*/intlength;/*文件长度*/}*p;

typedefstructufdUFD;

structmdf{/*第一级:主目录MDF*/charname[10];/*用户名*/

UFD*directory;/*文件目录指针*/}maindir[10];/*用户数组*/

typedefstructmdfMDF;

structafd{/*文件运行目录*/charfilename[10];/*文件名*/

charprocode[3];/*保护码1:读2:写3:执行*/

intrw;/*读写指针初始状态读:0写:文件长度*/}afd[5];

intusernum,opennum;/*登陆用户数量开启文件数量*/intfilenum[10];/*所有的用户目录下的文件数目*/charusername[10];/*当前登陆系统的用户名*/char

command[][10]={\/*文件操作命令*/

voidlogin()/*用户注册,信息写入database文件*/{inti,j;

FILE*fp;intloginum;

intcreatnum[10];

printf(\注册页面=====\\n\\n\

26

printf(\请输入注册的用户数量:\scanf(\for(i=0;i=10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论