C语言简单实现进程调度算法

本文介绍了四种基本的进程调度算法:FCFS先进先出、短进程优先、优先级调度和时间片轮转,并使用C语言进行了简单实现。通过这些算法,可以理解操作系统如何决定进程执行的顺序。文章末尾欢迎读者指正不足。
摘要由CSDN通过智能技术生成

 

实验原理:

 

FCFS:先进先出算法,进程调度按照进程来的先后顺序进行调度,先来的进程先执行,后来的进程后执行。

短进程优先算法:进程调度按照作业的大小,也就是进程需要的服务时间进行调度,当多个进程都需要获得处理机时,服务时间短的进程优先获得处理机。

优先级算法:进程调度按照进程的优先级进行调度,当多个进程阻塞,处理机空闲时选择优先级最高的进程进行分配。

时间片轮转算法:每个进程执行一个时间片单位后释放处理机,由下一个进程继续执行一个时间片单位。进程间轮流获得处理机。

/*
此程序均 假设采用多道OS ,只有进程调度,以及采用非抢占的方式
*/
#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
#define MAX 10
int N;   //进程个数
int timeSliceLength; //时间片长短

typedef struct PCB
{
	char proName; //进程名
	int enTime; //进入时间
	int seTime; //服务时间
	int priority; //优先级; 数值越大,优先级越高
	int startTime; //开始时间
	int endTime;//结束时间
	int turn;//周转时间
	int averTurn; //平均周转时间
	//struct PCB* next;
}PCB;

typedef struct NODE
{
	int m;
	struct NODE* next;

}Intt;
//----------排序用到的结构和函数----------
typedef struct
{
	PCB r[MAX+1];
	int length;
}List;

void swap(List* L,int i,int j)
{
	char tempName;
	int tempEntime;
	int tempSEtime;
	int tempPriority;
	int tempStartTime;
	int tempEndTime;
	int tempTurn;
	int tempAverTurn;

	
	tempName= L->r[i].proName ;
	L->r[i].proName  = L->r[j].proName ;
	L->r[j].proName =tempName ;

	tempEntime= L->r[i].enTime ;
	L->r[i].enTime  = L->r[j].enTime ;
	L->r[j].enTime =tempEntime ;

	tempSEtime= L->r[i].seTime ;
	L->r[i].seTime  = L->r[j].seTime ;
	L->r[j].seTime =tempSEtime ;

	tempPriority= L->r[i].priority ;
	L->r[i].priority  = L->r[j].priority ;
	L->r[j].priority =tempPriority ;

	tempStartTime= L->r[i].startTime ;
	L->r[i].startTime  = L->r[j].startTime ;
	L->r[j].startTime =tempStartTime ;

	tempEndTime= L->r[i].endTime ;
	L->r[i].endTime  = L->r[j].endTime ;
	L->r[j].endTime =tempEndTime ;

	tempTurn= L->r[i].turn ;
	L->r[i].turn  = L->r[j].turn ;
	L->r[j].turn =tempTurn ;

	tempAverTurn= L->r[i].averTurn ;
	L->r[i].averTurn  = L->r[j].averTurn ;
	L->r[j].averTurn =tempAverTurn ;

}

//-------------------初始化---------------------
List* init(int m)
{
	List* arr;
	int i;
	i=0;
	arr= (List *)malloc(sizeof(List));
//	arr1=arr2=(PCB*)malloc(sizeof(PCB));
	
	for(i;i<m;i++)
	{
		arr->r[i].proName ='a';
		arr->r[i].enTime =0;
		arr->r[i].seTime =0;
		arr->r[i].priority =0;
		arr->r[i].startTime =0;
		arr->r[i].endTime =0;
		arr->r[i].turn =0;
		arr->r[i].averTurn =0;

	}
	arr->length =0;

	return arr;
}

void creat(int m,List* arr)
{
	int i;
	i=0;
//	arr= (List *)malloc(sizeof(List));
//	arr->length =0;
//	arr1=arr2=(PCB*)malloc(sizeof(PCB));
	
	for(i;i<m;i++)
	{
		
		//arr->r[MAX] =(PCB*)malloc(MAX*sizeof(PCB));
		printf("请输入第%d个进程的信息:\n",i+1);
		scanf("%c%d%d%d",&arr->r[i].proName,&arr->r[i].enTime,&arr->r[i].seTime,&arr->r[i].priority);
		fflush(stdin);
		(arr->length)++;
		//printf("%c,%d,%d,%d\n",arr1->proName,arr1->enTime,arr1->seTime,arr1->priority);
		
		//scanf("%d",&arr->enTime);
	/*	if(i==0)
			arr = arr1;
		else
			arr2->r[i].next = &(arr1->r[i]);
		arr2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值