一零六三、进程调度算法模拟 (C语言实现)

news2024/11/18 1:30:47

目录

 背景

程序实现

实现效果


 

 背景

1、根据算法要求从键盘输入不少于四个进程信息(包括进程名称、进程到达时间、估计运行时间),RR算法输入不少于两种时间片的大小
2、输出进程的调度顺序、完成时间、周转时间、平均周转时间、平均带权周转时间
3、有完整的界面(最好是图形界面,初始界面要显示个人基本情况),每一个功能模块要求都要有函数实现,有菜单选项
4、程序代码具有可读性,主要函数和数据结构要有注释,输出结果简洁明了
5、定义PCB、就绪队列等数据结构;用函数实现就绪对列初始化、插入就绪队列等操作
6、进程调度是处理机管理的核心内容。本实验要求用编写和调试一个进程调度算法模拟程序。

        通过本实验可以加深理解有关进程控制块、进程队列的概念以及调度算法的具体实施办法。

程序实现

#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#define MAX 1111

const double Max = 11111.0;

using namespace std;

typedef struct FCFS {
	int mark;
	string name;
	double arrivetime;
	double servetime;
	double starttime;
	double finishtime;
	double roundtime;
	double daiquantime;

	bool operator<(const FCFS &a) const {
		return arrivetime > a.arrivetime;
	}
} FCFS;

typedef struct SJF {
	int mark;
	string name;
	double arrivetime;
	double servetime;
	double starttime;
	double finishtime;
	double roundtime;
	double daiquantime;
	double response_ratio;

	bool operator<(const SJF &a) const {
		return response_ratio < a.response_ratio;
	}
} SJF;

typedef struct RDRN {
	int mark;
	bool flag = true;
	string name;
	double Count = 0.0;
	double arrivetime;
	double servetime;
	double starttime;
	double finishtime;
	double roundtime;
	double daiquantime;
	double running = 0.0;

	bool operator<(const RDRN &a) const {
		return Count > a.Count;
	}
} RDRN;




void FCFS_arithmetic() {

	FCFS f[MAX];
	FCFS ff;
	int n;
	double averagedaiquantime = 0.0;

	priority_queue<FCFS> q1;

	printf("请输入进程数(整数)\n");

	scanf("%d",&n);

	printf("请输入n组数据,每组数据包括进程名字(字符串)、进程到达时间(浮点数)、进程服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

	for(int i=0; i<n; i++) {
		f[i].mark =i;
		cin>>f[i].name;
		scanf("%lf%lf",&f[i].arrivetime,&f[i].servetime);
		q1.push(f[i]);

	}

	double starttime = 0.0;
	ff = q1.top();
	q1.pop();
	f[ff.mark].starttime = ff.arrivetime;
	f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
	f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
	f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
	starttime =f[ff.mark].finishtime;
	printf("先来先服务调度算法的作用时间表:\n\n");
	printf("进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

	cout<<"  "<<f[ff.mark].name;

	printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[ff.mark].arrivetime,f[ff.mark].servetime,f[ff.mark].starttime,f[ff.mark].finishtime,f[ff.mark].roundtime,f[ff.mark].daiquantime);

	while(!q1.empty()) {

		ff =q1.top();
		q1.pop();
		f[ff.mark].starttime = starttime;
		f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
		f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
		f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
		averagedaiquantime += f[ff.mark].daiquantime;
		starttime =f[ff.mark].finishtime;

		cout<<"  "<<f[ff.mark].name;

		printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[ff.mark].arrivetime,f[ff.mark].servetime,f[ff.mark].starttime,f[ff.mark].finishtime,f[ff.mark].roundtime,f[ff.mark].daiquantime);

	}

	printf("\n平均代权周转时间:\n");

	printf("%.2f\n",averagedaiquantime/n);

}



void SJF_arithmetic()

{

	SJF f[MAX];
	SJF ff;
	int n;
	double starttime = Max;
	double averagedaiquantime = 0.0;
	priority_queue<SJF> q1;
	printf("请输入进程数(整数)\n");
	scanf("%d",&n);

	printf("请输入n组数据,每组数据包括进程名字(字符串)、进程到达时间(浮点数)、进程服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

	for(int i=0; i<n; i++) {
		f[i].mark =i;
		cin>>f[i].name;
		scanf("%lf %lf",&f[i].arrivetime,&f[i].servetime);
		if(f[i].arrivetime < starttime) starttime = f[i].arrivetime;
		q1.push(f[i]);

	}

	printf("短进程优先调度算法的作用时间表:\n\n");

	int cnt = 0;

	while(!q1.empty()) {

		SJF temp[MAX];
		ff =q1.top();
		q1.pop();

		if(f[ff.mark].arrivetime <= starttime) {
			for(int i=0; i<cnt; i++) q1.push(temp[i]);
			cnt =0;
			f[ff.mark].starttime = starttime;
			f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
			f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
			f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
			averagedaiquantime += f[ff.mark].daiquantime;
			starttime = f[ff.mark].finishtime;

		}

		else temp[cnt++] = ff;

	}

	printf("进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

	for(int i=0; i<n; i++) {

		cout<<"  "<<f[i].name;

		printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[i].arrivetime,f[i].servetime,f[i].starttime,f[i].finishtime,f[i].roundtime,f[i].daiquantime);

	}

	printf("\n平均代权周转时间:\n");

	printf("%.2f\n",averagedaiquantime/n);

}



void RDRN_arithmetic() {

	double timeslice;
	RDRN f[MAX];
	RDRN temp[MAX];
	int cnt = 0;
	RDRN ff;
	int n;
	double averagedaiquantime = 0.0;
	priority_queue<RDRN> q1;

	printf("请输入进程数和时间片长度(进程数为整数,时间片长度可为浮点数,中间用空格隔开!):\n");

	scanf("%d%lf",&n,&timeslice);

	int tot = n;

	printf("请输入n组数据,每组数据包括进程名字(字符串)、进程到达时间(浮点数)、进程服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

	for(int i=0; i<n; i++) {

		f[i].mark =i;
		cin>>f[i].name;
		scanf("%lf %lf",&f[i].arrivetime,&f[i].servetime);
		f[i].Count= f[i].arrivetime;
		q1.push(f[i]);

	}

	double clock =q1.top().arrivetime;

	int t = 0;

	while(t != n) {

		ff =q1.top();

		if(f[ff.mark].arrivetime <= clock && tot-- > 0) {
			q1.pop();
			if(f[ff.mark].flag) {
				f[ff.mark].starttime = clock;
				f[ff.mark].flag = false;
			}



			if(f[ff.mark].running != f[ff.mark].servetime) {

				double newtime = f[ff.mark].servetime - f[ff.mark].running;
				if(newtime >= timeslice) {
					clock += timeslice;
					f[ff.mark].running += timeslice;
					f[ff.mark].Count += timeslice;
				}

				else {
					clock += newtime;
					f[ff.mark].running += newtime;
					f[ff.mark].Count += newtime;
				}

				if(f[ff.mark].running != f[ff.mark].servetime) temp[cnt++] = f[ff.mark];

			}



			if(f[ff.mark].running == f[ff.mark].servetime) {
				t++;
				f[ff.mark].finishtime = clock;
				f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
				f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
				averagedaiquantime += f[ff.mark].daiquantime;
			}

		}



		else {
			for(int i=0; i<cnt; i++) q1.push(temp[i]);
			cnt =0;
			tot =q1.size();
		}

	}



	printf("时间轮转调度算法的作用时间表:\n\n");

	printf("进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

	for(int i=0; i<n; i++) {
		cout<<"  "<<f[i].name;

		printf("%10.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n",f[i].arrivetime,f[i].servetime,f[i].starttime,f[i].finishtime,f[i].roundtime,f[i].daiquantime);

	}

	printf("\n平均带权周转时间:\n\n\n");

	printf("%.2f\n",averagedaiquantime/n);

}


void HRRN_arithmetic() {
	SJF f[MAX];
	SJF ff;
	int n;
	double averagedaiquantime = 0.0;
	double waiting_time = 0.0;

	priority_queue<SJF> q1;
	printf("请输入进程数(整数)\n");
	scanf("%d", &n);

	printf("请输入n组数据,每组数据包括进程名字(字符串)、进程到达时间(浮点数)、进程服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

	for (int i = 0; i < n; i++) {
		f[i].mark = i;
		cin >> f[i].name;
		scanf("%lf %lf", &f[i].arrivetime, &f[i].servetime);
		f[i].response_ratio = 0.0;
		q1.push(f[i]);
	}

	printf("高响应比调度算法的作用时间表:\n\n");
	printf("进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

	double clock = 0.0;
	while (!q1.empty()) {
		ff = q1.top();
		q1.pop();

		if (ff.arrivetime <= clock) {
			f[ff.mark].starttime = clock;
			f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
			f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
			f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
			averagedaiquantime += f[ff.mark].daiquantime;
			clock = f[ff.mark].finishtime;
		} else {
			clock = ff.arrivetime;
			f[ff.mark].starttime = clock;
			f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
			f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
			f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
			averagedaiquantime += f[ff.mark].daiquantime;
			clock = f[ff.mark].finishtime;
		}

		printf("  %s", f[ff.mark].name.c_str());
		printf("%10.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n", f[ff.mark].arrivetime, f[ff.mark].servetime, f[ff.mark].starttime, f[ff.mark].finishtime, f[ff.mark].roundtime, f[ff.mark].daiquantime);

		waiting_time = clock - ff.arrivetime;
		while (!q1.empty()) {
			ff = q1.top();
			q1.pop();
			if (ff.arrivetime <= clock) {
				f[ff.mark].starttime = clock;
				f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
				f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
				f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
				averagedaiquantime += f[ff.mark].daiquantime;
				clock = f[ff.mark].finishtime;
			} else {
				clock = ff.arrivetime;
				f[ff.mark].starttime = clock;
				f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
				f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
				f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
				averagedaiquantime += f[ff.mark].daiquantime;
				clock = f[ff.mark].finishtime;
			}

			printf("  %s", f[ff.mark].name.c_str());
			printf("%10.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n", f[ff.mark].arrivetime, f[ff.mark].servetime, f[ff.mark].starttime, f[ff.mark].finishtime, f[ff.mark].roundtime, f[ff.mark].daiquantime);

			waiting_time = clock - ff.arrivetime;
			for (int i = 0; i < n; i++) {
				if (f[i].starttime == 0 && i != ff.mark) {
					f[i].starttime = clock;
					f[i].finishtime = f[i].starttime + f[i].servetime;
					f[i].roundtime = f[i].finishtime - f[i].arrivetime;
					f[i].daiquantime = f[i].roundtime / f[i].servetime;
					averagedaiquantime += f[i].daiquantime;
					f[i].response_ratio = (waiting_time + f[i].servetime) / f[i].servetime;
				}
			}
		}

		printf("\n平均代权周转时间:\n");
		printf("%.2f\n", averagedaiquantime / n);

		double total_response_ratio = 0.0;
		for (int i = 0; i < n; i++) {
			total_response_ratio += f[i].response_ratio;
		}
		printf("\n平均响应比:\n");
		printf("%.2f\n", total_response_ratio / n);
	}

}




int main()

{
	int ca = 0;

	do {
		printf("\t\t\t------- 先来先服务、短进程优先、时间片轮转、高响应比调度算法模拟------\n");
		printf("\t\t\t---------------------------------------------------------------\n");
		printf("\t\t\t-------------班级:XXXXXXX-------------------\n");
		printf("\t\t\t-------------学号:XXXXXXXXXXXX-------------------------------\n");
		printf("\t\t\t-------------姓名:托马斯----------------------------------------\n\n\n");
		printf("\n请选择调度算法或结束程序:\n");
		printf("0、结束程序\n1、先来先服务\n2、短进程优先\n3、时间片轮转\n4、高响应比调度\n");
		scanf("%d",&ca);
		if (ca == 1)
			FCFS_arithmetic();
		if (ca == 2)
			SJF_arithmetic();
		if (ca == 3)
			RDRN_arithmetic();
		if (ca == 4)
			HRRN_arithmetic();
	} while(ca);

	return 0;

}

实现效果

 

 

 

 

 


 

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

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

相关文章

Openlayers实战:点击某点,overlay显示经纬度坐标

在之前的实战中,我们在某个固定的位置显示鼠标位置的经纬度, 今天改变一种形式,即采用overlay的方式,点击某处,获得到经纬度坐标,显示在overlay层上面。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特…

23款迈巴赫S480升级原厂主动式氛围灯+电动后门+前后手势感应

23款迈巴赫S480升级原厂主动式氛围灯原厂电动后门原厂手势控制 新车刚提&#xff0c;原厂配置升级&#xff0c;全新配件 配件齐全&#xff0c;准备上车 全套主动式氛围灯配件 氛围灯模块 前排驾驶位顶棚的手势感应 手势感应电脑模块 后排顶棚的手势感应 电动后门配件有锁机、电…

基于simulink使用光流法跟踪汽车(附源码)

一、前言 此示例演示如何使用光流估计在视频序列中检测和跟踪汽车。 二、模型 下图显示了使用光流跟踪汽车模型&#xff1a; 三、用光流结果跟踪汽车 该模型使用光流估计技术来估计视频序列的每一帧中的运动矢量。通过阈值化运动矢量&#xff0c;该模型创建包含移动对象斑点…

mysql学习--使用navicat查看数据库密码

数据库通常分为两种&#xff1a;关系型数据库和非关系型数据库,关系型数据库通常会建立很多二维数据表&#xff0c;形成一对一、一对多、多对多等关系&#xff1b;之后利用SQL语句查询我们所需要的数据&#xff1b;非关系型数据库基于Key-Value的对应关系&#xff0c;并且查询的…

机器学习 day24(多类分类模型,Softmax回归算法及其损失函数)

多类分类 多类分类问题仍然是分类问题&#xff0c;所以预测y的可能结果是少量的&#xff0c;而不是无穷多个&#xff0c;且对于多类分类它&#xff1e;2 如上图&#xff1a;左侧为二分类&#xff0c;右侧为多分类&#xff0c;可以通过决策边界来划分区域 Softmax回归算法 …

记录--在高德地图实现卷帘效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 介绍 今天介绍一个非常简单的入门级小案例&#xff0c;就是地图的卷帘效果实现&#xff0c;各大地图引擎供应商都有相关示例&#xff0c;很奇怪高德居然没有&#xff0c;我看了下文档发现其实也是可以…

Fastpillars论文解读

本论文是美团在pointpillar算法的基础上的改进。 主要改进点分为一下两个&#xff1a; 1.引入注意力机制对pillar内的特征进行提取&#xff0c;改善直接maxpooling导致的细粒度信息丢失。 2.参考CSPNet和RepVGG构建了一个全新的轻量化backbone。 一、pillar注意力机制特征提…

怎么把MP4转换成GIF?分享几个方法轻松转换!

如何将mp4转换为gif&#xff1f;在分享视频剪辑素材到社交媒体时&#xff0c;许多人会选择将其转换为gif格式。这是因为GIF文件加载速度更快&#xff0c;文件大小更小。此外&#xff0c;将MP4转换为GIF也方便人们在电子邮件和聊天应用程序中发送动态图像。下面&#xff0c;我们…

【Linux】文件描述符 (上篇)

文章目录 &#x1f4d6; 前言1. 文件的预备知识2. 复习C语言的文件操作3. Linux系统级文件接口3.1 open、 close、 read、 write 接口&#xff1a;3.2 内核当中实现的映射关系&#xff1a;3.3 如何理解Linux下一切皆文件&#xff1a; &#x1f4d6; 前言 本章开始&#xff0c;…

python绘制带有误差棒的条形图

文章目录 bar和barh加入误差棒定制误差棒颜色 bar和barh 在matplotlib中&#xff0c;通过bar和barh来绘制条形图&#xff0c;分别表示纵向和横向的条形图。二者的输入数据均主要为高度x和标签height&#xff0c;示例如下 import matplotlib.pyplot as plt import numpy as np…

MySQL CDC技术方案梳理

本篇主要探讨MySQL数据同步的各类常见技术方案及优劣势对比分析&#xff0c;从而更加深层次的理解方案&#xff0c;进而在后续的实际业务中&#xff0c;更好的选择方案。 1 CDC概念 CDC即Change Data Capture&#xff0c;变更数据捕获&#xff0c;即当数据发生变更时&#xff…

Ubuntu: scp命令使用及Permission denied错误解决方案

scp命令介绍 scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 Ubuntu 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp local_file remote_usernameremote_ip:remote_folder scp /Users/X.pem root192.168.1.247:/usr/local/ssl Permission…

java项目之高校校园点餐系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的闲一品交易平台。技术交流和部署相关看文末&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&#…

傻瓜式一键生成主子表

文章目录 傻瓜式一键生成主子表 简介创建主子表示例 根据已有主表创建子表示例 创建空属性主子表示例 总结 傻瓜式一键生成主子表 直接将xml导入到Studio里即可。下载文件连接&#xff1a; CSDN链接阿里云盘 简介 很多同学在创建主子表时&#xff0c;都会可能遇到如下一些问…

日本留学托福要求多少分才及格呢?

日本有悠久的历史和文化&#xff0c;吸引了越来越多的留学生前往探索和学习。那么&#xff0c;日本留学托福要求多少分才及格呢&#xff1f; 日本留学托福成绩要求 综合类&#xff1a;通常要求申请者取得托福总分在80以上&#xff0c;各项分数要求分别为口语20以上&#xff0c…

LinuxI2C应用编程——I2C-Tools的使用

文章目录 I2C 硬件框架I2C 软件框架I2C协议&#xff08;传输数据的格式&#xff09;写操作读操作I2C 信号 SMBus 协议概述硬件和软件上的区别SMBus 协议分析符号的含义SMBus Quick CommandSMBus Receive ByteSMBus Send ByteSMBus Read ByteSMBus Read WordSMBus Write ByteSMB…

11_Linux阻塞与非阻塞

目录 阻塞和非阻塞IO简介 等待队列 等待队列头 等待队列项 轮询 Linux驱动下的poll操作函数 阻塞式访问IO实验 阻塞式访问IO驱动程序编写 运行测试 非阻塞式IO实验 运行测试 阻塞和非阻塞IO简介 阻塞和非阻塞IO是Linux驱动开发里面很常见的两种设备访问模式,在编写…

充分利用测试自动化的 10 个最佳实践

目录 前言&#xff1a; 实践1&#xff1a;手动和自动测试结合 实践2&#xff1a;特别注意回归测试 实践3&#xff1a;包括端到端测试 实践4&#xff1a;为自动化测试提供集体所有权 实践5&#xff1a;详细计划与测试相关的所有流程 实践6&#xff1a;选择适合您需求的自…

Python随机生成2堆三维点云点,有固定的重复率并可视化

Python随机生成2堆三维点云点&#xff0c;有固定的重复率并可视化 1. 效果图2. 源码 这篇博客源于博友的提问&#xff0c;刚好电脑在旁边没啥事&#xff0c;那就开整吧。 np.random 生成随机点&#xff08;提供了俩种方法&#xff0c;1. xyz限制都是0~MAX值&#xff0c;2. xyz分…

IDEA中使用.env文件配置信息

一、说明 我们以配置阿里云的 Access Key 的信息为例&#xff08;配置别的信息当然也可以&#xff0c;我只是举个例子&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;假设我们的代码中需要用到它。Access Key有两个属性&#xff0c;分别为【ALIBABA_CLOUD_ACCE…