操作系统综合实验实验报告.docx
- 文档编号:23672498
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:45
- 大小:425.28KB
操作系统综合实验实验报告.docx
《操作系统综合实验实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统综合实验实验报告.docx(45页珍藏版)》请在冰豆网上搜索。
操作系统综合实验实验报告
实验一单处理器系统的进程调度
一、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
二、实验要求
1.设计一个按时间片轮转法实现处理器调度的程序,每个程序由一个PCB表示。
2.程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
三、实验原理
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的格式为:
进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。
当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到P2执行,则有:
标志单元
K2
K1
Q1
K2
Q2
K3
Q3
K4
Q4
K5
Q5
K2
K3
K4
K5
K1
2
3
1
2
4
1
0
0
0
0
R
R
R
R
R
PCB1
PCB2
PCB3
PCB4
PCB5
(4)处理器调度总是选择标志单元指示的进程运行。
由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请同学注意:
在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间¹已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。
若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。
此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。
(6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。
(8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。
流程图→
四、实验所需仪器、设备、材料(试剂)
不限制编程语言及环境,建议采用C++。
五、实验方法及步骤
1、进程块:
structPCB{
charname;
intRunTime;
intRequestTime;
intsuper;
charstatus;
structPCB*head;
structPCB*next;
};
2、实验核心算法:
//判断进程块的优先权,从而选择需要执行的进程
while(n<=PcbNum){
if((p->RequestTime==0)||(p->RequestTime==p->RunTime))
{
p->status='E';
}
cout<<"\t"<
cout<<"\t"< cout< if((p->RunTime==p->RequestTime)&&(n==1)){ q=p; Number=Number-1; } p=p->next; n++; PcbNum=Number; } 3、执行过程: if(q! =NULL) { if(q->RunTime==q->RequestTime) { q->status='E'; q->head->next=q->next; q->next->head=q->head; cout<<"进程"< p=q->next; q=p; } else { p=p->next; } } if(q==NULL) { p=p->next; } if(PcbNum! =0) { flag=0; cout<<"回车继续执行"< a=getchar(); if(a=='\n') flag=1; else { cout<<"程序结束"< flag=0; } } if(PcbNum==0) { flag=0; cout<<"进程经已全部执行完毕"< } 程序运行截图(部分): 六、实验总结: 在单处理机系统中,一次只以执行一个进程,在时间片轮转的算法调度中,是顺序执行一个时间片。 进程是有生命的,而pcb是其唯一标识,所以模拟实验也需要对pcb的信息模拟输入,通过对该实验的操作,对处理机调度,及系统组织创建进程有了更明确的了解,达到了实验的目的,并在上机的操作过程中得到了老师的指点,使得原本不太明白的pcb组织有了清楚的认识。 附: //源代码 #include #include #defineNULL0 charName[5]={'a','b','c','d','e'}; intSuper[5]={4,5,7,10,6}; structPCB{ charname; intRunTime; intRequestTime; intsuper; charstatus; structPCB*head; structPCB*next; }; structPCBpcb1,pcb2,pcb3,pcb4,pcb5,*p,*q; voidValue() { pcb1.name=Name[0]; pcb2.name=Name[1]; pcb3.name=Name[2]; pcb4.name=Name[3]; pcb5.name=Name[4]; pcb1.super=Super[0]; pcb2.super=Super[1]; pcb3.super=Super[2]; pcb4.super=Super[3]; pcb5.super=Super[4]; pcb1.status='R'; pcb2.status='R'; pcb3.status='R'; pcb4.status='R'; pcb5.status='R'; pcb1.RunTime=0; pcb2.RunTime=0; pcb3.RunTime=0; pcb4.RunTime=0; pcb5.RunTime=0; cout<<"初始设定: "< cout< "; cin>>pcb1.RequestTime; cout< "; cin>>pcb2.RequestTime; cout< "; cin>>pcb3.RequestTime; cout< "; cin>>pcb4.RequestTime; cout< "; cin>>pcb5.RequestTime; } voidConnect() { pcb1.head=&pcb5; pcb2.head=&pcb1; pcb3.head=&pcb2; pcb4.head=&pcb3; pcb5.head=&pcb4; pcb1.next=&pcb2; pcb2.next=&pcb3; pcb3.next=&pcb4; pcb4.next=&pcb5; pcb5.next=&pcb1; } voiddisplay() { cout<<"进程名称"<<"下一进程名"<<"运行时间"; cout<<"要求时间"<<"优先级"<<"状态"< } voidRun() { chara; intnum,n,PcbNum=5,Number=5,flag=1; q=NULL; cout<<"请选择要运行的进程: ";cin>>num; cout< switch(num) { case1: p=&pcb1; break; case2: p=&pcb2; break; case3: p=&pcb3; break; case4: p=&pcb4; break; case5: p=&pcb5; break; } while(flag==1){ n=1; if((p->RequestTime==0)||(p->RequestTime==p->RunTime)) { p->status='E'; } else{ p->RunTime=p->RunTime+1; } cout<<"进程运行情况如下所示: "< cout<<"当前正在执行的进程名称为: "< display(); while(n<=PcbNum){ if((p->RequestTime==0)||(p->RequestTime==p->RunTime)) { p->status='E'; } cout<<"\t"< cout<<"\t"< cout< if((p->RunTime==p->RequestTime)&&(n==1)){ q=p; Number=Number-1; } p=p->next; n++; PcbNum=Number; } if(q! =NULL) { if(q->RunTime==q->RequestTime) { q->status='E'; q->head->next=q->next; q->next->head=q->head; cout<<"进程"< p=q->next; q=p; } else { p=p->next; } } if(q==NULL) { p=p->next; } if(PcbNum! =0) { flag=0; cout<<"回车继续执行"< a=getchar(); if(a=='\n') flag=1; else { cout<<"程序结束"< flag=0; } } if(PcbNum==0) { flag=0; cout<<"进程经已全部执行完毕"< }}} voidmain() {Value(); Connect(); Run(); } 实验二批处理系统中作业调度 一、实验目的 此实验模拟批处理系统中的作业调度,并采用响应比高者优先算法作为作业调度算法,加深学生对作业调度的理解。 二、实验要求 1.设计多个作业执行的模拟调度程序,每个作业由一个JCB表示。 2.采用响应比高者优先算法作为作业调度算法。 3.程序执行中应能在屏幕上显示出各作业的状态变化,以便于观察调度的整个过程。 三、实验原理 1.从输入井中选择作业读入内存,使其获得处理器,得到运行的机会,即为作业调度。 输入井中的作业用“作业控制块”(JCB)标识,为了进行作业调度,将作业控制块组成一个队列,这个队列称为后备队列。 2. 采用响应比高者优先算法的作业调度程序流程图 N Y N Y Y Y N Y 3.由于实验中没有实际作业,作业控制块中的信息内容只使用实验中需要的数据。 并假定系统资源只有64KB主存、4台磁带机、和2台打印机; 四、实验过程 分析算法: if(p->length<=memory&&p->tape<=tape&&p->printer<=printer)//判断响应比 { xk=(float)(p->waittime)/p->runtime; if(q==NULL||xk>k) { k=xk; q=p; t=s; } } s=p; p=p->next; 程序运行截图: 五、实验总结: 该实验是一个作业调度算法的模拟程序实验,在实验操作过程中我在调度算法这个函数上花了很多的时间,才达到了实验预定的目的。 虽然只是一个模拟,但使我对响应比高者优先这种作业调度算法有了更深层次的题解,通过C语言的实现,也使我对其它的算法有了一种理论与实践结合的思想,从本质上掌握各种算法理论。 同样的作业调度算法还有先来先服务、短作业优先等常用算法,本次的实验也促使我更深入去了解这些其它的常用算法。 附: //源代码 #include"stdlib.h" #include #include #include typedefstructjcb { charname[4]; intlength; intprinter; inttape; intruntime; intwaittime; structjcb*next; }JCB; JCB*head; inttape,printer; longmemory; voidshedule() { floatxk,k; JCB*p,*q,*s,*t; do { p=head; s=NULL; q=NULL; k=0; while(p! =NULL) { if(p->length<=memory&&p->tape<=tape&&p->printer<=printer) { xk=(float)(p->waittime)/p->runtime; if(q==NULL||xk>k) { k=xk; q=p; t=s; } } s=p; p=p->next; } if(q! =NULL) { if(t==NULL) head=head->next; else t->next=q->next; memory=memory-q->length; tape=tape-q->tape; printer=printer-q->printer; printf("选中作业的作业名: %s\n",q->name); } }while(q! =NULL); } voidmain() { charname[4]; intsize,tcount,pcount,wtime,rtime; JCB*p; memory=65536; tape=4; printer=2; head=NULL; cout<<"输入作业相关数据: "< cout<<"输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间"< scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime); while(size>0) { p=(JCB*)malloc(sizeof(JCB)); strcpy(p->name,name); p->length=size; p->printer=pcount; p->tape=tcount; p->runtime=rtime; p->waittime=wtime; p->next=head; head=p; cout<<"输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间"< scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime); } shedule(); } 实验三银行家算法 一、实验目的 银行家算法是避免死锁的一种重要方法,要求编写和调试一个简单的银行家算法程序。 加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 二、实验要求 1.设计进程对各类资源最大申请表示及初值确定。 2.设定系统提供资源初始状况。 3.设定每次某个进程对各类资源的申请表示。 4.编制程序,依据银行家算法,决定其申请是否得到满足。 三、实验原理 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N]系统可用资源数 ALLOCATION[M*N]M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转 (2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。 流程图如下: 四、实验方法及步骤 1.数据矩阵的初始化 结合所给实例,可看到在这里存在最大需求矩阵、分配矩阵、可用资源矩阵等多种矩阵形式,故在此将矩阵初始化,设成二维或部分一维矩阵。 即按要求设定所有进程数与资源数,以便得知接下来各矩阵为几行几列矩阵; 2.安全性算法 先对进程标记其状态,再根据原理进行算法的具体编译,当满足所有条件,输出系统安全的标志,并进行下一步操作。 即先初始化资源分配至进程前的状态为false,再根据工作向量与需求矩阵地动态对比,逐个分析系统资源,满足条件的就合理释放出分配给它的资源,并将进程状态做相应修改true,直至所有进程都满足,则表示系统处于安全状态,否则,处于不安全状态; 3.银行家算法 确定需要申请资源的进程号和资源数,由原理设置具体程序,在输入数据进行计算之前,要先验证,所需资源数是否条件满足,不会溢出,计算之后还要进行一次安全性检验。 即操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。 若超过则拒绝分配资源,基没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配; 流程图如下: 程序执行结果: 五、实验总结 对于已编译并调试好的程序中,将输入数据后得到的结果,与教材所提供的结果进行对比,发现并不相同。 于是在对已有程序进行详细检查之后确定没有错误的可能之后,又上网进行相关内容的查询,得知此答案并不唯一,也就是会出现多种满足条件的结果,只要判断情况合理,完全出现不同的安全序列。 除本实验所提供的数据之外,在通过几个实际例子的不断演算,发现在现有剩余资源的前提下应尽可能早的首先给最大需求量大的进程分配资源,但不是完全正确的。 在上面这个条件下,有时候,也不能完全正确的找到路径,因为中间存在着最大需求量值同样最大的情况,或者当前资源剩余量无法满足进程对资源的最大需求量。 用银行家算法实现资源分配。 多个进程动态共享系统的资源可能会产生
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 综合 实验 报告