操作系统实验 - 题目二 进程调度算法的实现

2023-11-12

2.1 题目的主要研究内容及预期达到的目标

【设计目的】
理解进程调度相关理论;掌握时间片调度原理;掌握高优先级调度原理
【课题描述】
本课题主要针对操作系统中进程调度相关理论进行设计。要求编写程序并进行测试,该程序可以对多个进程进行调度,调度算法采用基于时间片的高优先级调度。
【课题内容】
(1)设计进程控制块;
(2)设计多个进程队列;
(3)设计多个进程(≥20);
(4)动态生成时间片、执行时间和优先级,将这些信息输出至文件中;
(5)设计基于时间片的多优先级调度算法;
(6)动态调度,并把所有调度信息输出至文件中。

2.2 题目研究的工作基础或实验条件

(1)硬件环境:windows 10
(2)软件环境:vmware

2.3 设计思想

1、 (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名、指针、要求运行时间、优先数、状态
(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。
(4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:
优先数-1
要求运行时间-1
来模拟进程的一次运行。
提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。
(5) 进程运行一次后,若要求运行时间¹0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。
(6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。
(8) 为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。

2.4 流程图

在这里插入图片描述

图2-1 基于时间片的优先级调度流程图

2.5主要程序代码

#define _CRT_SECURE_NO_WARNINGS 1
///模拟处理器调度
#include<iostream>
#include<string>
using namespace std;
 
enum State
{
	R,//正在运行
	E,//运行结束
};
//该程序使用C++实现,将进程控制块PCB作为私有成员
class PCB
{
public:
	//构造函数初始化成员
	PCB()
		:processName("N")
		, nextPtr(NULL)
		, runTime(rand()%7)
		, priority(rand()%7)
		, state(R)
	{}
	void Display()
	{
		cout << processName << "\t " << runTime << "\t\t " << priority;
		if (state == E)
		{
			cout << "\tE " << endl;
		}
		else
		{
			cout << "\tR " << endl;
		}
	}
	friend class queuePCB;//将队列设为PCB友元,为了使用PCB的成员
private:
	string processName;//进程名
	PCB* nextPtr;		   //指针指向队列中的下一个进程
	int runTime; //运行时间
	int priority;      //优先级
	State state;         //状态
};
 
//再定义一个队列存有PCB,
class queuePCB
{
public:
	queuePCB()
		:head(NULL)
		, p(NULL)
	{}
	PCB* Insert(PCB& pb)
	{
		//如果进程的名字没有初始化,直接输入
		if (pb.processName == "N")
		{
			cout << "请输入进程名:";
			string name;
			cin >> name;
			pb.processName = name;
		}
		p = head;
		//如果指针不为空,说明已指向队列
		if (head != NULL)
		{
			//如果队首指针的下一个指针为空,说明当前只有一个队列
			if (head->nextPtr == NULL)
			{
				//判断当前优先级是否低于下一个进程的优先级,如果低于则交换
				if (pb.priority > head->priority)
				{
					pb.nextPtr = head;
					head->nextPtr = NULL;
					head = &pb;
					Show();
					return p;
				}
				else
				{
					head->nextPtr = &pb;
					pb.nextPtr = NULL;
					Show();
					return p;
				}
			}
			//下一个指针不为空,则比较优先级
			else
			{
				if (pb.priority > head->priority)
				{
					pb.nextPtr = p;
					head = &pb;
					Show();
					return p;
				}
				while (p->nextPtr != NULL)
				{
					if (pb.priority > (p->nextPtr->priority))
					{
						pb.nextPtr = p->nextPtr;
						p->nextPtr = &pb;
						Show();
						return p;
					}
					p = p->nextPtr;
				}
				p->nextPtr = &pb;
				pb.nextPtr = NULL;
				Show();
				return p;
			}
		}
		//如果head==NULL,则当前没有队列,pb为第一个进程队列
		else
		{
			head = &pb;
			head->nextPtr = NULL;
			Show();
		}
		return p;
	}
	//进程运行
	void Run(PCB* pb)
	{
		cout << "运行进程为" << endl;
		pb->Display();
		cout << endl;
		pb->priority--; //运行一次优先级-1
		pb->runTime--;  //运行一次时间-1
		//如果时间片完成则把状态置为E
		if (pb->runTime == 0)
		{
			pb->state = E;
		}
 
	}
	//调度进程
	void Dispatch()
	{
		while (head != NULL)
		{
			Run(head);
			//如果状态为E,则移出进程队列
			if (head->state == E)
			{
				head = head->nextPtr;
				Show();
			}
			else
			{
				p = head;
				head = head->nextPtr;
				Insert(*p);
			}
		}
	}
 
	//展示进程的信息
	void Show()
	{
		PCB* tmp;
		tmp = head;
		if (tmp != NULL)
		{
			cout << "进程名" << '\t' << "所需运行时间" << '\t' << "优先级 " << '\t' << "状态" << endl;
		}
		while (tmp != NULL)
		{
			tmp->Display();
			tmp = tmp->nextPtr;
		}
	}
 
private:
	PCB* head;//指向队首的指针
	PCB* p;
};
 
int main()
{
	queuePCB qPCB;
	PCB arr[5];
	for (size_t i = 0; i < 8 i++)
	{
		qPCB.Insert(arr[i]);
	}
	cout << "进程已就绪" << endl;
	qPCB.Dispatch();
	cout << "进程运行已结束" << endl;
 
	system("pause");
	return 0;
}

2. 6 运行结果及分析

在这里插入图片描述

图2-2 结果图(一)
在这里插入图片描述

图2-3 结果图(二)
在这里插入图片描述

图2-4 结果图(三)

在这里插入图片描述

图2-5 结果图(四)

图2-6 结果图(五)

2.7 心得体会

通过此次实验,加深学习了基于时间片的优先级调度算法,并比较了时间片算法和优先级算法的不同,更加了解了操作系统原理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统实验 - 题目二 进程调度算法的实现 的相关文章

随机推荐

  • TCP中的Nagle算法

    一 Nagel算法 TCP IP协议中 无论发送多少数据 总是要在数据前面加上协议头 同时 对方接受到数据 也需要发送ack表示确认 为了尽可能利用网络带宽 TCP总是希望尽可能发送足够大的数据 在一个连接中会设置MSS参数 因此 TCP
  • Google Cloud Spanner和Cloud Bigtable最新更新

    Google云平台提供了各种云原生数据库服务 最近 Google更新了其中的两项服务 这些更新会影响Cloud Spanner数据库服务 一种的托管关系数据库产品 和Cloud Bigtable 一种托管的NoSQL键值和宽列数据库 几家领
  • P1020 [NOIP1999 普及组] 导弹拦截

    题目 题目链接 题解 看了网上好多讲解的博客 都好屑啊 就当已知第一问求解最长不上升子序列长度 第二问求解最长上升子序列长度 如果想知道证明 可以自行百度Dilworth定理 或者参考这个博客 未优化 O n2 未优化的比较基础 第一问 状
  • 工厂函数和构造函数的区别

    工厂函数和构造函数的区别 下面是给出的两个都是实现 定义使用值的范围 的函数 第一个工厂函数 工厂模式 用以创建并初始化类的实例 而且给出了一个表示 值的范围 的类定义了原型对象 第二个是使用构造函数代替工厂函数来实现相同功能的代码段 下面
  • Qt浏览器开发:关于CEF开发知识点以及QCef开发原理与使用

    开发环境 VS2015 Qt5 9 关于CEF CEF全称是Chromium Embedded Framework 它是Chromium的Content API的封装库 基于Google Chromium 的开源项目 而Google Chr
  • Ethercat--学习笔记

    一 数据传输方式 PDO SDO 主站与从站进行数据交互的方式主要通过PDO和SDO 即过程数据和邮箱数据其概念与CANOpen中的概念相同 一 PDO 过程数据对象 过程数据用来传输周期性的数据 PDO由三个数据缓冲区组成 类似于一个FI
  • 【Opencv】一文搞懂PIL、cv2、pyplot.imshow()显示图片颜色/色彩偏差问题

    原始图片 这里用眼底血管分割数据集的图片作为例子 导入图片方法及通道区别 PIL from PIL import Image from matplotlib import pyplot as plt PIL输入通道为RGB img Imag
  • SpringBoot集成PageHelper 实现分页功能。

    简介 今天毕设有用到PageHelper 看了几篇博客 写的不是很一目了然 自己总记一下 希望能帮助到别人 大佬看见该批评就批评该指点就指点 谢谢 开始 引入
  • js预解析最强面试题 看看你会不会

    话不多说 直接上题目 f1 console log c console log b console log a function f1 var a b c 9 console log a console log b console log
  • XCode 命令行打包命令

    1 列出项目信息 xcodebuild list project
  • 第二十一课,几何着色器(使用篇-爆破效果)

    爆破效果 原理 将每一个片元沿三角形法向量方向移动一段距离 核心代码 避坑点 vert version 450 core layout location 0 in vec3 aPos layout location 1 in vec3 aN
  • 0501——0505 Vue学习

    总结一下草稿箱的网课记录 说4小时我还是看了不止4天 Vue Vue程序 导入开放版本的Vue js 创建Vue实例对象 设置el属性和data属性 使用简洁的模板语法把数据渲染到页面上 el挂载点 el是用来设置vue实例挂载 管理 的元
  • dubbo validation 参数验证 参数校验 @NotNull 自定义响应

    使用dubbo 框架 使用 validation 进行参数校验 首先创建类 import com fasterxml jackson annotation JsonProperty import lombok Getter import l
  • 你开发的软件不知道哪里跑飞闪退了?这个办法可以帮忙定位(查看dump)

    QT生成dump pdb文件 使用windbg打开分析查看堆栈 定位程序崩溃位置 你开发的软件不知道哪里跑飞闪退了 这个办法可以帮忙定位 https zhuanlan zhihu com p 102103083
  • 5.three.js灯光与阴影

    代码来源于哔哩哔哩老陈three js教学 1 灯光与阴影的关系与设置 import as THREE from three 导入轨道控制器 import OrbitControls from three examples jsm cont
  • chrome谷歌浏览器导入密码和导出密码的方法

    chrome谷歌浏览器导入密码和导出密码的方法 导出账号密码 导入账号密码 有时候大家遇到换了新电脑 或者公司需要调整电脑 或者说需要导入别人电脑上谷歌浏览器存的账号密码 发现可以导出密码 但是没有导入密码的选项 就很烦 这里教大家如何导出
  • 如何在数据验证单元格区域禁用粘贴

    为了确保数据准确性 在A列设置了数据验证 可以输入值的列表如下图所示 但是如果用户使用复制 粘贴 仍然可以输入其他值 如下图所示 使用如下事件可以实现禁止粘贴 Private Sub Worksheet Change ByVal Targe
  • TCP连接的三次握手四次挥手——类比异地恋情侣开始交往和分手(通俗易懂)

    首先 要详细解释的 先看下面两篇文章 这篇文章只是一个类比 可以辅助理解和记忆 计算机网络 TCP三次握手详解为什么两次不行 计算机网络 TCP四次挥手过程详解 三次握手 开始交往 男 写一封情书 我喜欢你 我们可以在一起吗 即使我们分隔两
  • python(11):python读取excel、csv文件

    1 python读取excel文件 要读取Excel表格的指定行和列范围 可以使用Python中的第三方库pandas pandas库提供了强大的数据分析和处理工具 包括读取和处理Excel文件的功能 以下是一个示例代码 演示了如何使用pa
  • 操作系统实验 - 题目二 进程调度算法的实现

    2 1 题目的主要研究内容及预期达到的目标 设计目的 理解进程调度相关理论 掌握时间片调度原理 掌握高优先级调度原理 课题描述 本课题主要针对操作系统中进程调度相关理论进行设计 要求编写程序并进行测试 该程序可以对多个进程进行调度 调度算法