操作系统课程设计.docx
- 文档编号:5172032
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:13
- 大小:261.81KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
一、实验目的
本课程设计要求模拟实现一个的两道批处理系统的两级调度。
通过具体的作业调度、进程调度等功能的实现,加深对批处理系统的两级调度模型和实现过程的理解。
二、实验内容及要求
1.内存任何时候最多只允许有两道作业。
要求作业从进入系统到最后完成,要经历两级调度:
作业调度和进程调度。
2.作业调度是高级调度,它的主要功能是根据一定的算法,为它们建立初始状态为就绪的作业进程。
进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。
3.作业调度分别采用先来先服务算法,进程调度采用可抢占的优先级调度算法。
4.假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。
测试数据如下:
作业进入时间估计运行时间优先数
JOB110:
0040分钟5
JOB210:
2030分钟3
JOB310:
3050分钟4
JOB410:
5020分钟6
优先数越小的优先级别越高。
分别在不同算法控制下运行设计的程序,依次显示被选中作业、内存空闲区和磁带机的情况。
比较不同算法作业的选中次序及作业平均周转时间。
5.选用程序设计语言:
C、C++等。
三、实验设计方案及原理
先来先服务(FCFS)算法,每次从就绪队列中选最先进入队列的作业,也就是进入时间最早的作业,为他们分配资源,然后放入就绪队列。
可抢占的优先级调度算法,每次从就绪队列中选优先数最小的为其分配处理机,直到该作业完成或者发生某事,才释放处理机。
实现一个的两道批处理系统的两级调度方法,两道批处理系统内存内任何时候只能存在两道作业,其他的作业到达则置于就绪队列,进程调度运用可抢占的优先级调度算法,所有然后对内存内作业进行比较,优先数小的分配cpu,运行完后释放cpu与内存空间。
作业调度采用先来先服务,所以把作业按到达时间排序,然后绪队列的第一个存入内存,再按算法分配cpu。
四、重要数据结构或源程序中疑难部分的说明(附详细注释)
#include"stdio.h"
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
structtime//定义时间结构体
{
inthour;//时
intmin;//分
};
structtimesystime;//定义系统时间
intnstate=0;//定义一个变量记录内存内作业数
structpcb/*定义进程控制块PCB*/
{
charname[10];//进程名
charstate;//状态state为"N"为就绪,"W"为后备,"S"为还处于输入井状态,"F"为完成
intsuper;//优先数
intntime;//需要运行时间
intrtime;//运行时间
structtimectime;//提交时间
structtimestime;//开始时间
structtimeftime;//完成时间
intttime;//周转时间
floatdtime;//带权周转时间
structpcb*link;
}*ready=NULL,*one=NULL,*p,*q=NULL;
typedefstructpcbPCB;
intnum,num2;
inttime_cmp(structtimea,structtimeb)//时间比较ab返回;
{
if(a.hour elseif(a.hour==b.hour&&a.min elseif(a.hour==b.hour&&a.min==b.min)return0; return1; } inttime_j(structtimec,structtimed)//计算时间的差 {ints; s=c.hour*60+c.min-d.hour*60-d.min;//把小时*60化为分钟之后再相减 returns; } voidsort()/*建立对进程先来先服务排列函数*/ { PCB*first,*second; intinsert=0; if((ready==NULL)||time_cmp(p->ctime,ready->ctime)==-1)/*提交时间最小者,插入队首*/ { p->link=ready; ready=p; } else/*进程比较提交时间,插入适当的位置中*/ { first=ready; second=first->link; while(second! =NULL) { if(time_cmp(p->ctime,second->ctime)==-1)/*若插入进程比当前进程提交时间小,*/ {/*插入到当前进程前面*/ 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; printf("\n请输入进程数: "); scanf("%d",&num); num2=num; if(num>0) for(i=1;i<=num;i++) { printf("\n进程No.%d: \n",i); p=getpch(PCB); printf("\n输入进程名: "); scanf("%s",p->name); p->ctime.hour=0,p->ctime.min=0; printf("\n输入提交时间(时: 分): "); scanf("%d: %d",&p->ctime.hour,&p->ctime.min); printf("\n输入进程需要运行时间: "); scanf("%d",&p->ntime); printf("\n输入进程优先数: "); scanf("%d",&p->super); printf("\n"); p->state='S'; p->rtime=0; p->stime.hour=0,p->stime.min=0; p->link=0; sort();/*调用sort函数*/ } else {printf("\n输入错误! 请重新输入\n"); input(); } } //建立完成顺序的链表 voidchange1() {if(one==NULL){one=p;q=one;} else {q->link=p; q=p; } p=q->link; q->link=NULL; q->ftime.hour=systime.hour; q->ftime.min=systime.min; nstate--; num2--; q->state='F'; } voidchange2() {if(one==NULL){one=p->link;q=one;} else {q->link=p->link; q=p->link; } p->link=q->link; q->link=NULL; q->ftime.hour=systime.hour; q->ftime.min=systime.min; nstate--; num2--; q->state='F'; } //选中优先数小的作业,记录开始时间,已运行时间 voidrun() { printf("---选中作业为: "); if(p->link! =NULL) if(p->super>=p->link->super&&p->link->state=='N') {printf("%s\n",p->link->name); if(p->link->stime.hour==0&&p->link->stime.min==0) {p->link->stime.hour=systime.hour; p->link->stime.min=systime.min; } p->link->rtime=p->link->rtime+10; if(p->link->rtime==p->link->ntime) change2(); } else {printf("%s\n",p->name); if(p->stime.hour==0&&p->stime.min==0) {p->stime.hour=systime.hour; p->stime.min=systime.min; } p->rtime=p->rtime+10; if(p->rtime==p->ntime) change1(); } else {printf("%s\n",p->name); if(p->stime.hour==0&&p->stime.min==0) {p->stime.hour=systime.hour; p->stime.min=systime.min; } p->rtime=p->rtime+10; if(p->rtime==p->ntime) change1(); } } //输出就绪队列 voidp1() {inti; pcb*d; d=p; printf("-----就绪队列-----\n"); printf("进程名\t提交时间需要运行时间已运行时间优先数\n"); for(i=1;i<=num2;i++) { if(d->state=='N') printf("%s\t%d: %d\t%d%d%d\n",d->name,d->ctime.hour,d->ctime.min,d->ntime,d->rtime,d->super); if(d->link==NULL)break; d=d->link; } if(nstate==0)printf("内存内作业为空"); elserun(); } //输出后备队列 voidp2() {inti; PCB*b; b=p; printf("---后备作业队列---\n"); printf("进程名\t提交时间需要运行时间优先数\n"); for(i=1;i<=num2;i++) { if(b->state=='W') printf("%s\t%d: %d\t%d%d\n",b->name,b->ctime,b->ntime,b->super,b->state); if(b->link==NULL)break; b=b->link; } getchar(); } voidmain()/*主函数*/ { systime.hour=10; systime.min=00; PCB/**first,*/*second,*c; inti,x,y; floats1=0,s2=0; printf("\t\t===============================================\n"); printf("\t\t\t两道道批处理系统的两级调度-2\n"); printf("\t\t===============================================\n"); printf("\t\t\t学院: 计算机学院\n"); printf("\t\t\t班级: 2011级计算机科学与技术()班\n"); printf("\t\t\t学号: 3111006014\n"); printf("\t\t\t姓名: 陈峰\n\n"); input(); getchar(); p=ready; while (1) {c=p; for(i=1;i<=num2;i++) {if(time_cmp(c->ctime,systime)==0||time_cmp(c->ctime,systime)==-1) {if(c->state=='S'||c->state=='W') if(nstate<2) {c->state='N'; nstate++; } elsec->state='W'; } if(c->link==NULL)break; c=c->link; } printf("\n系统时间%d: %d\n",systime.hour,systime.min); systime.min=systime.min+10; if(systime.min>=60) { systime.min=systime.min-60; systime.hour++; } p1(); p2(); if(nstate==0)break; } printf("\n\n完成情况\n");//输出 /*计算周转时间,带权周转时间并显示出来*/ printf("进程名\t提交时间开始运行时间完成时间周转时间带权周转时间\n"); second=one; for(i=1;i<=num;i++) { second->ttime=time_j(second->ftime,second->ctime); x=second->ttime; y=second->ntime; second->dtime=(float)x/(float)y; printf("%s\t%d: %d%d: %d%d: %d%d%f\n",second->name,second->ctime.hour,second->ctime.min,second->stime.hour,second->stime.min,second->ftime.hour,second->ftime.min,second->ttime,second->dtime); s1=s1+second->ttime; s2=s2+second->dtime; second=second->link; } s1=s1/num;//计算平均周转时间 s2=s2/num;//计算带权平均周转时间 printf("\n平均周转时间=%f\n",s1); printf("带权平均周转时间=%f\n\n",s2); printf("按回车键结束……"); getchar(); } 五、实验结果 1.输入数据 2.运行结果 每次显示就绪队列,选中作业,与后备队列 每一队列显示提交时间、运行时间等 3.最终结果 按完成顺序显示作业的提交时间,开始运行时间,完成时间等,最后再计算平均周转时间、平均带权周转时间。 六、实验心得体会 这次实验,通过具体的作业调度、进程调度等功能的实现,加深了对批处理系统的两级调度模型和实现过程的理解。 对指针的运用,函数的调用等更加熟悉了。 在编写代码过程中遇过很多问题,一开始不会怎么显示时间结构为XX: XX,参考了别人设计的结构体和其时间计算比较等,总的来说收获很大。 七、参考文献 《计算机操作系统》—梁小丹等--西安电子科技大学出版社 《C语言入门经典》第四版----清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计