操作系统实验报告.docx
- 文档编号:23041886
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:30
- 大小:656.07KB
操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
操作系统实验报告
学生学院____计算机学院______
专业班级______计科2班_______
学号_________
学生姓名_____________
指导教师_____李敏________
2015年1月7日
目录
1实验一进程调度………………………………………………………………1
2实验二作业调度………………………………………………………………
3实验三存储管理………………………………………………………………
4实验四主存空间的分配与回收………………………………………………
1实验一进程调度
1、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
2、实验内容及要求
设计一个有N个进程并发的进程调度程序。
要求采用最高优先数优先算法,时间片轮转算法,多级反馈队列高度算法这三种算法。
每个进程有一个进程控制块表示,进程控制块可以包含如下信息:
进程名,优先数,到达时间,需要运行时间,已用CPU时间,进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(wait),运行R(RUN),或完成F(FINISH)三种状态之一。
如果运行一个时间片后,进程的已占用CPU时间已经达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应该将进程的优先数减1,然后把它插入就绪队列等待CPU.每进行一次调度程序就打印一次运行进程,就绪队列,以及各个进程的PCB,以便地检查。
重复以上过程,直到所要进程都完成为止。
3、实验设计方案及原理
1.最高优先数优先算法:
因为算法是根据进程的优先级进行排序的,所以在程序中要用到优先队列,在C++中就是priority_queue,同时要将队列的排序依据改为PCB中的优先级,并将优先级最高的进程PCB放在队列头。
这样,每次CPU从准备队列中取得一个进程时,都是取队列头的进程,因为他优先级是最高的,然后将一个进程重新放回队列中时,他会被重新排序到适当的位置,无论如何,队列头中都是存放优先级最高的进程。
2.轮转法:
算是根据FCFS排成一个队列,所以只需要用简单的队列就可以实现,每次CPU从准备队列中取一个进程,都是取队头的进程,放回一个进程时,进程会被放到队尾。
各进程占用的时间片桐,直到所有的进程运行完毕。
4、程序流程图(一个实验有多个算法的应该分别给出)
1.最高优先数优先算法:
左图
2.轮转时间片算法:
右图
5、各程序之间的调用关系
在主函数中生成一个进程调用类,然后对类进行初始化,类中的PCB数组中的各项数据被随机生成。
然后打印出来。
紧接着,使用runing从就优先队列中取出一个进程PCB,进行相关操作后,其时间片和优先级都被改变,判断是否所需时间片已经满足,如果满足,则调用destroyPCB,将结束的进程打印出来,并从队列中永久去掉,如果没有满足,则调用waitPCB重新将进程PCB放入队列中。
重复以上进程。
6、重要数据结构或源程序中疑难部分的说明,需附详细注释。
数据结构:
typedefstructpcb{//定义进程控制块PCB
std:
:
stringname;//名称
STATEstate;//状态
intsuper;//优先级
intntime;//所需时间片
intrtime;//已运行的时间
}PCB,*PPCB;
7、程序运行结果
时间片轮转:
高优先级:
8、结果分析与实验小结
高优先级优先:
动态优先权是指在创建进程时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。
处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。
时间片的轮转法:
系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。
每运行一次,进程的需要时间减1,直到就绪队列为空!
2实验二作业调度
1、实验目的
本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
2、实验内容及要求
模拟批处理多道操作系统的作业调度
(1)。
写并调试一个作业调度模拟程序。
(2)。
作业调度自满:
分别采用先来先服务和短作业优先调度算法。
(3)。
在批处理系统中,要假定系统中具有的各种资源及数量,调度作业必须考虑到每个作业的资源要求,所需要的资源是否得到满足。
作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。
作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。
但有系统中现在的尚未分配的资源即可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出先择。
当作业正常运行完毕或因发生错误非正常终止时,作业进入完成状态,此时,系统将收回该作业所战胜的全部资源,并清除有关的JCB。
并输出显示作业运行情况及作业输出结果。
3、实验设计方案及原理
(1)。
先来先服务算法:
是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。
(2)。
短作业优先算法:
总是按作业要求运行的时间来先择作业,每次挑选要求运行时间短且资源要求能满足的作业先进入主存执行。
(3)。
当作业执行结束进入完成状态时,做好释放资源等善后工作。
(4)。
本实验主要模拟作业高度,所以对处理器调度,作业控制过程简化。
用输入随机数模拟处理器调度,用输出“用户名,作业名“模拟一个作业已经执行结束。
(5)。
为作业分配资源可用修改资源分配表来代替。
4、程序流程图(一个实验有多个算法的应该分别给出):
左边的图有先来先服务算法,右边的图为短作业优先算法。
4、各程序之间的调用关系
程序开始时,先调度初始化函数,将等待队列中的作业JCB随机赋值。
然后按照作业到达时间进行排序。
然后调用调度函数对作业进行调度。
对于先进先服务算法,在作业调度时,直接根据作业的到达时间选择作业,然后再判断作业的资源能否得到满足,如果不能,则依序先择下一个作业。
而短作业优先就将所有满足要求的作业中选择运行时间最短的。
接着调用running函数,使作业得到运行,减少相应的运行的JCB的所需时间,判断是否已经运行完成,如果运行完成,则将其状态变为结束状态,撤消JCB,如果作业等待队列中还有作业,则继续进行调度,否则退出程序。
重要数据结构或源程序中疑难部分的说明,需附详细注释。
JCB的数据结构如下:
typedefstructjcb{
std:
:
stringname;
inthtime;//提交时间
intntime;//所需时间
intnmemory;//所需内存
intnhardware;//所需硬件
std:
:
stringstate;
}JCB,*PJCB;
关键部分代码:
短作业优先调度的程序
std:
:
vector
:
iteratorite;
//在某一时刻进行作业调度
//如果作业等待队列中有满足运行条件的作业,则调入运行
while
(1){
ite=SJF_vector.begin();
boolflag=false;
PJCBtemp=NULL;
//先找出满足条件的作业中运行时间最短的作业,作为运行对象
while(ite!
=SJF_vector.end()){
if(ite->get()->htime<=curTime&&
jobcanrun(ite->get())){
if(flag==false){
temp=ite->get();
flag=true;
}
else
{
if(ite->get()->ntime
temp=ite->get();
}
}
ite++;
}
//分配资源给作业并将作业状态改为Run
if(temp!
=NULL){
reduceResource(temp);
temp->state=Run;
std:
:
cout<<"说明:
作业\t"< : endl; showTable(); std: : cout<<"按任一键继续。 。 。 。 "< : endl; //getchar(); } else break; } 8、程序运行结果 先来先服务算法结果: 开始状态: 结束状态: 短作业优先算法: 初始状态: 最后听结果: 8、结果分析与实验小结 从结果可以看出,这两个算法在某些层面上会达到相同的效果,但是随着作业数目的增多和资源数目的增加,短作业优先算法会比先来先服务算法具有更好的处理效率。 3实验三存储管理 1、实验目的 1通过编写和高度存储管理的模拟程序以加深对存储管理方案的理解。 熟悉虚存管理的各种页面淘汰算法。 2.通过编写和调度地址转换过程的模拟程序以加强对地址转换过程的了解。 2、实验内容及要求 设计一个请求页式存储管理方案。 并编写模拟程序实现。 产生一个需要访问的指令地址流。 它是一系列需要访问的指令的地址。 为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得50%的指令是顺序执行的。 25%的指令均匀地散在前地址部分,25%的地址是均匀地散布的后地址部分。 为简单起见,页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。 而不再判断它是否被改写过,也不将它写回到辅存。 具体的做法可以是: 产生一个需要访问的指令地址流: 指令合适的页面尺寸;指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存—如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况,如果该页不足内存且页表已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况,逐个地址访问,直到所有地址访问完毕。 2、实验设计方案及原理 可变分区分配的存储管理方案。 并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一: 首次适应算法,循环首次适应算法,最佳适应算法。 我选择的是实现循环首次适应算法和最佳适应算法。 一个段页式存储管理的地址转换的模拟程序: 首先设计好段表,页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。 找印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。 3、程序流程图(一个实验有多个算法的应该分别给出) 循环首次适应算法: 最佳适应算法: 段页存储地址转换: 4、各程序之间的调用关系 循环首次适应算法: 首先调用初始化程序next_fit,然后使用showMBR输出分区表和作业表。 提示用用户选择进行作业分配还是内存回收。 如果用户选择了作业分配,则调用allocation函数,进行分配工作,如果用户选择回收,则调用recycle函数,对指定的分区号进行回收管理。 最佳适应算法: 和首次适应算法在大多数地方上都是相同的,但是在初始化作业表和分区表的时候会对分区表调用insertSort排序,也就是将一个结点插入到链表,插入的条件是结点的空间小于下一结点的空间,则将结点插入到当前结点的前一个位置。 在调用分配函数或回收工作后都要重新调用这个函数,对空闲分区进行排序工作,才能保证下一次运行正确。 地址转换模拟程序: 先调用初始化函数addr_translate函数,初始化段表和相应的页表。 然后调用getAddr,提示用户输入格式为段号: 页号: 页内地址的串。 在函数中处理这个串,将其分解出来,然后再调用translate函数将其转换为内存地址。 5、重要数据结构或源程序中疑难部分的说明,需附详细注释。 循环首次算法: boolnext_fit: : allocation(constint&jcbNum){ if(jcbNum<0) returnfalse; std: : vector : iteratorite=JCBvector.begin(); inti=0; //将ite定位到jcbNum对应的作业 while(ite! =JCBvector.end()&& i++! =jcbNum)ite++; if(ite==JCBvector.end()) returnfalse; JCBPointerjcb=*ite; MBRPointermbr=curPos; if(jcb->state! =Wait) returnfalse; //如果分区能满足作业的空间要求的话 do{ if(mbr->size>=jcb->size&& mbr->state==Free){ curPos=mbr; //对分区进行分割,分割出空闲分区重新加入链表 MBRdivision(jcb); jcb->state=Run; break; } mbr=mbr->linkMBR; }while(mbr! =curPos); if(jcb->state==Run) returntrue; returnfalse; } 最佳适应算法: 与循环适应算法大多数都是相同的,不同处在于在分割或回收后将空闲分区按排序插入链表: voidbest_fit: : MBRdivision(JCBPointerjcb){ intextendSize=curPos->size-jcb->size; //如果分割完成后有剩余的空间 //则将剩余空间变成一个新的空闲分区 if(extendSize! =0){ MBRPointernewMBR=MBRPointer(newMBR); newMBR->num=curPos->num+1; newMBR->size=extendSize; newMBR->start=curPos->start+jcb->size; newMBR->state=Free; newMBR->job=None; newMBR->linkMBR=curPos->linkMBR; //产生的新分区应该使用函数insertSort在插入的时候同时进行排序 insertSort(newMBR); } curPos->size=jcb->size; curPos->job=jcb->name; curPos->state=Allocated; } 6、程序运行结果 循环首次适应算法: 开始时: 结束时: 最佳适应算法: 开始时: 输入选项并运行后: 地址转换程序: 输入后并运行后: 8、结果分析与实验小结 由结果可以看出循环首次算法和最佳适应算法产生的分区表还是有区别的,循环首次算法产生的空闲分区还是比较均匀的,但是不确定的。 最佳适应算法会产生很多比较难利用的太小的分区,除非进行回收时被合并,不然可能永远都不能被利用,造成内存浪费。 4实验四主存空间的分配与回收 1、实验目的 熟悉主存的分配与回收。 理解在不同的存储管理方式下,如何实现主存空间的分配与回收。 掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 2、实验内容及要求 主存的分配和回收的实现是与主存储器的管理方式有关的。 所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。 所谓回收,就是当作业运行完成时将作业或进程所战胜的主存空间放还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。 当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。 随着作业的装入,完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中手忙脚乱的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法,循环首次适应算法,最佳适应算法三种算法实现主存的分配与回收。 同时,要求设计一个实用友好的用户界面,并显示分配和回收的过程。 3、实验设计方案及原理 采用可变分区存储管理,使用空闲分区表或空闲分区链实现主存分配和回收。 设计一张空闲区说明,记录哪些分区是空闲的。 为内在中每个尚未分配出去的分区设置一个表项,包括分区序号,分区始址,分区大小及该分区的状态。 当分配内存空间时,就从中进行查找,如找到符合条件的空间区就分配给作业。 使用链指针把所有的空间分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位,分区的大小和链接各个分区的前身指针,由状态位指示该分区是否已经分配出去了,分区的中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由0置为1. 设置一个内存空间分区链,内存空闲分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲区低端的空间。 设计一个空闲分区说明表,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。 初始化空闲区和已分配区说明表的值。 设计作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。 要求每次分配和回收后显示出空闲内在分区链的情况。 把空闲分区说明链的变化情况以及各作业的申请,释放情况显示打印出来。 4、程序流程图(一个实验有多个算法的应该分别给出) 5、各程序之间的调用关系 在主程序中根据用户的选择调用allocateMemory进行分区分配还是调用freeMemory函数进行内存回收。 在allocateMemory中,调用了divideMemory对空闲分区进行分割,将其分割成两一部,一部分通过insertToAllocated进入到已分配链中,另一部分则还留在空闲分区链中。 在freeMemory中,调用了combineMemory对分区进行重组合并,在已分配分区中,找到相应的分区后,将其从链中移除,然后通过insertToFree加入空闲分区链中。 6、重要数据结构或源程序中疑难部分的说明,需附详细注释。 boolAllocation: : allocateMemory(constint&job){ std: : vector : iteratorite=jcbTbl.begin(); for(inti=0;i! =job&&ite! =jcbTbl.end();i++){ ite++; } if(ite==jcbTbl.end()) returnfalse; JCBPointerjcb=*ite; if(jcb->state! =Wait) returnfalse; //查找空闲分区表中是否有满足条件的分区 MBRPointerpmbr=freeHead; while(pmbr! =NULL){ //如果当前分区满足,则分割,并设置状态,然后退出 if(pmbr->size>=jcb->size){ divideMemory(pmbr,jcb); break; } //如果不满足,则查找下一个分区 pmbr=pmbr->nextLink; } if(pmbr==NULL) returnfalse; jcb->state=Run; returntrue; } boolAllocation: : freeMemory(constint&mbr){ MBRPointerpointer=allocatedHead; if(pointer==NULL) returnfalse; while(pointer! =NULL){ //在分配分区表中查找mbr号 if(pointer->num==mbr){ //然后重新插入空闲分区表中 combineMemory(pointer); break; } pointer=pointer->nextLink; } if(pointer==NULL) returnfalse; returntrue; } 7、程序运行结果 初始化完成后: : 分配存储: 回收内存: 8、结果分析与实验小结 由结果可以看出,实验结果是满足要求的,但是在编程过程中由于使用链表,并且用向前向后指针,所以查找分区块的过程是比较简单的。 而且回收过程中的合并过程情况的分析比较复杂,会影响效率。 此页只是提交要求,请在实际打印时删除。 报告要求: 请按上述8个要点进行实验报告,缺一个要点扣一定的分数。 提交要求: (1)以光盘(以班为单位刻录)方式提交: 已调试通过的完整的相关源程序和能够运行的执行文件;“实验报告”的word文档。 采用学号加姓名为每位同学文件夹的文件名。 (2)“实验报告”的书面打印版本。 强调说明,源程序或实验报告雷同者,实验成绩直接不合格。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告