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

简介: 基于操作系统实现进程队列学习
  • 实验目的
  • 通过对处理机调度、基本存储管理、作业进程控制算法的模拟,进一步加深对进程概念、作业概念的理解。深入了解批处理系统如何组织作业、管理作业和调度作业。
  • 实验内容
  • 主要涵盖三大方面:1. 处理机调度,2. 基本存储管理, 3. 作业进程控制。


处理机调度:

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

基本存储管理:

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

作业进程控制:


  • 包括作业控制和进程控制两部分。作业控制指1.作业调入内存,2. 作业撤离内存。进程控制指1.进程创建,2.进程销毁,3.进程阻塞,4.进程唤醒。
  • 为了真实模拟计算机的运作,我们的进程是可以正是运行的。运行方式是根据我们自定义的指令集来运作。当然,我们也做了申请资源模拟,银行家算法自然不能缺少。
  • 实验环境
  • 表1 软件环境及配置说明



image.png


  • 系统分析与设计
  • 数据结构
  • JCB,PCB的链接组织方式
  • JCB有2条队列:后备队列和运行队列。
  • PCB有4条队列:空闲队列、就绪队列、运行队列、阻塞队列。
  • 队列是单链表队列。
  • 对JCB来说,2条队列是独立的,每个节点都是动态分配的。对PCB来说,所有节点都是系统已经分配好的,用一个数组来存储这些节点。
  • 页表
  • 页表是一个顺序表,大小为内存块数量,每个进程都拥有一项页表。顺序表的下标代表作业的页号,内容代表该页号对应的内存块号。
  • 位视图
  • 位视图是一个顺序表,大小为内存块数量/8,一位代表一个内存块。字节号i位号j代表编号为i*8+j的内存块。
  • 银行家算法相关数据结构
  • 算法设计
  • 作业高响应比调度



fcb544f74549ee4431d57f82cd53df5e.png


最高响应比优先是介于FCFS和SJF的一种综合平衡,每当要进行作业调度时,系统循环遍历一遍后备队列,对每一个内存可以容纳的作业计算此刻的响应比,找出响应比最大的作业,然后将该作业调入内存。

进程优先级调度

35818b42c3ba2c84f8d610c8f89e4f83.png


就绪队列按优先级排序,头进行即是要调度的进程。

作业调入内存



0e7538783a2c45aaadc665dfadd20fd1.png



  • 作业指的是程序文件。作业分页,内存分块。
  • 先到位视图找到并占有空闲的内存块
  • 把占据的内存块写到对应的页表中
  • 把作业的一页重定位到内存中并写入
  • 作业撤离内存

9499280eb842fc7fd06fe74a50310e92.png


只需要把该作业占据的位视图置0

进程创建


e9f8bebd00dfd267c8eb73bcec184a1a.png


  • 创建进程就是创建JCB控制块。
  • 判断系统有无空闲PCB
  • 从空闲PCB队列取出一个PCB,并给其成员赋值
  • 计算进程需要的最大资源需求量
  • 把进程插到就绪队列等待运行
  • 进程销毁



5a46490e0ed5d3e39a7ac993abc5475f.png


功能:销毁一个进程,回收它所占据的所有资源。并调度作业和唤醒进程

流程:

  • 销毁作业,释放内存。触发作业调度,从后备队列调度作业
  • 释放占据的资源。触发进程唤醒,从阻塞队列唤醒进程
  • 把进程插到空闲PCB队列
  • 进程阻塞


157d43eee863228d07d250935f09644a.png



功能:把进程阻塞起来,插到阻塞队列

流程:

根据优先级把进程插到阻塞队列合适的位置

进程唤醒


cf5c4b681b3ce85821ed5b10b52ee282.png

功能:唤醒阻塞的进程,并把它们插到就绪队列等待运行

流程:


  • 对每一个阻塞的进程执行下列步骤
  • 假如唤醒该进程,用银行家算法检测系统安全状态。
  • 如果检测通过,则唤醒该进程并分配资源然后插到就绪队列
  • 如果没通过,则继续阻塞,判断下一个阻塞进程
  • 银行家、安全检测算法
  • 首先设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


8b44c53980b72fa00df9ccddf877a22d.png


技术难点

进程唤醒:

当进程释放资源是,系统执行唤醒进程操作。系统保留着每一个阻塞的资源申请了,假设把阻塞进程插到就绪队列,然后进行银行家算法进程安全检测,若检测通过,就地分配资源,若没有插回到就绪队列。

系统运行演示

系统初始化

168c7ffadc2c165a845d7a4c33297340.png

创建系统作业


a241a2de6689ffc34a8083bf05391ba0.png

就绪队列存在作业,开始进程调度


c5004d049ce412fc37f55a5f5601dcb4.png


取指令进行运行


0a65c2c77809a5ee5f0a261c7955e88d.png


运行创建作业的指令


8a7995c69859819c99329ad850592f24.png


若内存充足,则将作业调入内存创建进程并放入就绪队列


e9e52ae113a5fe90cd3ba8bf485441c8.png

…(省略相似操作)

时间片到时切换进程

c63dc27edd386364ad782bc195b14833.png

从就绪队列中取优先级最高的进程继续运行


fa5ac7379edad5e8b225382d6301ed69.png


…(省略相似操作)

进程运行完毕,销毁进程,释放内存


837e6d7fe4fdc96e44b97cea04a06bfe.png

内存回收后触发高级调度

06213b438ab11f32671794d328b6c38b.png


…(省略相似操作)


当进程请求资源,调用银行家算法进行检测

7250d6ed7309acdca163693ed4587d4d.png


…(省略相似操作)


当资源分配失败时,进程进入阻塞队列

da6fa138742d29979ddd134ae7b4f83e.png


…(省略相似操作)


若阻塞队列不为空,则内存回收后再次尝试对阻塞队列里的进程进行资源试分配

ee0c8e842dd5ac81a53f34ae54fc3ec2.png


…(省略相似操作)


当所有作业运行完毕,释放系统资源

b025ca196497065404526a8eb5c14040.png


实验总结


在这次实验里,我们制作了一个综合性的操作系统,令我们对操作系统的大致原理与思路有了更深的理解,操作系统各个部分之间是如何协调运作的,是如何调度硬件完成工作的,作业在操作系统中要经过多少流程才能够最终运行完毕,其在各个阶段的状态与运行情况等。在实现中我们尽量规范工整地进行代码的设计,各种变量名,函数名,缩进等编码习惯都有统一的规范,在程序的结构上尽量靠近真实的情况去模拟,操作系统有自定义的指令集,作业中有对应的指令,内存使用一维数组来模拟,创建进程时将作业调入数组,运行时从数组中读取等。在设计与实现过程中提高了我们的团队协作能力,让我们懂得了如何去合理地进行任务的分配,分工合作来完成这个系统。


系统中也存在不足的地方,通过老师的讲解我们知道了不应该限制JCB的个数,让我们了解到了自己的错误,使我们更正了设计时的错误,对操作系统的理解有了新的认识。


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


完整的代码+实验报告:


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

相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
504 32
|
缓存 运维 前端开发
阿里云操作系统控制台:高效解决性能瓶颈与抖动之进程热点追踪
遇到“进程性能瓶颈导致业务异常”等多项业务痛点时,提供高效解决方案,并展示案例。
|
11月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
326 0
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
3061 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
224 4
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
208 2

推荐镜像

更多