操作系统实验Word文件下载.docx
《操作系统实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信1息:
进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2.每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实现思路
本程序采用了非抢占式短作业优先调度。
而非抢占式这种方式,一旦把处理机分配给某进程后,便让该进程一直执行,直至该进程完成或发生某事件而被阻塞时,才再把处理机分配给其它进程,决不允许某进程抢占已经分配出去的处理机。
4、主要的数据结构
privateStringname;
//进程名
privateintstate;
//0表示就绪1等待
privateintsort;
//优先级,越大优先级越高,随机产生(1-5)
privateinttime;
//执行时间
privateRandomrd=newRandom();
//产生随机数
5、算法流程图
6、运行与测试
1、执行最短时间调度算法
分析一:
初始状态如红框,随机生成10个进程,6个进程处于就绪状态,4个处于等待状态;
分析二:
进程e时间最短,从就绪态变为执行态,执行完毕。
2、执行优先数调度算法
分析:
如红框所示,就绪队列里进程c优先数最高,反映出优先权最大(系统预设数值越大权力越大),转为执行态
3、执行先来先服务算法
如红框所示,第一个进程是进程b,转为执行态,执行成功。
4、所有进程执行完毕状态如图
7、总结
第一次实验由于教材有类似的程序源码,所以相对来说还是比较简单,我只需要更改其中一部分算法就可以实现。
我只是稍微修改了下进程时间的长短比较。
但是我在实现过程中还是学到不少东西,重新温习了一遍JAVA语言,完成一个功能模拟首先必须理解其中的算法,然后设计出良好的数据结构是完成这次实验的关键。
实验二作业调度
一、实验目的
用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
二、实验内容
1.写并调试一个单道处理系统的作业等待模拟程序。
2.作业等待算法:
分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。
3.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
4.每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:
作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W。
5.对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。
3、实现思路
1.实验原理:
先来先服务算法:
是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。
。
高响应比优先调度算法:
根据作业要求服务时间和等待时间算出优先权,每次挑选优先权最高的作业先进入主存执行。
2.设计方案:
由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
4、主要的数据变量定义
Stringprocess_num=null;
//进程数
Stringarrive_time=null;
//到达时间
Stringservice_time=null;
//服务时间
Stringstate;
//状态
Stringstart_time=null,end_time=null,total_time=null,
weightotal_time=null;
//各种进程开始结束带权周转时间
Stringa[][]=newString[N][8];
String[]name={"
作业号"
"
提交时间"
ΔT运行"
"
T开始"
T结束"
T周转"
T带权周转"
状态"
};
1.使用先来先服务算法
2.相同数据下,使用高响应比调度算法
有了第一次实验的基础,做第二个实验就感觉轻松多了,整体设计过程还是可以借鉴第一次的方法,关键就是几个作业调度算法的实现,只要熟读书本注意处理好细节的问题实现不会有太大困难,通过再一次的整体设计使我对各种作业调度算法有更深刻的理解,这两种方法各自的优点和缺点如下:
FCFS
HRN
优点
算法简单,可用于进程调度也可用于作业调度
照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务
缺点
有利于长作业(进程),不利于短作业(进程)
必须先做响应比的计算,增加系统开销
选择合适的调度算法,要依据
(1)系统设计目标;
(2)均衡地处理系统和用户的要求;
(3)系统资源利用率;
(4)优先级等。
同时,也增强了自己的实验能力和对计算机操作系统的调度有了较为全面的了解。
希望在后续的实验中能有更多的收获!
实验三动态分区分配方式的模拟
了解动态分区分配方式中的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解
分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。
其中,空闲分区通过空闲分区链(表)来管理;
在进行内存分配时,系统优先使用空闲区低端的空间。
1.实验原理
采用可变分区存储管理,选用首次适应算法实现主存分配和回收。
FIFO(首次适应算法):
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。
为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。
该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
BF(最佳适应算法):
所谓“最佳”是指,每次为作业分配内存时,总是把能满足要求,又是最小的空闲分区分配给作业,避免“大材小用”。
为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
这样,第一次找到的能满足要求的空闲区必然是最佳的。
孤立地看,最佳适应算法似乎是最佳的,然后在宏观上却不一定。
因为每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。
2.设计方案
①主存空间分配过程
当有进程要求分配XKB主存时,按照进程的需要量XKB,从链头开始找到第一个空闲区;
A、若空闲区小于XKB,则沿链找下一个空闲区;
B、若空闲区等于XKB,则该空闲区全部分给作业,并将空闲区从链中摘除,即修改下一个空闲区的的向后指针为该空闲区的后向指针。
修改上一个空闲区的前向指针为该空闲区的前向指针;
C、若空闲区大于XKB,则空闲区大小=空闲区大小-XKB,修改下一个空闲区的向后指针(后向指针+XKB)。
修改上一个空闲区的前向指针为(前向指针+XKB);
D、登记已分配区表,输出系统中各数据结构的值,返回分配给作业的主存始址。
②主空空间回收过程:
当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
例如,在上述中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。
回收作业占用的内存总共有四种情况,其中三种情况如下,:
还有一种是与空闲区F1,F2都不相邻的.
A、查到有与释放区地址邻接的空闲区,如果是下相邻,则在空闲区链中找到正确的插入位置:
把下邻空闲区的前向指针内容送缓冲区的前向指针,修改下邻空闲区的前向指针指向释放区始址,把上邻空闲区的后向指针内容送释放区的后向指针,修改上邻空闲区的后向指针指向释放区始址。
B、如果是上相邻,则在空闲区链中找到正确的插入位置:
把上邻空闲区的前向指针内容送缓冲区的前向指针,修改上邻空闲区的前向指针指向释放区始址,把下邻空闲区的后向指针内容送释放区的后向指针,修改下邻空闲区的后向指针指向释放区始址。
C、查到有与释放区地址邻接的空闲区,如果是下相邻,则在空闲区链中找到正确的插入位置:
D、如果是上相邻,则在空闲区链中找到正确的插入位置:
四、算法流程图
1、主界面
2、生成随机空闲分区
3、生成任务请求队列
4、选择首次适应算法,点击开始分配按钮,剩余空间为内存分配之后的剩余空间,分配作业为作业号的id,一个空闲分区可以分配给多个作业号,分配情况如图:
5、最适应算法,剩余空间按小到大排序,点击分配结果如图,作业分配成功,显示YES,否则显示No,(最坏适应算法类同)
通过这次实验,我对内存分配有了直观的认识,比如说,首次适应算法它倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区,而最佳适应算法则每次都把空间最合适的分给作业,但留下很多细小分区,难以利用。