- 实验目的
- 通过对处理机调度、基本存储管理、作业进程控制算法的模拟,进一步加深对进程概念、作业概念的理解。深入了解批处理系统如何组织作业、管理作业和调度作业。
- 实验内容
- 主要涵盖三大方面:1. 处理机调度,2. 基本存储管理, 3. 作业进程控制。
处理机调度:
处理机调度包括作业调度和进程调度两个部。作业调度采用高响应比优先调度算法,进程调度采用抢占式优先级调度算法。
基本存储管理:
基本存储管理采用分页式管理方式。使用位示图来记录内存使用情况,使用表来管理的分配情况。
作业进程控制:
- 包括作业控制和进程控制两部分。作业控制指1.作业调入内存,2. 作业撤离内存。进程控制指1.进程创建,2.进程销毁,3.进程阻塞,4.进程唤醒。
- 为了真实模拟计算机的运作,我们的进程是可以正是运行的。运行方式是根据我们自定义的指令集来运作。当然,我们也做了申请资源模拟,银行家算法自然不能缺少。
- 实验环境
- 表1 软件环境及配置说明
- 系统分析与设计
- 数据结构
- JCB,PCB的链接组织方式
- JCB有2条队列:后备队列和运行队列。
- PCB有4条队列:空闲队列、就绪队列、运行队列、阻塞队列。
- 队列是单链表队列。
- 对JCB来说,2条队列是独立的,每个节点都是动态分配的。对PCB来说,所有节点都是系统已经分配好的,用一个数组来存储这些节点。
- 页表
- 页表是一个顺序表,大小为内存块数量,每个进程都拥有一项页表。顺序表的下标代表作业的页号,内容代表该页号对应的内存块号。
- 位视图
- 位视图是一个顺序表,大小为内存块数量/8,一位代表一个内存块。字节号i位号j代表编号为i*8+j的内存块。
- 银行家算法相关数据结构
- 算法设计
- 作业高响应比调度
最高响应比优先是介于FCFS和SJF的一种综合平衡,每当要进行作业调度时,系统循环遍历一遍后备队列,对每一个内存可以容纳的作业计算此刻的响应比,找出响应比最大的作业,然后将该作业调入内存。
进程优先级调度
就绪队列按优先级排序,头进行即是要调度的进程。
作业调入内存
- 作业指的是程序文件。作业分页,内存分块。
- 先到位视图找到并占有空闲的内存块
- 把占据的内存块写到对应的页表中
- 把作业的一页重定位到内存中并写入
- 作业撤离内存
只需要把该作业占据的位视图置0
进程创建
- 创建进程就是创建JCB控制块。
- 判断系统有无空闲PCB
- 从空闲PCB队列取出一个PCB,并给其成员赋值
- 计算进程需要的最大资源需求量
- 把进程插到就绪队列等待运行
- 进程销毁
功能:销毁一个进程,回收它所占据的所有资源。并调度作业和唤醒进程
流程:
- 销毁作业,释放内存。触发作业调度,从后备队列调度作业
- 释放占据的资源。触发进程唤醒,从阻塞队列唤醒进程
- 把进程插到空闲PCB队列
- 进程阻塞
功能:把进程阻塞起来,插到阻塞队列
流程:
根据优先级把进程插到阻塞队列合适的位置
进程唤醒
功能:唤醒阻塞的进程,并把它们插到就绪队列等待运行
流程:
- 对每一个阻塞的进程执行下列步骤
- 假如唤醒该进程,用银行家算法检测系统安全状态。
- 如果检测通过,则唤醒该进程并分配资源然后插到就绪队列
- 如果没通过,则继续阻塞,判断下一个阻塞进程
- 银行家、安全检测算法
- 首先设Request是进程Pi的请求向量。Request [ j ]=m,表示Pi这次需要m个RJ资源。然后执行
- 如果Requesti>Needi,进程PI的本次请求超过了它宣布的最大值,系统则拒绝分配,return false。
- 如果Requesti > Available,表明系统当前可用资源不能满足pi的资源请求,应推迟分配,将Pi阻塞等待。
- 如果(1)(2)执行通过,则表明该进程可以进入下一步,尝试性的分配资源。
- Available = Available – Request;
- Allocation = Allocation+ Request;
- Need = Need - Request ;
调用安全性算法security(),测试系统是否安全。如果返回值为1,表示系统是安全的,则就此完成分配,返回成功信息;否则表示系统不安全,将第3步的分配方案作废,让进程i等待。其中引入一个工作向量Free,存放不断变化的可用资源。还引入了标志向量Finish,当Finish[ i ] =true,表示进程Pi已通过安全检测,否则表示未通过。
进程模拟运行s
技术难点
进程唤醒:
当进程释放资源是,系统执行唤醒进程操作。系统保留着每一个阻塞的资源申请了,假设把阻塞进程插到就绪队列,然后进行银行家算法进程安全检测,若检测通过,就地分配资源,若没有插回到就绪队列。
系统运行演示
系统初始化
创建系统作业
就绪队列存在作业,开始进程调度
取指令进行运行
运行创建作业的指令
若内存充足,则将作业调入内存创建进程并放入就绪队列
…(省略相似操作)
时间片到时切换进程
从就绪队列中取优先级最高的进程继续运行
…(省略相似操作)
进程运行完毕,销毁进程,释放内存
内存回收后触发高级调度
…(省略相似操作)
当进程请求资源,调用银行家算法进行检测
…(省略相似操作)
当资源分配失败时,进程进入阻塞队列
…(省略相似操作)
若阻塞队列不为空,则内存回收后再次尝试对阻塞队列里的进程进行资源试分配
…(省略相似操作)
当所有作业运行完毕,释放系统资源
实验总结
在这次实验里,我们制作了一个综合性的操作系统,令我们对操作系统的大致原理与思路有了更深的理解,操作系统各个部分之间是如何协调运作的,是如何调度硬件完成工作的,作业在操作系统中要经过多少流程才能够最终运行完毕,其在各个阶段的状态与运行情况等。在实现中我们尽量规范工整地进行代码的设计,各种变量名,函数名,缩进等编码习惯都有统一的规范,在程序的结构上尽量靠近真实的情况去模拟,操作系统有自定义的指令集,作业中有对应的指令,内存使用一维数组来模拟,创建进程时将作业调入数组,运行时从数组中读取等。在设计与实现过程中提高了我们的团队协作能力,让我们懂得了如何去合理地进行任务的分配,分工合作来完成这个系统。
系统中也存在不足的地方,通过老师的讲解我们知道了不应该限制JCB的个数,让我们了解到了自己的错误,使我们更正了设计时的错误,对操作系统的理解有了新的认识。
光靠书本上的知识并不足以让我们去掌握操作系统这门课程,只有通过结合实际的实验,自己去实现其中的细节,才能够深刻地了解到其中的流程,特别是综合性的实验,各个环节之间的关系以及执行顺序都是需要深思熟虑的。这次实验,使我们受益匪浅,让我们对计算机的理解更进一步,了解了程序是如何在计算机中运行的,提高了我们的编程思维和能力,获益良多!
完整的代码+实验报告: