操作系统,作业调度算法参考

操作系统,作业调度算法参考


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime>
#include <map>
#include <stdio.h>
using namespace std;


const int N = 1000;
struct Task
{
	char name[10]; // 进程名称
	int come_time; // 到达时间
	int turn_time; // 运行时间
	int start_time; // 开始运行时间
	int end_time;// 结束运行时间
	int wait_time; // 等待时间
}task[N], tp_task[N];

int num;//进程数目

void sleep(int n)
{
	int st = clock();
	while ((clock() - st) <= n);
}

void GetData()
{
	printf("请输入每个进程的名称,到达时间,服务时间\n");
	for (int i = 0; i < num; i++)
	{
		printf("第%d个进程信息输入:\n", i + 1);
		cin >> task[i].name;
		cin >> task[i].come_time;
		cin >> task[i].turn_time;
		strcpy_s(tp_task[i].name, task[i].name);
		tp_task[i].come_time = task[i].come_time;
		tp_task[i].turn_time = task[i].turn_time;
	}
	printf("进程信息输入完毕!!!\n");
}

void BackData()
{
	for (int i = 0; i < num; i++)
	{
		strcpy_s(task[i].name, tp_task[i].name);
		task[i].come_time = tp_task[i].come_time;
		task[i].turn_time = tp_task[i].turn_time;
	}
	printf("进程信息写入成功!!!\n");
}

void Print()
{
	printf("进程运行信息:\n");
	printf("task_name  come_time   start_time   turn_time   end_time\n");
	for (int i = 0; i < num; i++)
	{
		printf("     %-9s%-13d", task[i].name, task[i].come_time);
		printf("%-10d%-12d", task[i].start_time, task[i].turn_time);
		printf("%-4d\n", task[i].end_time);
	}
}

bool cmp1(const struct Task& a, const struct Task& b)
{
	return a.turn_time < b.turn_time;
}

//短作业优先算法
void SJF()
{
	/**
	功能:实现短作业优先算法,将进程的运行结束信息
		  按照进程运行顺序输出。
	*/

	sort(task, task + num, cmp1);
	int countt = 0;
	for (int i = 0; i < num; i++)
	{
		printf("%s进程正在执行", task[i].name);
		for (int j = 0; j < 10; j++)
		{
			sleep(100 * task[i].turn_time); printf(".");
		}
		putchar('\n');

		//sleep(1000 * task[i].turn_time);  // 程序暂停时间(单位:ms)
		task[i].start_time = countt;
		countt += task[i].turn_time;
		task[i].end_time = countt;
	}
	printf("\n所有进程全部执行完毕!!!\n\n");

	Print();
}

bool cmp2(const struct Task& a, const struct Task& b)
{
	return a.come_time < b.come_time;
}

//先来先服务算法
void FCFS()
{
	/**
	功能:实现先来先服务算法,将进程的运行结束信息
		  按照进程运行顺序输出。
	*/

	int countt = 0;
	sort(task, task + num, cmp2);

	for (int i = 0; i < num; i++)
	{
		printf("%s进程正在执行", task[i].name);
		for (int j = 0; j < 10; j++)
		{
			sleep(100 * task[i].turn_time); printf(".");
		}
		putchar('\n');

		//sleep(1000 * task[i].turn_time);  // 程序暂停时间(单位:ms)
		task[i].start_time = countt;
		countt += task[i].turn_time;
		task[i].end_time = countt;
	}
	printf("\n所有进程全部执行完毕!!!\n\n");

	Print();
}


bool cmp3(const struct Task& a, const struct Task& b)
{
	if (a.end_time < 0 && b.end_time < 0)
	{
		double ra = (a.wait_time + a.turn_time) * 1.0 / a.turn_time;
		double rb = (b.wait_time + b.turn_time) * 1.0 / b.turn_time;
		return ra > rb;
	}
	else
		return a.end_time < b.end_time;
}

bool cmp4(const struct Task& a, const struct Task& b)
{
	return a.come_time < b.come_time;
}

// 非抢占 高响应比 优先调度算法
void HRRN()
{
	/**
	功能;运行非抢占式 高响应比 优先调度算法执行进程,将进程的运行结束信息
		  输出显示。
	*/
	//初始化进程的结束时间 -1
	for (int i = 0; i < num; i++)
		task[i].end_time = -1;

	int countt = 0;  //计时器
	while (true)
	{
		for (int i = 0; i < num; i++)
			task[i].wait_time = countt - task[i].come_time;
		sort(task, task + num, cmp3);

		if (task[0].end_time >= 0) break;

		printf("%s进程正在执行", task[0].name);
		for (int j = 0; j < 10; j++)
		{
			sleep(100 * task[0].turn_time); printf(".");
		}
		putchar('\n');

		//sleep(1000 * task[0].turn_time);  // 程序暂停时间(单位:ms)
		task[0].start_time = countt;
		countt += task[0].turn_time;
		task[0].end_time = countt;
	}
	printf("\n所有进程全部执行完毕!!!\n\n");

	sort(task, task + num, cmp4); // 按照开始运行的时间从小到大排序
	Print();
}

bool cmp5(const struct Task a, const struct Task b)
{
	return a.end_time < b.end_time;
}

void Menu()
{
	printf("             命令\n");
	printf("       **** 1.FCFS算法\n");
	printf("       **** 2.SJF算法\n");
	printf("       **** 3.HRRN算法\n");
	printf("       **** 4.End Up Code!!!\n\n");
}

int main()
{
	int menu;
	int flag = 1;
	printf("             《进程调度实验程序》\n\n");
	while (flag)
	{
		printf("请输入进程的个数:  ");
		cin >> num;
		GetData();
		printf("请输入命令: ");
		Menu();
		cin >> menu;
		switch (menu)
		{
		case 1:
			printf("     <启动 FCFS 调度算法>\n");
			FCFS();
			break;
		case 2:
			printf("     <启动 SJF 调度算法>\n");
			SJF();
			break;
		case 3:
			printf("     <启动非抢占式 HRRN 调度算法>\n");
			HRRN();
			break;
		case 4:
			flag = 0;
			break;

		}
		BackData();
	}



	return 0;
}





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值