收藏 分享(赏)

OS综合实验报告.doc

上传人:精品资料 文档编号:10217500 上传时间:2019-10-21 格式:DOC 页数:27 大小:1.38MB
下载 相关 举报
OS综合实验报告.doc_第1页
第1页 / 共27页
OS综合实验报告.doc_第2页
第2页 / 共27页
OS综合实验报告.doc_第3页
第3页 / 共27页
OS综合实验报告.doc_第4页
第4页 / 共27页
OS综合实验报告.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、 综合实验报告名 称:操作系统原理综合实验院 系:计算机系 班 级:计科 0901 学 号:200909010116 学生姓名: 指导教师:赵文清 成 绩: 日期:2011 年 11 月 9 日1、实验名称 单处理器系统的进程调度2、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。3、实验内容与要求1、设计多个进程并发执行的模拟调度程序,每个程序由一个 PCB 表示。2、模拟调度程序选择优先数调度算法实现。3、程序执行中应

2、能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。四、实验原理及说明1、假定系统有五个进程,每一个进程用一个进程控制块 PCB 来代表。进程控制块的格式为:进程名指针要求运行时间已运行时间状态其中,进程名作为进程的标识,假设五个进程的进程名分别为Q1,Q 2,Q 3,Q 4,Q 5。指针进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间假设进程需要运行的单位时间数。已运行时间假设进程已经运行的单位时间数,初始值为“0” 。状态有两种状态, “就绪”和“结束” ,初始状态都为“就绪” ,用“R”表示。当一个

3、进程运行结束后,它的状态为“结束” ,用“E”表示。2、每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间” 。3、 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到 P2 执行,则有:标志单元K2 K1 Q1 K2 Q2 K3 Q3 K4 Q4 K5 Q5K2 K3 K4 K5 K12 3 1 2 41 0 0 0 0R R R R RPCB1 PCB2 PCB3 PCB4 PCB54、处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时

4、间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。5、进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束” (E)

5、且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。6、若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。7、在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。8、为五个进程任意确定一组“要求运行时间” ,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。五、实验流程开始输入进程总数指针所指的进程是否结束输入各进程信息输出为就绪状态的进程的信息更改正在运行的进程的已运行时间跳过已结束的程序结束N指向下一个进程Y如果存在下一个进程的话YN

6、输出此时为就绪状态的进程的信息六、实验结果七、实验总结本实验实现了在单处理器情况下的进程调度,我采用了按时间轮转法实现处理器调度,程序编写的比较简单,基本达到实验目的。本实验的成功完成加深了我对进程调度算法的理解,这为后面的作业调度等实验的完成打下了坚实的基础,让我有信心去完成后面的实验设计。程序如下:#includetypedef struct pcbchar name10;int ntime;int rtime;char estate;struct pcb *next;*pointer;void Creatlist(pointer head=new pcb;head-next=NULL;f

7、=head;for(int i=1;inext=NULL;coutp-name;coutp-ntime;p-rtime=0;p-estate=R;f-next=p;f=f-next;qi=p;f=head-next;l=p;l-next=f;void Cout(pointer inamentimertimeestate;coutnext;while(p-next!=p)|(p-ntime!=p-rtime)p-rtime=p-rtime+1;coutnamentime=p-rtime)p-estate=E;coutnamenext=p-next;p=q-next;elsep=p-next;q=

8、q-next;Cout(head,r);void main()pointer h,f,l,q5;Creatlist(h,f,l,q);Cout(h,q);suanfa(h,f,l,q);1、实验名称 批处理系统中作业调度2、实验目的通过本实验算法的设计加深对作业调度的认识,清楚作业调度的全过程。3、实验内容与要求此实验模拟批处理系统中的作业调度,并采用响应比高者优先算法作为作业调度算法。4、实验原理及说明1、从输入井中选择作业读入内存,使其获得处理器,得到运行的机会,即为作业调度。输入井中的作业用“作业控制块” (JCB,如下所示)标识,为了进行作业调度,将作业控制块组成一个队列,这个队列称为

9、后备队列。2、模拟实验中没有实际作业,作业控制块中的信息内容只使用了模拟实验中需要的数据。作业控制块中包括作业名、作业大小、所需打印机台数、所需磁带机数量、作业估计执行时间、作业等待时间、指向下一个作业控制块的指针等内容。将作业控制块组成一个队列,实验中采用动态链表的方式模拟作业的后备队列。作业控制块采用结构型数据模拟。3、模拟实验中,主存采用可移动的可变分区管理方法,即只要主存空闲区总和比作业大就可以满足作业对主存的需求。对打印机和磁带机这两种独占设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。4、实验中作业的调度采用响应比高者优先算法。响应比为作业的等待时间和作业估计执

10、行时间之比。首先计算出输入井中满足条件的作业的响应比,从中选择响应比最高的一个作业装入主存储器,分配资源。由于是模拟实验,可将作业控制块出队装入主存储器的工作用输出作业名模拟,同时修改系统的资源数量。5、模拟实验时,可以首先假设系统的资源情况。假设系统资源只有主存 200MB、磁带机 10 台、打印机 10 台,然后手工输入某个时刻输入井中的各个作业情况,最后进行作业调度到就绪队列,按先来先服务进程调度进行进程调度,输出调用情况。6、批处理系统中的作业调度模拟程序主要由创建作业队列的程序段、作业调度函数组成和进程调用函数组成。五、实验流程六、实验结果七、实验总结本实验是完成批处理系统作业调度,

11、我采用的是高响应比优先调度算法,总体来说本实验还算成功,基本达到实验目的。实验的基本原理比较简单,但是仍然遇到了一些问题,让我我明白了实际编程和理论知识间的差异,明白了在学习课本的基础上我们还需要很多的时间才能真正学好这门课程。程序如下:#includetypedef struct jcbchar name4;int length;int nprinter;int ntape;double ntime;double wtime;struct jcb *next;*Pointer;int tape=2,printer=4,memory=64;void Creatlist(Pointer head

12、=new jcb;head-next=NULL;q=head;for(int i=1;inext=NULL;coutp-name;coutp-length;coutp-nprinter;coutp-ntape;coutp-ntime;coutp-wtime;q-next=p;q=q-next;Pointer Findmax(Pointer Pointer p,q;p=head;doif(head-next!=NULL)p=p-next;x=p-wtime/p-ntime;if(xtemp)temp=x;q=p;while(p-next!=NULL);return q;void Deletejc

13、b(Pointer p=head;while(p-next!=q)p=p-next;p-next=q-next;void suanfa(Pointer double temp;for(int i=1;inamewtime;Deletejcb(head,q);while(p-next!=NULL)p=p-next;p-wtime=temp+(p-wtime);void main()Pointer head;Creatlist(head);suanfa(head);一、实验名称 银行家算法二、实验目的和要求银行家算法是避免死锁的一种重要方法,要求编写和调试一个简单的银行家算法程序。加深了解有关资源

14、申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。三、实验内容1设计进程对各类资源最大申请表示及初值确定。2设定系统提供资源初始状况。3设定每次某个进程对各类资源的申请表示。4编制程序,依据银行家算法,决定其申请是否得到满足。四、实验原理及说明1数据结构假设有 M 个进程 N 类资源,则有如下数据结构:MAXM*N M 个进程对 N 类资源的最大需求量AVAILABLEN 系统可用资源数ALLOCATIONM*N M 个进程已经得到 N 类资源的资源量NEEDM*N M 个进程还需要 N 类资源的资源量2银行家算法设进程 I 提出请求 RequestN,则银行家算法按如下规则进行

15、判断。(1)如果 RequestN#define M 5 /总进程数#define N 3 /总资源数#define false 0#define true 1int MaxMN=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3;int AvailableN=3,3,2;int AllocationMN=0,1,0,2,0,0,3,0,2,2,1,1,0,0,2;int NeedMN=7,4,3,1,2,2,6,0,0,0,1,1,4,3,1;int Find(int WorkN,bool FinishM)/m 为 false 个数int i=0,k,x=0;for(int n=0;

16、ni;coutRequestij;m=0;for(int i1=0;i1#include #include#define getMEM() (MEM*)(malloc(sizeof(MEM)typedef struct Memory/可用分区链表节点int base;/基地址int size;/大小struct Memory *next;MEM;MEM *pm = getMEM();/可用分区的链表头MEM *temp;/int SIZE;/总的内存的大小,由用户输入int geti()/让用户只能输入正整数char ch;int i = 0;fflush(stdin);ch = getcha

17、r();while(ch = n)printf(“tf 输入不能为空 请重新输入n“);fflush(stdin);ch = getchar();while(ch != n)if(ch 9 | ch next)if(p-base + p-size next-base p= p -next;if(!p-next return false;bool release(MEM *pm, int base, int size)/释放内存空间MEM *p = pm;if(!check(pm, base ,size)return false;while(p-next)if(base + size next-

18、base)break;p = p-next;if(base = p-base + p-size)/低地址相邻if(p -next temp = p-next;p-next = p-next-next;free(temp);else/仅与地地址相邻p-size += size;else if (p-next p-next-size += size;else/释放区上下与空闲区都不相邻temp = getMEM();temp-size = size;temp-base = base;temp-next = p-next;p-next = temp;return true;int allocMem(

19、MEM *pm, int size)/分配内存空间MEM *p = pm;int base;while(p-next)if(p-next-size = size)break;p = p-next;if(!p-next)return -1;if(p-next-size = size)/空闲分区大小刚好等于所需分区base = p-next-base;p-next = p-next-next;elsep-next-size -= size;base = p-next-base;p-next-base += size;return base;void print(MEM *pm)/打印空闲分区表和空

20、闲分区链MEM *p = pm-next;puts(“n*空闲内存分区链:*n“);puts(“基地址 tttt 大小n“);while(p)printf(“%dtttt%dn“,p-base,p-size);p = p-next;puts(“n*主存空间占用情况表:*n“);puts(“基地址 tttt 大小n“);p = pm;while(p-next)printf(“%dtttt%dn“,p-base + p-size, p-next-base - p-size - p-base);p= p -next;if(p-base + p-size base + p-size, SIZE- p-

21、base - p-size);void init()/初始化总内存大小和空闲分区链的头结点pm-base = 0;pm-size = 0;pm-next = getMEM();puts(“请输入可用内存空间大小: “);SIZE = geti();pm-next-size = SIZE;pm-next-base = 0;pm-next-next =NULL;int main()int size = 0,base = 0;int ch;init();print(pm);while(1)puts(“分配空间请按 1,释放空间请按 2n“);ch = getche();if( ch = 1)puts

22、(“n 请输入需要分配的空间大小: “);size =geti();if(base = allocMem(pm, size) = -1)puts(“空闲内存分区大小不足 n“);elseprintf(“n 分配内存成功,此次分配的内存基地址为%dn“,base);print(pm);else if(ch = 2)puts(“n 请输入要释放内存的基地址: “);base = geti();puts(“n 请输入要释放内存的大小: “);size = geti();if(release(pm, base, size)puts(“n 释放内存成功!n“);print(pm);elseputs(“非法操作 ,您所给的内存范围没有被分配出去:n“);return 0;结束语:这次操作系统的课程设计主要是模拟了上课学习的理论知识应用到实验当中,虽然感觉上课的时候听的比较认真也都懂得了基本的理论知识,但是实验刚开始的时候发现上机实验完全不是不一样的,需要自己去设计,而且仅仅靠上机实验的几节课是不可能完成实验的,因此课下也需要努力,这样才能从容的完成课程设计。本次实验让我更加深刻的理解了上课所学的知识,将理论用模拟的方法呈现了出来,但可惜的是没能将四个实验整合到一起,这是需要提高的地方。最后感谢赵老师的悉心指导!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报