进程控制与进程调度 —— 时间片轮转调度算法(C++版)

news2024/11/26 2:23:51

目录

实验一  进程控制与进程调度

一、实验目的

二、实验内容 

三、数据结构及符号说明 

四、运行环境说明

五、代码段 

六、 效果展示


实验一  进程控制与进程调度

备注:大二(下)操作系统实验一 

一、实验目的

掌握进程状态的转变、进程调度的策略

理解进程控制的过程,进一步体会多道程序并发执行的特点

二、实验内容 

利用简单的结构和控制方法模拟进程结构、进程状态和进程控制,进程调度采用时间片轮转调度算法

1、用PCB表示进程实体,利用随机数方法或键盘控制方法模拟进程执行中产生的事件,或者基于图形界面控制进程

2、定义PCB包括基本内容,如内部ID、外部ID、进程状态、队列指针

由于很难实现真正的进程创建功能,在实验中只需建立PCB节点,并用它代表一个完整的进程

每创建一个进程时,可动态分配PCB节点,对相应内容赋值,并链接到对应队列

可参考如下数据结构(C语言实现):

struct PCB

{

      int inid;                 //内部ID  自动生成

      char outid[10];     //外部ID

      int  state ;             //进程状态  0表示执行状态  1表示就绪状态  2表示阻塞状态

      struct PCB*next;

};

struct PCB *ready,*blocked,*running;

3、定义进程状态转换方式

真实的进程状态转换是由进程内部操作或操作系统的控制引起

由于模拟程序中无法实现这些功能,实验可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序

随机方法指产生1-5的随机数,分别代表(1)创建进程、(2)时间片到、(3)进程阻塞、(4)唤醒进程、(5)结束进程等事件;

键盘模拟方法指定义5个选项菜单代表以上5种事件

4、根据随机数或键盘操作处理就绪队列、阻塞队列和当前执行进程的状态

每次事件处理后应显示出当前系统中的执行进程是哪一个,就绪队列和阻塞队列分别包含哪些进程

5、编程语言不限,可以选择用C语言、Python或java

三、数据结构及符号说明 

数据结构:
使用结构体PCB来表示一个进程

使用链表实现就绪队列和阻塞队列,指针为 PCB * next
符号说明:
就绪队列头指针 ready_head

就绪队列尾指针 ready_tail
阻塞队列头指针 blocked_head
阻塞队列尾指针 blocked_tail
当前运行程序指针 running
 

四、运行环境说明

五、代码段 

#include<iostream>
#include<unordered_set>
using namespace std;

int inID;
unordered_set<string> S;

struct PCB
{
	int in_id;     // 内部id 
	string out_id; // 外部id 
	int state;     // 进程状态  0表示执行状态,1表示就绪状态,2表示阻塞状态
	PCB * next;    // next指针 
};

PCB * ready_head, * ready_tail, * blocked_head, * blocked_tail, * running;

PCB * PCB_creat() // 创建PCB 
{
	PCB * p = new PCB;
	cout << "进程创建成功!" << endl;
	return p;
}

void PCB_init(PCB * p) // 初始化PCB 
{
	string id;
	p -> in_id = inID ++ ;
	cout << "请输入进程外部ID:" << endl;
	cin >> id;
	while(S.count(id))
	{
		cout << "您输入的外部ID已被使用,请重新输入!" << endl;
		cin >> id;
	}
	S.insert(id);
	p -> out_id = id;
	p -> state = 1;
	p -> next = NULL;
	cout << "进程初始化成功!" << endl << endl;
}

int insert_to_ready(PCB * p) // 插入就绪队列
{
		p -> next = NULL;
		if(ready_tail) ready_tail -> next = p;
		ready_tail = p;
		if(! ready_head) ready_head = p;
		return 0;
}

void insert_to_blocked(PCB * p) // 插入阻塞队列 
{
	p -> next = NULL;
	if(blocked_tail) blocked_tail -> next = p;
	blocked_tail = p;
	if(! blocked_head) blocked_head = p;
}

void change_process() // 切换进程 
{
	if(running) insert_to_ready(running);
	running = ready_head;
	if(ready_head) ready_head = ready_head -> next;
	if(ready_head == NULL) ready_tail = NULL;
	cout << "切换进程成功!" << endl << endl;
}

void block_process() // 阻塞进程
{
	if(running) 
	{
		insert_to_blocked(running); 
		running = ready_head;
	    if(ready_head) ready_head = ready_head -> next;
	    if(ready_head == NULL) ready_tail = NULL;
		cout << "进程阻塞成功!" << endl << endl;
	}
	
	else cout << "当前系统没有运行当中的程序可供阻塞!" << endl << endl;
}

void awaken_process() // 唤醒进程 
{
	if(blocked_head)
	{
		// if(blocked_head == blocked_tail) blocked_tail = NULL;
		auto p = blocked_head -> next;
		insert_to_ready(blocked_head);
		blocked_head = p;
		if(blocked_head == NULL) blocked_tail = NULL;
		cout << "成功唤醒阻塞队列队首进程!" << endl << endl;
	}
	else cout << "阻塞队列为空,没有可供唤醒的进程!" << endl << endl;
}

void end_process() // 结束进程 
{
	if(running)
	{
		S.erase(running -> out_id);
		delete running;
		running = ready_head;
	    if(ready_head) ready_head = ready_head -> next;
	    if(ready_head == NULL) ready_tail = NULL;
	    cout << "成功结束当前运行进程!" << endl << endl;
	}
	
	else cout << "当前系统没有运行当中的程序可供结束!" << endl << endl;
}

void show() // 显示 
{
	if(running) cout << "运行的程序是:" << running -> out_id << endl;
	else cout << "没有正在运行的程序!" << endl;
	
	if(ready_head)
	{
		cout << "就绪队列为:" ; 
		for(auto i = ready_head; i; i = i -> next)
		  cout << i -> out_id << " " ;
		cout << endl;
	}
	else cout << "就绪队列为空!" << endl;
	
	if(blocked_head)
	{
		cout << "阻塞队列为:" ; 
		for(auto i = blocked_head; i; i = i -> next)
		  cout << i -> out_id << " " ;
		cout << endl;		
	}
	else cout << "阻塞队列为空!" << endl;
	
	cout << endl;
}

void check() // 检查(若当前没有正在运行的程序且当前就绪队列非空,则调度就绪队列队首进程) 
{
	if(!running && ready_head)
	  {
	  	 running = ready_head;
	  	 ready_head = ready_head -> next;
	  }
}

int main()
{
	while(true)
	{
		int choice; 
		cout << "请选择系统模拟选项:" << endl;
		cout << "1、创建进程" << endl;
		cout << "2、当前时间片结束" << endl;
		cout << "3、阻塞当前运行进程" << endl;
		cout << "4、唤醒阻塞队列队首进程" << endl;
		cout << "5、结束当前运行进程" << endl;
		cout << "6、退出系统" << endl << endl;
		cin >> choice;
		
		switch(choice)
		{
			case 1: 
			    {
			        auto p = PCB_creat();
			        PCB_init(p); 
			        insert_to_ready(p);
			        check();
					show(); 
					break; 
			    }
			case 2: change_process(); show(); break; 
			case 3: block_process(); show(); break; 
			case 4:awaken_process(); check(); show(); break; 
			case 5:end_process(); show(); break; 
			case 6: exit(0);
			default: cout << "您的选择有误,请重新选择!" << endl;
		}
	}
	
	return 0;
}

六、 效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit java.awt.Toolkit.getDefaultToolkit()import java.awt.Toolkit;public class 多次调用Toolkit的getDefaultToolkit方法获得是同一个单例的Toolkit {static public void main (String...arguments)t…

WMS:系统窗口添加过程

WMS:系统窗口添加过程 1、经常使用的两大类窗口2、系统窗口StatusBar2.1 StatusBarWindowView添加流程2.2 简要时序图 android12-release 1、经常使用的两大类窗口 Android中的“窗口”类型有很多&#xff0c;经常使用的“窗口”大致分为两大类&#xff1a;一是&#xff0c;由系…

对于后端Linux的入门知识

为什么使用Linux 文章来自https://librehunt.org/&#xff0c;在这个网站里&#xff0c;你可以根据它提供的选项&#xff0c;最终选出适合你的Linux版本 It’s safe and private. No tracking. No company watching over you, no “big brother is watching you” nonsense. Ju…

article-三自由度机械臂运动学分析+仿真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOmeEm3I-1685366971102)(data:image/svgxml;utf8, )] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCu0JrBB-1685366971103)(data:image/svgxml;utf8, )] 建立坐标系 1…

ROS:创建工作空间和编译功能包

目录 一、工作空间二、创建工作空间三、编译空代码的工作空间四、功能包五、创建功能包六、设置和检查环境变量七、功能包中的两个重要文件 一、工作空间 存放工程开发相关文件的文件夹。类似一个IDE&#xff08;例如Pycharm&#xff09;新建一个工程&#xff0c;就是一个工作…

权威认可!腾讯云EdgeOne入选Gartner® DDoS缓解方案市场指南

近日&#xff0c;Gartner发布《Market Guide for DDoS Mitigation Solutions》报告&#xff0c;腾讯云EdgeOne入选Gartner DDoS缓解方案市场指南。 “分布式拒绝服务&#xff08;DDoS&#xff09;缓解市场包括检测和缓解DDoS攻击并将其作为专用产品提供的供应商。它包括专业供…

有这个证书,网络安全工程师找工作不用愁

想要成为网络安全工程师&#xff0c;满足企业的用人要求。最基本的&#xff0c;你需要熟悉TCP/IP协议&#xff0c;熟悉sql注入原理和手工检测、熟悉内存缓冲区溢出原理和防范措施、熟悉信息存储和传输安全、熟悉数据包结构、熟悉Ddos攻击类型和原理。并且有一定的ddos攻防经验&…

I2C通信协议MPU6050

目录 I2C通信协议 硬件 软件 I2C时序 MPU6050 I2C通信协议 硬件 为了避免总线没协调好导致电源短路&#xff0c;配置为开漏输出&#xff0c;所有设备输出低电平不输出高电平&#xff0c;即右图。又为了避免高电平造成的引浮空&#xff0c;&#xff08;第三点&#xff09;总…

kotlin用CoroutineScope启动协程async等待结果返回

kotlin用CoroutineScope启动协程async等待结果返回 例如&#xff1a; import kotlinx.coroutines.*object MyCoroutineScope {private val coroutineContext Job() Dispatchers.Default CoroutineName("my_context")val coroutineScope CoroutineScope(corouti…

【Redis】聊一下Redis数据同步/复制

在分布式系统中&#xff0c;基本上所有的存储中间件都支持数据同步/复制功能&#xff0c;主要的原因是为实现高可用&#xff0c;单点宕机的故障&#xff0c;必须需要将数据进行共享&#xff0c;而共享的话&#xff0c;就需要将数据进行复制&#xff0c;对于已经学过的MySQL和Ka…

Jdk17中文在线手册(建议收藏)

本身学习技术就比较难&#xff0c;再来一个英文版的API&#xff0c;就难上加难&#xff0c;经过几周的研究翻译&#xff0c;JDK17最新版中文在线手册搞定&#xff0c;不要看错了哈是JDK17不是JDK1.7&#xff0c;全网最新的只有JDK11&#xff0c;JDK17中文在线手册是第一次出现&…

JavaEE进阶(5/29)SpringMVC

目录 1.复习 2.URL传参PathVariable 3.上传文件RequestPart 4.获取Cookie/Session/header 5.传统/维新获取cookies 6.传统/维信获得Header 7.获取Session&#xff08;非常重要&#xff09; 8.不加ResponseBody 9.如何获取Json数据&#xff0c;RequestBody 10.想…

王者之力,驭见未来 | 圣戈班量子膜全国核心店面大会圆满落幕!

5月24日&#xff0c;“王者之力&#xff0c;驭见未来”——2023年圣戈班量子膜全国核心店面大会在成都缇沃丽酒店隆重召开&#xff01; 圣戈班舒热佳特殊镀膜有限公司全球总裁Mehrotra Vishal先生、圣戈班舒热佳特殊镀膜有限公司亚太总裁陈剑超先生、圣戈班舒热佳特殊镀膜有限公…

opencv_c++学习(二十九)

一、监督学习的聚类方法 K近邻的方法&#xff1a; 首先给出一个阈值k&#xff0c;后寻找距离黑色圆点最近的k个元素&#xff0c;占据比例大的元素即为黑色所属的类别。如图所示&#xff0c;即k3时&#xff0c;黑色圆属于三角形&#xff0c;k5时圆点属于正方形。 支持向量机方…

设计模式-享元模式

问题背景 有一个小型的外包项目&#xff0c;就是给客户A做一个展示的网站&#xff0c;例如展示&#xff1a;这个网站展示的都是客户A的产品。然后可以A的朋友觉得不错&#xff0c;也希望做这样一个网站&#xff0c;但是要求有些不同&#xff0c;要求以新闻的形式展示。还有更多…

DORIS----漏斗转化分析案例实现

综合案例之漏斗转化分析 业务目标、到达路径&#xff0c;路径步骤、步骤人数&#xff0c;步骤之间的相对转换率和绝对转换率 每一种业务都有他的核心任务和流程&#xff0c;而流程的每一个步骤&#xff0c;都可能有用户流失。 所以如果把每一个步骤及其对应的数据&#xff08;…

【Linux】深入了解冯诺依曼体系结构与操作系统

目录 导读 &#x1f31e;专栏导读 &#x1f31e;冯诺依曼 &#x1f31e;冯诺依曼体系结构 &#x1f31b;木桶效应 &#x1f31e;操作系统(Operator System) &#x1f31b;概念 &#x1f31b;设计OS的目的 &#x1f31b;系统调用和库函数概念 导读 六一儿童节快到了&…

Envoy 物联网模块开发---串口服务器 (一)

一、背景 最近业余时间想基于Envoy 开发一个串口网关&#xff0c;主要是想把一些 modbus、bacnet 以及 mqtt 等物联网协议接入Envoy中&#xff0c;当读到串口数据后可以转发成对应的网络协议 二、Envoy的优势 选择Envoy的话主要是因为Envoy的代码已经十分健全了&#xff0c;零…

(数字图像处理MATLAB+Python)第九章图像形态学运算-第三节:二值图像的形态学处理

文章目录 一&#xff1a;形态滤波&#xff08;1&#xff09;概述&#xff08;2&#xff09;程序 二&#xff1a;图像的平滑处理&#xff08;1&#xff09;概述&#xff08;2&#xff09;程序 三&#xff1a;图像的边缘提取&#xff08;1&#xff09;概述&#xff08;2&#xff…

redux与react-redux状态集中管理

一、redux:可用于react、Vue等中 redux应用&#xff1a;状态的管理&#xff0c;共享状态&#xff0c;Redux用一个单独的常量状态树&#xff08;state对象&#xff09;保存这一整个应用&#xff08;如tab选项卡的状态、城市等需要应用在整个页面的信息&#xff09;的状态。其本…