logo资料库

操作系统实验报告(全).doc

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
班级: 姓名: 学号:
实验一 批处理系统的作业调度 实验目的: 1.加深对作业概念的理解。 2.深入了解批处理系统如何组织作业、管理作业和调度作业。 实验要求: 利用 C 语言程序模拟批处理系统中的作业调度,要求采用响应比高者优先的作业调 度算法。 实验设备及环境: Pc 机一台,vc6.0 for windows 实验步骤: 1.确定作业控制块的内容和组成方式; 2.由于实验中没有实际作业,作业控制块中的信息内容只使用实验中需要的数据。 并假定系统资源只有 64KB 主存、4 台磁带机、和 2 台打印机; 3.分析算法: 4.采用响应比高者优先算法的作业调度程序流程图 指针 p 后移: s=p; p=jcbtable[p].next 开始 P 指向作业队列的列首 P=head q=s= -1 P 没有空 Y N 找到满足条件的 作业(q!= -1)? N N 系统可用资源是否 满足作业需求? Y 结束 Y 计算 p 指向作 业 的 响 应 比 q 是 作 业 队 列 的 第 一 个? Y P 是 第 一 个 满 足 必 要 条 件 的 作 业 Y q=p;t=s;k=xk 从作业队列摘下 q: Head=jcbtable 从作业队列摘下 q: Jcbtable[t].next= Jcbtable[q].next 为作业 q 分配资源: 分配主存空间;分配磁带机; 分配打印机;并输出作业名
5.编写程序,源代码如下: #include #include #define n 4 typedef struct jcb {char name[4]; int length; int printer; int tape; int runtime; int waittime; int next; }JCB; int head; int tape,printer; long memory; JCB jobtable[n]; int jobcount=0; void shedule() //作业调度函数 { float xk,k; int p,q,s,t; do {p=head; q=s=-1; k=0; while(p!=-1) {if(jobtable[p].length<=memory&&jobtable[p].tape<=tape&&jobtable[p].printer <=printer) {//系统可用资源是否满足作业需求 xk= (float)(jobtable[p].waittime)/jobtable[p].runtime; if(q==0||xk>k) //满足条件的第一个作业或者作业 q 的响应比小于作业 p 的响应比 {xk=k; q=p; t=s; }//if }//if s=p; p=jobtable[p].next; }//while if(q!=-1) {if(t==-1)
head=jobtable[head].next; else jobtable[t].next=jobtable[q].next; //为作业 q 分配资源:分配内存空间;分配磁带机;分配打印机 memory=memory-jobtable[q].length; tape=tape-jobtable[q].tape; printer=printer-jobtable[q].printer; printf("选中作业的作业名:%s\n",jobtable[q].name); } }while(q!=-1); } main() {char name[4]; int size,tcount,pcount,wtime,rtime; int p=0; //系统数据初始化 memory=65536; tape=4; printer=2; head=-1; printf("输入作业相关数据(以作业大小为负数停止输入):\n"); //输入数据,建立作业队列 printf("输入作业名,作业大小,磁带机数,打印机数,等待时间,估计执行时间\n"); scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime); while(size!=-1) { //创建 JCB if(jobcount
scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime); }//while shedule(); }//main()函数结束 6.上机调试并运行,某次运行结果如下: 实验总结: 该实验是一个作业调度算法的模拟程序实验,在实验操作过程中我在调度算法这个 函数上花了很多的时间,才达到了实验预定的目的。虽然只是一个模拟,但使我对响应 比高者优先这种作业调度算法有了更深层次的题解,通过 C 语言的实现,也使我对其它 的算法有了一种理论与实践结合的思想,从本质上掌握各种算法理论。同样的作业调度 算法还有先来先服务、短作业优先等常用算法,本次的实验也促使我更深入去了解这些 其它的常用算法。
实验二 单处理机系统的进程调度 实验目的: 1.加深对进程概念的理解,明确进程和程序的区别。 2.深入了解系统如何组织进程,创建进程。 3.进一步认识如何实现处理机调度。 实验要求: 利用 C 语言程序模拟单处理机系统的进程调度,要求采用时间片轮转调度算法。 实验设备及环境: Pc 机一台,vc6.0 for windows 实验步骤: 1.确定进程控制块的内容和组成方式; 2.完成进程创建原语和进程调度原语; 3.分析流程: 进程创建流程图 开始 空 闲 进 程 控 制 N 取空闲进程控制块队列的第一个 i=pfree Y 进程创建失败 pfree 后移: pfree=pcbarea[pfree].next 就绪队列为空? N 挂入就绪队列: pcbarea[ready.tiail].next=i ready.tail=i pcbarea[ready.tiail].next=-1 填写该进程控制快内容: pcbarea[i].name=name pcbarea[i].status=aready 初始化进程控制块内现场信息 挂入就绪队列: ready.head=i ready.tail=i pcbarea[ready.tiail].next=-1 Y 结束
进程调度流程图 开始 Y 就绪队列为空? N 就绪队列头指针赋给 i i=ready.head 就绪队列指针后移 Ready.head=pcbareaa[ready.head].next 无进程可以调度 就绪队列空? N Y 就绪队列尾指针置为空: ready.tail=-1 修改进程控制快状态 pcbarea[i].status=running 设置相对时钟寄存器 TIME=时间片 恢复该进程现场信息: AX=ax;BX=bx;CX=cx; DX=dx;PC=pc; PSW=psw 修改指向运行进程的指针 run=i 4.编写模拟程序,源代码如下:
#include #define running 1 #define aready 2 #define blocking 3 #define sometime 5 #define n 10 struct {int name; int status; int ax,bx,cx,dx; int pc; int psw; int next; }pcbarea[n]; int PSW,AX,BX,CX,DX,PC,TIME; int run; struct {int head; int tail; }ready; int pfree; void sheduling() { int i; if(ready.head==-1) {printf("无就绪进程\n"); return; } i=ready.head; ready.head=pcbarea[ready.head].next; if(ready.head==-1)ready.tail=-1; pcbarea[i].status=running; TIME=sometime; AX=pcbarea[run].ax; BX=pcbarea[run].bx; CX=pcbarea[run].cx; DX=pcbarea[run].dx; PC=pcbarea[run].pc; PSW=pcbarea[run].psw; run=i; } void create(int x) {int i; if(pfree==-1)
分享到:
收藏