ljcqgAAA广工操作系统实验报告.docx
- 文档编号:15877184
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:45
- 大小:478.09KB
ljcqgAAA广工操作系统实验报告.docx
《ljcqgAAA广工操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《ljcqgAAA广工操作系统实验报告.docx(45页珍藏版)》请在冰点文库上搜索。
ljcqgAAA广工操作系统实验报告
ljcqgAAA广工操作系统实验报告
操作系统实验报告
学生学院____计算机学院______
专业班级_计科(8)班
学号
学生姓名___________
指导教师_________
2013年12月29日
1实验一进程调度………………………………………………………………5
2实验二作业调度………………………………………………………………9
3实验三可变式分区分配………………………………………………………18
4实验四简单文件系统…………………………………………………………26
实验一进程调度
一、实验目的
编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。
以加深对进程的概念及进程调度算法的理解.
二、实验内容及要求
编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。
三、实验设计方案及原理
在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对调度的处理又都可采用不同的调度方式和调度算法。
调度算法是指:
根据系统的资源分配策略所规定的资源分配算法。
短进程优先调度算法是指对短进程优先调度的算法,它是从后备队列中选择一个或者若干个进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
四、重要数据结构或源程序中疑难部分的说明,需附详细注释
#include"stdio.h"
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
structpcb
{/*定义进程控制块PCB*/
charname[10];//进程名
charstate;//状态
intsuper;//优先数
intntime;//需要运行时间
intrtime;//运行时间
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
intnum;
sort()/*建立对进程进行短进程优先排列函数*/
{
PCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->ntime)<(ready->ntime)))/*需要运行时间最小者,插入队首*/
{
p->link=ready;
ready=p;
}
else/*进程比较需要运行时间,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!
=NULL)
{
if((p->ntime)<(second->ntime))/*若插入进程比当前进程需要运行时间小,*/
{/*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else/*插入进程需要运行时间最大,则插入到队尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;
}
}
voidinput()/*建立进程控制块函数*/
{
inti;
//clrscr();/*清屏*/
printf("\n请输入进程数:
");
scanf("%d",&num);
for(i=0;i { printf("\n进程号No.%d: \n",i); p=getpch(PCB); printf("\n输入进程名: "); scanf("%s",p->name); printf("\n输入进程需要运行时间: "); scanf("%d",&p->ntime); printf("\n"); p->rtime=0;p->state='w'; p->link=NULL; sort();/*调用sort函数*/ } } voidmain()/*主函数*/ { inti,len,h=0; charch; input(); ch=getchar(); printf("\n调度序列为: "); p=ready; for(i=num;i>0;i--) {printf("%s",p->name); p=p->link; } printf("\n\n进程已经完成.\n"); ch=getchar(); } 五、程序运行结果 七、结果分析与实验小结 结果正确。 短进程优先需要把进程按左右运行时间排序,然后让其按顺序执行即可。 实验二作业调度 一、实验目的: 用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。 二、实验内容: 1.写并调试一个单道处理系统的作业等待模拟程序。 2.作业等待算法: 分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。 3.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。 4.每个作业由一个作业控制块JCB表示,JCB可以包含如下信息: 作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。 每个作业的最初状态总是等待W。 5.对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 5、重要数据结构或源程序中疑难部分的说明,需附详细注释 三、实验设计方案及原理 编写一个程序将输入的进程按其提交时间进行排列,按排列顺序进行调度,计算其开始时间、完成时间、周转时间等数值 四、重要数据结构或源程序中疑难部分的说明,需附详细注释 先来先服务 #include"stdio.h" #include #include #definegetpch(type)(type*)malloc(sizeof(type)) #defineNULL0 structpcb {/*定义进程控制块PCB*/ charname[10];//进程名 charstate;//状态 intsuper;//优先数 intntime;//需要运行时间 intrtime;//运行时间 intctime;//提交时间 intstime;//开始时间 intftime;//完成时间 intttime;//周转时间 floatdtime;//带权周转时间 structpcb*link; }*ready=NULL,*p; typedefstructpcbPCB; intnum; voidsort()/*建立对进程先来先服务排列函数*/ { PCB*first,*second; intinsert=0; if((ready==NULL)||((p->ctime)<(ready->ctime)))/*达到时间最小者,插入队首*/ { p->link=ready; ready=p; } else/*进程比较到达时间,插入适当的位置中*/ { first=ready; second=first->link; while(second! =NULL) { if((p->ctime)<(second->ctime))/*若插入进程比当前进程到达时间小,*/ {/*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else/*插入进程到达时间最大,则插入到队尾*/ { first=first->link; second=second->link; } } if(insert==0)first->link=p; } } voidinput()/*建立进程控制块函数*/ { inti; //clrscr();/*清屏*/ printf("\n请输入进程数: "); scanf("%d",&num); for(i=0;i { printf("\n进程号No.%d: \n",i); p=getpch(PCB); printf("\n输入进程名: "); scanf("%s",p->name); printf("\n输入提交时间: "); scanf("%d",&p->ctime); printf("\n输入进程需要运行时间: "); scanf("%d",&p->ntime); printf("\n"); p->rtime=0;p->state='w'; p->link=NULL; sort();/*调用sort函数*/ } } voidmain()/*主函数*/ {PCB*first,*second; inti,x,y; floats1=0,s2=0; charch; input(); ch=getchar(); //输出 printf("进程名\t开始时间\t完成时间\t周转时间\t带权周转时间\n"); second=ready; first=ready; first->ftime=0; for(i=num;i>0;i--) {if(second->ctime>first->ftime)/*计算完成时间,周转时间等*/ second->stime=second->ctime; else second->stime=first->ftime; second->ftime=(second->ntime)+(second->stime); second->ttime=(second->ftime)-(second->ctime); x=second->ttime; y=second->ntime; second->dtime=(float)x/(float)y; printf("%s\t%d\t%d\t%d\t%f\n",second->name,second->stime,second->ftime,second->ttime,second->dtime); s1=s1+second->ttime; s2=s2+second->dtime; if(second->link! =NULL) {first=second; second=second->link; } } s1=s1/num; s2=s2/num; printf("\n平均周转时间=%f\n",s1); printf("平均周转时间=%f\n\n",s2); printf("按任意键结束……"); ch=getchar(); } 响应比 #include #include #include #definegetpch(type)(type*)malloc(sizeof(type)) #definenull0 intn; floatT1=0,T2=0; inttimes=0; structjcb//作业控制块 { charname[10];//作业名 intctime;//作业到达时间 intstime;//作业开始时间 intntime;//作业需要运行的时间 floatsuper;//作业的响应比 intftime;//作业完成时间 floatttime;//作业周转时间 floatdtime;//作业带权周转时间 charstate;//作业状态 structjcb*next;//结构体指针 }*ready=NULL,*p,*q; typedefstructjcbJCB; voidinital()//建立作业控制块队列,先将其排成先来先服务的模式队列 { inti; printf("\n输入作业数: "); scanf("%d",&n); for(i=0;i { p=getpch(JCB); printf("\n作业号No.%d\n输入作业名: ",i); scanf("%s",p->name); printf("\n输入作业到达时间: "); scanf("%d",&p->ctime); printf("\n输入作业需要运行的时间: "); scanf("%d",&p->ntime); p->state='W'; p->next=NULL; if(ready==NULL)ready=q=p; else{ q->next=p; q=p; } } } voidoutput(JCB*q) {/*显示所有作业的情况*/ JCB*pr=ready;floatf=0.0; printf("所有作业的情况: \n");//列表显示所有作业的情况 printf("作业名\t\t到达时间\t所需运行间\t响应比\t\t作业状态\n");printf("%s\t\t%d\t\t%d\t\t%f\t%c\n",q->name,q->ctime,q->ntime,q->super,q->state); while(pr) { if(pr->super<=0)printf("%s\t\t%d\t\t%d\t\t%f\t%c\n",pr->name,pr->ctime,pr->ntime,f,pr->state); elseprintf("%s\t\t%d\t\t%d\t\t%f\t%c\n",pr->name,pr->ctime,pr->ntime,pr->super,pr->state); pr=pr->next; } } voiddisp(JCB*q)//显示作业运行后的周转时间及带权周转时间等 { //显示高响应比算法调度作业后的运行情况 output(q); printf("\n作业%s正在运行,估计其运行情况: \n",q->name); printf("开始运行时刻\t完成时刻\t周转时间\t带权周转时间\t相应比\n\n");printf("%d\t\t%d\t\t%f\t%f\t%f\n",q->stime,q->ftime,q->ttime,q->dtime,q->super); getchar(); } voidrunning(JCB*p)//运行作业 { if(p==ready)//先将要运行的作业从队列中分离出来 { ready=p->next; p->next=NULL; } else { q=ready; while(q->next! =p)q=q->next; q->next=p->next; } p->stime=times;//计算作业运行后的完成时间,周转时间等等 p->state='R';p->ftime=p->stime+p->ntime;p->ttime=(float)(p->ftime-p->ctime);p->dtime=(float)(p->ttime/p->ntime); T1+=p->ttime; T2+=p->dtime; disp(p);//调用disp()函数,显示作业运行情况 times+=p->ntime; p->state='F'; printf("\n作业%s已经完成! \n请输入任意键继续......\n",p->name); free(p);//释放运行后的作业 getchar(); } voidsuper()//计算队列中作业的高响应比 { JCB*padv; padv=ready; do{if(padv->state=='W'&&(padv->ctime)<=times) {padv->super=(float)(times-padv->ctime+padv->ntime)/padv->ntime; } padv=padv->next; }while(padv! =NULL); } voidfinal()//最后打印作业的平均周转时间,平均带权周转时间 { floats,t; t=T1/n; s=T2/n; getchar(); printf("\n\n作业已经全部完成! "); printf("\n%d个作业的平均周转时间是: %f",n,t); printf("\n%d个作业的平均带权周转时间是%f: \n\n\n",n,s); } voidhrn()//高响应比算法 { JCB*min; inti,iden; system("cls"); inital(); for(i=0;i { p=min=ready;iden=1; super();do{if(p->state=='W'&&p->ctime<=times) if(iden) { min=p;iden=0; } elseif(p->super>min->super)min=p; p=p->next; }while(p! =NULL); running(min);//调用running()函数 } final();//调用running()函数 } voidmain()//主函数 { hrn(); getchar(); printf("按回车结束\n"); getchar(); //system("cls"); } 五、程序运行结果 七、结果分析与实验小结 实验三动态分区分配方式的模拟 一、实验目的: 了解动态分区分配方式中的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解 二、实验内容: (1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。 其中,空闲分区通过空闲分区链(表)来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB •作业2申请60KB •作业3申请100KB •作业2释放60KB •作业4申请200KB •作业3释放100KB •作业1释放130KB •作业5申请140KB •作业6申请60KB •作业7申请50KB •作业8申请60KB 请分别采用首次适应算法和最佳适应算法进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。 三、实验设计方案及原理 首次适应算法: 使用该算法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。 然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。 最佳适应算法: 该算法总是把既能满足要求,又是最小的空闲分区分配给作业。 为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。 这样每次找到的第一个满足要求的空闲区,必然是最优的。 孤立地看,该算法似乎是最优的,但事实上并不一定。 因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。 同时每次分配后必须重新排序,这也带来了一定的开销。 五、重要数据结构或源程序中疑难部分的说明,需附详细注释 #include"stdio.h" #include #include #defineFree0//空闲状态 #defineBusy1//已用状态 #defineOK1//完成 #defineERROR0//出错 #defineMAX_length640//最大内存空间为KB typedefintStatus; typedefstructfreearea//定义一个空闲区说明表结构 { intID;//分区号 longsize;//分区大小 longaddress;//分区地址 intstate;//状态 }ElemType; //----------线性表的双向链表存储结构------------ typedefstructDuLNode//doublelinkedlist { ElemTypedata; structDuLNode*prior;//前趋指针 structDuLNode*next;//后继指针 }DuLNode,*DuLinkList; DuLinkListblock_first;//头结点 DuLinkListblock_last;//尾结点 Statusalloc(int);//内存分配 Statusfree(int);//内存回收 StatusFirst_fit(int,int);//首次适应算法 StatusBest_fit(int,int);//最佳适应算法 voidshow();//查看分配 StatusInitblock();//开创空间表 StatusInitblock()//开创带头结点的内存空间链表 { block_first=(DuLinkList)malloc(sizeof(DuLNode)); block_last=(DuLinkList)malloc(sizeof(DuLNode)); block_first->prior=NULL; block_fir
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ljcqgAAA 操作系统 实验 报告