使用C语言二维数组实现进程调度,先来先服务和时间片轮转发

① 设计PCB及其数据结构:

    进程标识数:ID

    进程优先数:PRIORITY(优先数越大,优先级越高)

    进程已占用时间片:CPUTIME,每得到一次调度,值加1;

    进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,ALLTIME为0)

    进程队列指针:NEXT,用来将PCB排成队列

    进程状态:STATE(一般为就绪,可以不用)

② 设计进程就绪队列及数据结构;

③ 设计进程调度算法,并画出程序流程图;

④ 设计输入数据和输出格式;

   结构格式:当前正运行的进程:0

             当前就绪队列:2,1,3,4

⑤ 编程上机,验证结果。

#pragma once
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
//定义结构体
typedef struct pcb
{
	int id;
	unsigned int arrivetime;
	unsigned int alltime;
	unsigned int usetime;
	int finishtime;
}pcb;  //初始化执行表,和就绪表
//根据到达时间排序
void listsorted(pcb list[]) {
	int i=0,j=0;
	pcb temp[1];
	for (i; i < 5; i++) {
		for (j=i+1 ; j < 5; j++) {
			if (list[j].arrivetime < list[i].arrivetime) {
				temp[0] = list[i];
				list[i] = list[j];
				list[j] = temp[0];
			}
		}
	}
}
//输出先来先服务
void listprint(pcb list[], int i)
{
	printf("\n正在执行的进程:\n");
	cout << "进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
	cout << int(list[0].id )<< "\t\t" << int(list[0].arrivetime) << "\t\t" << list[0].alltime << "\t\t" << list[0].usetime << "\t\t\t" << list[0].finishtime << endl;

	printf("\n排队进程:\n");
	cout << "\t\t进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
	for (int t = 0; t < i; t++) {
		if (list[t].finishtime == 0) {
			cout << "\t\t" << list[t].id << "\t\t" << list[t].arrivetime << "\t\t" << list[t].alltime << "\t\t" << list[t].usetime << "\t\t\t" << list[t].finishtime << endl;
		}
	}
}

// 使用先来先服务算法,根据到达时间的先后顺序对进程进行调度
void Fifo(pcb pcblist[],int &listtime,int i) {
	listsorted(pcblist);
	
	pcblist[0].finishtime = pcblist[0].arrivetime + pcblist[0].alltime;
	pcblist[0].usetime = pcblist[0].alltime;
	listtime += pcblist[0].usetime;
	listprint(pcblist, i);
	pcblist[0].arrivetime = -99;
	
}



#pragma once
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
//定义结构体
typedef struct pcb
{
	int id;
	unsigned int arrivetime;
	unsigned int alltime;
	unsigned int usetime;
	int finishtime;
}pcb;  //初始化执行表,和就绪表
//根据到达时间排序
void listsorted(pcb list[]) {
	int i=0,j=0;
	pcb temp[1];
	for (i; i < 5; i++) {
		for (j=i+1 ; j < 5; j++) {
			if (list[j].arrivetime < list[i].arrivetime) {
				temp[0] = list[i];
				list[i] = list[j];
				list[j] = temp[0];
			}
		}
	}
}
//输出先来先服务
void listprint(pcb list[], int i)
{
	printf("\n正在执行的进程:\n");
	cout << "进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
	cout << int(list[0].id )<< "\t\t" << int(list[0].arrivetime) << "\t\t" << list[0].alltime << "\t\t" << list[0].usetime << "\t\t\t" << list[0].finishtime << endl;

	printf("\n排队进程:\n");
	cout << "\t\t进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
	for (int t = 0; t < i; t++) {
		if (list[t].finishtime == 0) {
			cout << "\t\t" << list[t].id << "\t\t" << list[t].arrivetime << "\t\t" << list[t].alltime << "\t\t" << list[t].usetime << "\t\t\t" << list[t].finishtime << endl;
		}
	}
}

// 使用先来先服务算法,根据到达时间的先后顺序对进程进行调度
void Fifo(pcb pcblist[],int &listtime,int i) {
	listsorted(pcblist);
	
	pcblist[0].finishtime = pcblist[0].arrivetime + pcblist[0].alltime;
	pcblist[0].usetime = pcblist[0].alltime;
	listtime += pcblist[0].usetime;
	listprint(pcblist, i);
	pcblist[0].arrivetime = -99;
	
}
#pragma once
// ConsoleApplication6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
//定义结构体
typedef struct pcb
{
	int id;
	unsigned int arrivetime;
	unsigned int alltime;
	unsigned int usetime;
	int finishtime;
}pcb;  //初始化执行表,和就绪表
//根据到达时间排序
void listsorted(pcb list[]) {
	int i=0,j=0;
	pcb temp[1];
	for (i; i < 5; i++) {
		for (j=i+1 ; j < 5; j++) {
			if (list[j].arrivetime < list[i].arrivetime) {
				temp[0] = list[i];
				list[i] = list[j];
				list[j] = temp[0];
			}
		}
	}
}
//输出先来先服务
void listprint(pcb list[], int i)
{
	printf("\n正在执行的进程:\n");
	cout << "进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
	cout << int(list[0].id )<< "\t\t" << int(list[0].arrivetime) << "\t\t" << list[0].alltime << "\t\t" << list[0].usetime << "\t\t\t" << list[0].finishtime << endl;

	printf("\n排队进程:\n");
	cout << "\t\t进程ID\t\t到达时间\t需求时间\t使用cup时间 \t\t完成时间" << endl;
	for (int t = 0; t < i; t++) {
		if (list[t].finishtime == 0) {
			cout << "\t\t" << list[t].id << "\t\t" << list[t].arrivetime << "\t\t" << list[t].alltime << "\t\t" << list[t].usetime << "\t\t\t" << list[t].finishtime << endl;
		}
	}
}

// 使用先来先服务算法,根据到达时间的先后顺序对进程进行调度
void Fifo(pcb pcblist[],int &listtime,int i) {
	listsorted(pcblist);
	
	pcblist[0].finishtime = pcblist[0].arrivetime + pcblist[0].alltime;
	pcblist[0].usetime = pcblist[0].alltime;
	listtime += pcblist[0].usetime;
	listprint(pcblist, i);
	pcblist[0].arrivetime = -99;
	
}





#pragma once


//排序,row行数,m根据某一列排序
void sorted(int a[5][5], int row, int m)
{
	int n,j,t;
	int temp[10];
	for (n = 0; n < row - 1; n++) {
		for (j = n + 1; j < row; j++)
			if (a[j][m] > a[n][m])
			{
				for (t = 0; t < row ; t++) {
					temp[t] = a[n][t];
					a[n][t] = a[j][t];
					a[j][t] = temp[t];
				}
			}
	}
}
//打印元素a二维数组,
void print_f(int a[][5],int row,int column,string s[])
{	
	int n, m;
	printf("\n\n\t\t\t各进程状态\n");
	cout <<s[0]<<"\t\t" << s[1]<<"\t" << s[2] << "\t\t" << s[3] << "\t\t" << s[4];
	printf("\n");
	for (n = 0; n < row; n++) {
		for (m = 0; m < column; m++) {
			printf("%d\t\t",a[n][m]);
			if (m == column - 1) printf("\n");
		}
	}
}
//调度算法,a二维数组,row行键,column列键,arr就绪队列
void process_manege(int a[][5],int row,int column, int* arr,int &arr_count)
{	
	int check, temp_i = 0, id_count = 0;
	int temp[5] = { -1,-1,-1,-1,-1 };
	for (check = 0; check < row; check++) {
		if (a[check][4] == 0) {         //判断进程是否结束
			printf("\n第%d号进程已结束", a[check][0]);
			for (int m = 1; m < column-1; m++)	a[check][m] = -99;
			//arr_count = arr_count-1;
		}
	}
	sorted(a, row, 1);
	for (id_count ,temp_i; id_count <row;id_count++) //添加至就绪队列
	{
		if (a[id_count][4] != 0) {
			temp[temp_i] = a[id_count][0];
			temp_i++;
		}
		arr = temp;
	}
	printf("\n当前正运行的进程:%d",arr[0]);
	printf("\n当前就绪队列:");
	for (int state_id = 1; state_id < row;state_id++)  
		printf(" %d ", arr[state_id]);
	a[0][1]-=3,a[0][2]+=1,a[0][3]-=1;     //对正在运行进程进行更改
	if (a[0][3] == 0) { a[0][4] = 0; arr_count = arr_count - 1; }
}


#include<string>
using namespace std;
#include <iostream>
#include "标头.h"
#include "标头1.h"

int main1()
{	
	int timepip = 2;
	
	int row=5;     //进程数
	int column = 5;//属性数
	int arr[5] = { NULL };//就绪队列
	int arr_count = 5;    //计数arr里元素个数
	int flag = 1;
	//初始化静态数组,ID,PRIORITY,CPUTIME,ALLTIME,STATE(ready=1,finish=0)
	string pcb[15] = { "ID","PRIORITY","CPUTIME","ALLTIME","STATE" };
	int process_id[5][5] = { { 0,9,0,3,1 },{ 1,38,0,2,1 }, { 2,30,0,6,1 }, { 3,29,0,3,1 },{ 4,0,0,4,1 } };
	printf("初始进程队列\n");
	print_f(process_id, row, column, pcb);
	printf("\n");
	while (flag) {
		printf("已用时间:%ds", timepip);
		process_manege(process_id, row, column, arr,arr_count);
		printf("\t剩余进程%d个",arr_count);
		print_f(process_id, row, column, pcb);
		timepip += 2;
		if(arr_count == 0) flag = 0;
		printf("\n\n");
	}
	return 0;
}

int main2()
{	
	int listtime = 0;
	int i = 5,j =5;  //i=j表示进程个数
	pcb pcblist[5] = { NULL };
	pcblist[0].id = 1, pcblist[0].arrivetime = 4, pcblist[0].alltime = 4, pcblist[0].usetime = 0, pcblist[0].finishtime = 0;
	pcblist[1].id = 2, pcblist[1].arrivetime = 9, pcblist[1].alltime = 6, pcblist[1].usetime = 0, pcblist[1].finishtime = 0;
	pcblist[2].id = 3, pcblist[2].arrivetime = 1, pcblist[2].alltime = 45, pcblist[2].usetime = 0, pcblist[2].finishtime = 0;
	pcblist[3].id = 4, pcblist[3].arrivetime = 3, pcblist[3].alltime = 5, pcblist[3].usetime = 0, pcblist[3].finishtime = 0;
	pcblist[4].id = 5, pcblist[4].arrivetime = 2, pcblist[4].alltime = 22, pcblist[4].usetime = 0, pcblist[4].finishtime = 0;
	
	while (j>0)
	{	
		Fifo(pcblist, listtime, i);
		printf("总花销时间:%d\n\n",listtime);
		j--;
	}
	return 0;
}

int main()
{
	printf("使用优先级时间片算法:\n");
	main2();
	printf("使用先来先服务算法:\n");
	main1();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值