基于操作系统实现进程队列学习

  • 实验目的

  • 通过对处理机调度、基本存储管理、作业进程控制算法的模拟,进一步加深对进程概念、作业概念的理解。深入了解批处理系统如何组织作业、管理作业和调度作业。

  • 实验内容

  • 主要涵盖三大方面:1. 处理机调度,2. 基本存储管理, 3. 作业进程控制。

处理机调度:

处理机调度包括作业调度和进程调度两个部。作业调度采用高响应比优先调度算法,进程调度采用抢占式优先级调度算法。

基本存储管理:

基本存储管理采用分页式管理方式。使用位示图来记录内存使用情况,使用表来管理的分配情况。

作业进程控制:

  • 包括作业控制和进程控制两部分。作业控制指1.作业调入内存,2. 作业撤离内存。进程控制指1.进程创建,2.进程销毁,3.进程阻塞,4.进程唤醒。

  • 为了真实模拟计算机的运作,我们的进程是可以正是运行的。运行方式是根据我们自定义的指令集来运作。当然,我们也做了申请资源模拟,银行家算法自然不能缺少。

  • 实验环境

  • 表1 软件环境及配置说明

操作系统

Windows 7/10

编程语言及工具

C, DevC++

配置文件

备注

  • 系统分析与设计

  • 数据结构

  • 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的个数,让我们了解到了自己的错误,使我们更正了设计时的错误,对操作系统的理解有了新的认识。

光靠书本上的知识并不足以让我们去掌握操作系统这门课程,只有通过结合实际的实验,自己去实现其中的细节,才能够深刻地了解到其中的流程,特别是综合性的实验,各个环节之间的关系以及执行顺序都是需要深思熟虑的。这次实验,使我们受益匪浅,让我们对计算机的理解更进一步,了解了程序是如何在计算机中运行的,提高了我们的编程思维和能力,获益良多!

完整的代码+实验报告:

https://download.csdn.net/download/pythonyanyan/87390260

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员奇奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值