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

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

相关文章
|
1月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
88 1
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
16天前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
1月前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
1月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
1月前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
1月前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
2月前
|
算法 Linux 调度
深入浅出操作系统的进程管理
本文通过浅显易懂的语言,向读者介绍了操作系统中一个核心概念——进程管理。我们将从进程的定义出发,逐步深入到进程的创建、调度、同步以及终止等关键环节,并穿插代码示例来直观展示进程管理的实现。文章旨在帮助初学者构建起对操作系统进程管理机制的初步认识,同时为有一定基础的读者提供温故知新的契机。
|
1月前
|
消息中间件 算法 调度
深入理解操作系统之进程管理
本文旨在通过深入浅出的方式,带领读者探索操作系统中的核心概念——进程管理。我们将从进程的定义和重要性出发,逐步解析进程状态、进程调度、以及进程同步与通信等关键知识点。文章将结合具体代码示例,帮助读者构建起对进程管理机制的全面认识,并在实践中加深理解。

热门文章

最新文章