计算机操作系统实验-进程调度算法(自己学习使用)

本文详述了计算机操作系统中四种进程调度算法的实践,包括链表队列的初始化和输出、先来先服务(FCFS)算法、时间片轮转调度以及短作业优先(SJF)算法的模拟实现,旨在深入理解操作系统中的进程管理。
摘要由CSDN通过智能技术生成

1、链表操作:实现链表队列的初始化和输出。

//stu00.c 作业初始化及输出基本操作,程序模板,由学生完成缺失代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TASK_COUNT 5
int iArrivePoint[TASK_COUNT] = { 0,1,2,3,4 };
int iTaskLen[TASK_COUNT] = { 4,3,5,2,4 };
char cPname[TASK_COUNT] = { 'A','B','C','D','E' };
//PCB节点链的定义
typedef struct _Pcb {
	int pid;      //进程ID
	int arriveP;  //到达时间点
	int taskLen;  //任务总时长
	int beginP;   //任务开始时间点
	int finishP;  //任务完成时间点
	int remains;  //未执行的时长
	char cPname;//进程名称
	int priority; //优先级
	struct _Pcb * next;
}PCB;

//初始化PCB队列
PCB* InitPcbQue()
{
	PCB* headOfPcb = NULL;
	PCB* curPcbNode;
	int i, indexP;
	//**************begin**********代码约十二行********/	
	//在循环结构中创建节点并加入到链表中 
	//最终链表中进程顺序为A、B、C、D、E 
	for (i = 0; i < TASK_COUNT; i++)
	{
		curPcbNode = (PCB*)malloc(sizeof(PCB));
		indexP = TASK_COUNT - i - 1;
		curPcbNode->pid = indexP;
		curPcbNode->arriveP = iArrivePoint[indexP];
		curPcbNode->taskLen = iTaskLen[indexP];
		curPcbNode->remains = iTaskLen[indexP];
		curPcbNode->cPname = cPname[indexP];
		curPcbNode->finishP=0;
		curPcbNode->next = headOfPcb;
		headOfPcb = curPcbNode;
	}
	///***********************end*****************/ 
	return headOfPcb;
}
//输出链表信息
void PrintPcbQue(PCB* headPcb)
{
	PCB* curPcb;
	curPcb = headPcb;
	//不能直接使用headPcb节点输出,会改变链表结构
	/**************begin**********代码约五行********/	
	//在循环结构中输出节点信息  
	//输出:A:4,B:3,C:5,D:2,E:4,
	while(curPcb!=NULL)
	{
		printf("%C:%d,", curPcb->cPname, curPcb->taskLen);
		curPcb = curPcb->next;
	}
	
	//***********************end*****************/ 
	return;
}

//清空队列
void ClearPcbQue(PCB* headPcb)
{
	PCB* onePcb;
	//**************begin**********代码约五行********	
	//在循环结构中释放节点内存  
	while(headPcb!=NULL){
		onePcb=headPcb;
		headPcb=headPcb->next;
		free((void*)onePcb);
		
	}

	
	
	//***********************end*****************/ 
}

int main()
{
	PCB * pHead=NULL;
	pHead=InitPcbQue();
	PrintPcbQue(pHead); 
	ClearPcbQue(pHead); 
	return 0;
}

2、先来先服务:编写模拟进程调度的先来先服务程序

//stu01.c FCFS进程调度算法,程序模板,由学生完成缺失代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TASK_COUNT 5
int iArrivePoint[TASK_COUNT] = { 0,1,2,3,4 };
int iTaskLen[TASK_COUNT] = { 4,3,5,2,4 };
char cPname[TASK_COUNT] = { 'A','B','C','D','E' };


//PCB节点链的定义
typedef struct _Pcb {
	int pid;      //进程ID
	int arriveP;  //到达时间点
	int taskLen;  //任务总时长
	int beginP;   //任务开始时间点
	int finishP;  //任务完成时间点
	int remains;  //未执行的时长
	char cPname;//进程名称
	int priority; //优先级
	struct _Pcb * next;
}PCB;

//初始化PCB队列
PCB* InitPcbQue()
{
	PCB* headOfPcb = NULL;
	PCB* curPcbNode;
	int i, indexP;
	for (i = 0; i < TASK_COUNT; i++)
	{
		curPcbNode = (PCB*)malloc(sizeof(PCB));
		//注意链表操作时最先入链的会排在最后。
		indexP = TASK_COUNT - i - 1;
		curPcbNode->pid = indexP;
		curPcbNode->arriveP = iArrivePoint[indexP];
		curPcbNode->taskLen = iTaskLen[indexP];
		curPcbNode->remains = iTaskLen[indexP];
		curPcbNode->cPname = cPname[indexP];
		curPcbNode->next = headOfPcb;
		headOfPcb = curPcbNode;
	}
	//printf("InitPcbQue finished.\n");
	return headOfPcb;
}
//输出链表信息
void PrintPcbQue(PCB* headPcb)
{
	PCB* curPcb;
	curPcb = headPcb;
	//不能直接使用headPcb节点输出,会改变链表结构
	while (curPcb != NULL)
	{
		printf("%C:%d,", curPcb->cPname, curPcb->finishP);
		curPcb = curPcb->next;
	};
	return;
}



//清空队列
void ClearPcbQue(PCB* headPcb)
{
	PCB* onePcb;
	while (headPcb != NULL)
	{
		onePcb = headPcb;
		headPcb = headPcb->next;
		free((void *)onePcb);
	}
}



PCB* headInitPcb; 
int FCFS()
{   //先来先服务
	//请在begin end语句间补全程序语句实现短作业优行算法调度进程 
	//*  begin *******************程序代码约11行******************************* */
	//对进程序列进行排序
	int totalTaskLen = 0;
	headInitPcb &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值