C++ 进程调度算法实现:FIFO、优先级调度和时间片轮转

本程序使用 C++ 语言实现了三种常见的进程调度算法:先进先出 (FIFO)、优先级调度和时间片轮转。程序允许用户输入进程流文件,并输出每种算法的进程执行流、总等待时间和平均等待时间。

代码实现

#include<stdio.h>
#include<string.h>
#include<iostream>
#pragma warning(disable:4996)
using namespace std;
const int block_time = 10; //定义时间片的长度为10秒 
const int MAXPCB = 100; //定义最大进程数
//定义进程结构体 
typedef struct node
{
	char name[20];
	int status;
	int time;
	int privilege;
	int finished;
	int wait_time;
}pcb;
pcb pcbs[MAXPCB];
int quantity;
//初始化函数 
void initial()
{
	int i;
	for (i = 0; i < MAXPCB; i++)
	{
		strcpy_s(pcbs[i].name, "");
		pcbs[i].status = 0;
		pcbs[i].time = 0;
		pcbs[i].privilege = 0;
		pcbs[i].finished = 0;
		pcbs[i].wait_time = 0;
	}
	quantity = 0;
}
//读数据函数 
int readData()
{
	FILE* fp;
	char fname[20];
	int i;
	cout << "请输入进程流文件名:";
	cin >> fname;
	if ((fp = fopen(fname, "r")) == NULL)
	{
		cout << "错误,文件打不开,请检查文件名" << endl;
	}
	else
	{
		while (!feof(fp))
		{
			fscanf_s(fp, "%s %d %d %d", pcbs[quantity].name, &pcbs[quantity].status,
				&pcbs[quantity].time, &pcbs[quantity].privilege);
			quantity++;
		} //输出所读入的数据 
		cout << "输出所读入的数据" << endl;
		cout << "进程名 进程状态 所需时间 优先数" << endl;
		for (i = 0; i < quantity; i++)
		{
			cout << " " << pcbs[i].name << " " << pcbs[i].status << " " << pcbs[i].time << " " << pcbs[i].privilege << endl;
		}
		return(1);
	}
	return(0);
}
//重置数据,以供另一个算法使用 
void init()
{
	int i;
	for (i = 0; i < MAXPCB; i++)
	{
		pcbs[i].finished = 0; pcbs[i].wait_time = 0;
	}
}
//先进先出算法 
void FIFO()
{
	int i, j; int total;
	//输出FIFO算法执行流 
	cout << endl << "*****************************************************" << endl;
	cout << "FIFO算法执行流:" << endl; cout << "进程名 等待时间" << endl;
	for (i = 0; i < quantity; i++)
	{
		cout << " " << pcbs[i].name << " " << pcbs[i].wait_time << endl;
		for (j = i + 1; j < quantity; j++)
		{
			pcbs[j].wait_time += pcbs[i].time;
		}
	}
	total = 0;
	for (i = 0; i < quantity; i++)
	{
		total += pcbs[i].wait_time;
	}
	cout << "总等待时间:" << total << " 平均等待时间:" << total / quantity << endl;
}
//优先数调度算法 
void privilege()
{
	int i, j, p;
	int passed_time = 0;
	int total;
	int queue[MAXPCB];
	int current_privilege = 1000;
	for (i = 0; i < quantity; i++)
	{
		current_privilege = 1000;
		for (j = 0; j < quantity; j++)
		{
			if ((pcbs[j].finished == 0) && (pcbs[j].privilege < current_privilege))
			{
				p = j;
				current_privilege = pcbs[j].privilege;
			}
		}
		queue[i] = p;
		pcbs[p].finished = 1;
		pcbs[p].wait_time += passed_time;
		passed_time += pcbs[p].time;
	}
	//输出优先数调度执行流 
	cout << endl << "***********************************************************" << endl;
	cout << "优先数调度执行流:" << endl;
	cout << "进程名 等待时间" << endl;
	for (i = 0; i < quantity; i++)
	{
		cout << " " << pcbs[queue[i]].name << " " << pcbs[queue[i]].wait_time << endl;
	}
	total = 0;
	for (i = 0; i < quantity; i++)
	{
		total += pcbs[i].wait_time;
	}
	cout << "总等待时间:" << total << " 平均等待时间:" << total / quantity << endl;
}
//时间片轮转调度算法 
void timer()
{
	int i, j, number, flag = 1;
	int passed_time = 0;
	int max_time = 0;
	int round = 0;
	int queue[1000];
	int total = 0;
	while (flag == 1)
	{
		flag = 0;
		number = 0;
		for (i = 0; i < quantity; i++)
		{
			if (pcbs[i].finished == 0)
			{
				number++; j = i;
			}
		}
		if (number == 1)
		{
			queue[total] = j; total++; pcbs[j].finished = 1;
		}
		if (number > 1)
		{
			for (i = 0; i < quantity; i++)
			{
				if (pcbs[i].finished == 0)
				{
					flag = 1;
					queue[total] = i;
					total++;
					if (pcbs[i].time <= block_time * (round + 1))
					{
						pcbs[i].finished = 1;

					}
				}
			}
		}
		round++;
	}
	if (queue[total - 1] == queue[total - 2])
	{
		total--;
	}
	cout << endl << "*******************************************************" << endl;
	cout << "时间片轮转调度执行流:" << endl;
	for (i = 0; i < total; i++)
	{
		cout << pcbs[queue[i]].name << " ";
		cout << endl;
	}
}
//显示
void version()
{
	cout << "   /********************* 进程调度 ********************/ ";
	cout << endl << endl;
}
//主函数 
void main()
{
	int flag;
	version();
	initial();
	flag = readData();
	if (flag == 1)
	{
		FIFO();
		init();
		privilege();
		init();
		timer();
	}
}

进程流文件创建和使用

  1. **创建进程流文件:**可以使用记事本或其他文本编辑器,将数据按照指定格式保存为文本文件(例如1.txt)。文件应该放在程序文件所在的文件夹内。
  2. 文件格式: 每个进程包括四个数据项,用空格隔开:
    • 进程名
    • 进程状态 (1: 就绪, 2: 等待, 3: 运行)
    • 所需时间
    • 优先数 (0级最高)
  3. 示例数据:
    进程0     1                           50    2
    进程1     2                           10    4
    进程2     1                           15    0
    进程3     3                           28    5 
    进程4     2                           19    1
    进程5     3                           8     7
    
  4. **输入文件名:**运行程序时,在提示输入进程流文件名时,输入文件名及后缀名(例如1.txt)。程序会自动读取同文件夹内的文件。

运行结果

程序运行后会输出每种算法的进程执行流、总等待时间和平均等待时间。

总结

本程序提供了一个简单的进程调度算法实现示例,帮助用户理解三种常见的进程调度算法的工作原理。用户可以通过修改代码和进程流文件来进行不同的测试和实验。

C++ 进程调度算法实现:FIFO、优先级调度和时间片轮转

原文地址: https://www.cveoy.top/t/topic/nZH5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录