操作系统 Linux 大作业 保姆级教程(3)

3、在Linux环境下编写CC++程序实现几种CPU调度算法:FCFSSJF和优先权调度。在Linux下进行编译和运行,可使用Makefile文件实现程序的编译、安装和卸载。并比较这几种CPU调度算法的性能,给出等待时间、周转时间及其平均值。(报告中给出源代码、Makefile文件、make运行结果以及程序运行结果)。

实验所用测试数据如下表(算法均默认为非抢占)(30分)

 在本地vscode编写c.c和makefile.mk

c.c

#include <stdio.h>
#include <stdlib.h>
typedef struct {
	int id;
	int level;
	int cometime;
	int servertime;
	int waittime;
	int finishtime;
	int turnovertime;
}JOB;
//存数据
JOB jobs[7] = {
1,0,800,50,0,0,0,
2,1,815,30,0,0,0,
 3,2,830,25,0,0,0,
4,2,835,20,0,0,0,
5,2,845,15,0,0,0,
6,1,700,10,0,0,0,
7,0,820,5,0,0,0,
};
int compare1(const void* a, const void* b) {
	return ((JOB*)a)->cometime - ((JOB*)b)->cometime;
}
void FCFS() {
	qsort(jobs, 7, sizeof(JOB), compare1);
	int i = 0;
	int totalwait = 0, totalturnover = 0;
	float averagewait = 0, averageturnover = 0;
	for (; i < 7; i++) {
		//两种情况 一种就是来了就能运行
		if (i == 0 || (i > 0 && jobs[i - 1].finishtime <= jobs[i].cometime)) {
			jobs[i].waittime = 0;
			jobs[i].turnovertime = jobs[i].servertime;
			jobs[i].finishtime = jobs[i].cometime + jobs[i].servertime;
		}
		//来了需要等待
		else {
			jobs[i].waittime = jobs[i - 1].finishtime - jobs[i].cometime;
			jobs[i].turnovertime = jobs[i].waittime + jobs[i].servertime;
			jobs[i].finishtime = jobs[i - 1].finishtime + jobs[i].servertime;
		}
		totalwait += jobs[i].waittime;
		totalturnover += jobs[i].turnovertime;
	}
	averagewait = totalwait / 7;
	averageturnover = totalturnover / 7;
	printf("FCFS:\n total_wait_time: %d\n total_turnover_time: %d\naverage_wait_time: % .1f\n average_turnover_time : % .1f\n",totalwait,totalturnover, averagewait, averageturnover);
}
void SJF() {
	int vis[7] = { 0 };
	int stop = 0;
	qsort(jobs, 7, sizeof(JOB), compare1);
	int totalwait = 0, totalturnover = 0;
	float averagewait = 0, averageturnover = 0;
	int finish = 0;
	while (stop < 7) {
		int i = 0;
		for (; i < 7; i++)
			if (jobs[i].cometime > finish)
				break;
		int j = i - 1;
		int flag = 0;
		int idx = -1, shortest = 10000;
		for (; j >= 0; j--) {
			if (vis[j])
				continue;
			else {
				flag = 1;
				//比较能否插队
				if (jobs[j].servertime < shortest) {
					shortest = jobs[j].servertime;
					idx = j;
				}
			}
		}
		if (!flag) {
			vis[i] = 1;
			jobs[i].waittime = 0;
			jobs[i].turnovertime = jobs[i].servertime;
			finish = jobs[i].cometime + jobs[i].servertime;
			jobs[i].finishtime = finish;
			totalwait += jobs[i].waittime;
			totalturnover += jobs[i].turnovertime;
		}
		else {
			vis[idx] = 1;
			jobs[idx].waittime = finish - jobs[idx].cometime;
			jobs[idx].turnovertime = jobs[idx].waittime + jobs[idx].servertime;
			finish += jobs[idx].servertime;
			jobs[idx].finishtime = finish;
			totalwait += jobs[idx].waittime;
			totalturnover += jobs[idx].turnovertime;
		}
		//乱序 完成一个stop+1
		stop = vis[0] + vis[1] + vis[2] + vis[3] + vis[4] + vis[5] + vis[6];
	}
	averagewait = totalwait / 7;
	averageturnover = totalturnover / 7;
	printf("SJF: \n total_wait_time: %d\n total_turnover_time: %d\naverage_wait_time: % .1f\n average_turnover_time : % .1f\n", totalwait,totalturnover, averagewait, averageturnover);
}
void Priority() {
	int vis[7] = { 0 };
	int stop = 0;
	qsort(jobs, 7, sizeof(JOB), compare1);
	int totalwait = 0, totalturnover = 0;
	float averagewait = 0, averageturnover = 0;
	int finish = 0;
	//运行完一个+1 到7就没了
	while (stop < 7) {
		int i = 0;
		for (; i < 7; i++)
			if (jobs[i].cometime > finish)
				break;
		int j = i - 1;
		int flag = 0;
		int idx = -1, pri = -1;
		for (; j >= 0; j--) {
			if (vis[j])
				continue;
			else {
				flag = 1;
				//优先级比较 大的抢占
				if (jobs[j].level > pri) {
					pri = jobs[j].level;
					idx = j;
				}
				else if (jobs[j].level == pri) {
					idx = jobs[j].cometime < jobs[idx].cometime ? j : idx;
				}
			}
		}
		if (!flag) {
			vis[i] = 1;
			jobs[i].waittime = 0;
			jobs[i].turnovertime = jobs[i].servertime;
			finish = jobs[i].cometime + jobs[i].servertime;
			jobs[i].finishtime = finish;
			totalwait += jobs[i].waittime;
			totalturnover += jobs[i].turnovertime;
		}
		else {
			vis[idx] = 1;
			jobs[idx].waittime = finish - jobs[idx].cometime;
			jobs[idx].turnovertime = jobs[idx].waittime + jobs[idx].servertime;
			finish += jobs[idx].servertime;
			jobs[idx].finishtime = finish;
			totalwait += jobs[idx].waittime;
			totalturnover += jobs[idx].turnovertime;
		}
		stop = vis[0] + vis[1] + vis[2] + vis[3] + vis[4] + vis[5] + vis[6];
	}
	averagewait = totalwait / 7;
	averageturnover = totalturnover / 7;
	printf("Pri: \n total_wait_time: %d\n total_turnover_time: %d\naverage_wait_time: % .1f\n avergae_turnover_time : % .1f\n", totalwait,totalturnover, averagewait, averageturnover);
}
int main()
{
	FCFS();
	SJF();
	Priority();
	return 0;
}

makefile.mk

c:c.c
	gcc -o c c.c

移动文件到虚拟机 如何在win和虚拟机之间数据传递请看这里

脚本优先级取大

把写好的脚本文件c.c移动到文件夹

运行

=======================================

Tip:

虚拟机和Win10 互相传递数据:

VMware16Pro 与win10传送数据方法_不知名做题家丶的博客-CSDN博客_win10虚拟机和主机文件传输

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问!JavaEE大作业是一个非常重要的项目,因此在完成该项目之前,您需要掌握一些基本的知识和技能。以下是一些保姆教程,以帮助您顺利完成JavaEE大作业。 1. JavaEE基础知识 在开始编写JavaEE大作业之前,您需要掌握JavaEE基础知识。这包括Java基础、Servlet、JSP、JDBC、JavaBean等。您可以通过一些在线教程或书籍来学习这些知识。 2. 数据库设计与操作 JavaEE大作业通常需要与数据库交互,因此您需要掌握数据库设计和操作的基本知识。您可以学习SQL语言、MySQL数据库、Oracle数据库等。 3. Spring框架 Spring框架是一种流行的JavaEE框架,它提供了很多功能和工具,可以帮助您快速开发JavaEE应用程序。您可以学习Spring框架的基本知识,如Spring MVC、Spring Boot、Spring Security等。 4. 前端技术 JavaEE大作业通常需要开发一个漂亮的用户界面,因此您需要掌握一些前端技术。您可以学习HTML、CSS、JavaScript、jQuery等技术,以及一些流行的前端框架,如Angular、React等。 5. 项目管理工具 在开发JavaEE大作业时,您需要使用一些项目管理工具,如Maven、Gradle等。这些工具可以帮助您管理项目依赖关系、构建和部署项目等。 以上是一些基本的保姆教程,以帮助您顺利完成JavaEE大作业。当然,这只是一个大概的指导,具体还需要根据您的项目需求和实际情况来进行学习和实践。祝您成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值