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

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

相关文章
|
16天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
9天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
13天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
34 3
|
15天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
16天前
|
算法 调度 UED
深入理解操作系统的进程调度机制
本文旨在探讨操作系统中至关重要的组成部分之一——进程调度机制。通过详细解析进程调度的概念、目的、类型以及实现方式,本文为读者提供了一个全面了解操作系统如何高效管理进程资源的视角。此外,文章还简要介绍了几种常见的进程调度算法,并分析了它们的优缺点,旨在帮助读者更好地理解操作系统内部的复杂性及其对系统性能的影响。
|
17天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
35 2
|
17天前
|
消息中间件 算法 Linux
深入理解操作系统之进程管理
【10月更文挑战第30天】在数字时代的浪潮中,操作系统作为计算机系统的核心,扮演着至关重要的角色。本文将深入浅出地探讨操作系统中的进程管理机制,从进程的概念入手,逐步解析进程的创建、调度、同步与通信等关键过程,并通过实际代码示例,揭示这些理论在Linux系统中的应用。文章旨在为读者提供一扇窥探操作系统深层工作机制的窗口,同时激发对计算科学深层次理解的兴趣和思考。
|
14天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理的艺术
【10月更文挑战第33天】本文旨在揭示操作系统中进程管理的神秘面纱,带领读者从理论到实践,探索进程调度、同步以及通信的精妙之处。通过深入浅出的解释和直观的代码示例,我们将一起踏上这场技术之旅,解锁进程管理的秘密。
21 0
|
16天前
|
算法 Linux 调度
深入理解操作系统之进程调度
【10月更文挑战第31天】在操作系统的心脏跳动中,进程调度扮演着关键角色。本文将深入浅出地探讨进程调度的机制和策略,通过比喻和实例让读者轻松理解这一复杂主题。我们将一起探索不同类型的调度算法,并了解它们如何影响系统性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇理解操作系统深层工作机制的大门。
25 0
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能

热门文章

最新文章

下一篇
无影云桌面