【操作系统】C语言模拟操作系统优先数调度算法

本文介绍了一个简单的进程调度模拟程序,通过创建链表来管理进程,并实现了随机打乱进程优先级、初始化进程状态、运行进程等功能。该模拟程序展示了进程从创建到运行结束的整个生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——————————————————————————————————头文件———————————————————————————————————

#define _CRT_SECURE_NO_WARNINGS 1 
#ifndef _SCHEDULING_H__
#define _SCHEDULIHG_H__

#define N 5
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
typedef struct PCB       //封装进程结构体
{
	char name[2];
	int time;
	int prior_num;
	char state;
	struct PCB *next;
}PCB, *pPCB; //结构体名为PCB,pPCB是指向结构体的指针

pPCB CreateLink(PCB *arr);   //创建链表把5个进程链起来
void InitPCB(PCB *arr,int *a);   //初始化进程
pPCB runPCB(PCB *arr, pPCB pcb);  //进程运行
void printPCB(PCB *arr);           //输出进程的初始状态
void random(int a[], int n);        //将数组内容打乱顺序
void PrintRun(pPCB head);          //输出运行后的进程
#endif

——————————————————————————————————函数实现—————————————————————————————————

#include"head.h"


void random(int a[], int n)
{
	int index, tmp, i;
	srand((unsigned int)time(NULL));
	for (i = 0; i <n; i++)
	{
		index = rand() % (n - i) + i;
		if (index != i)
		{
			tmp = a[i];
			a[i] = a[index];
			a[index] = tmp;
		}
	}
}


pPCB CreateLink(PCB *arr)
{
	int i = 0;
	int j = 0;
	int pos = 0;
	int pos1 = 0;
	pPCB head = NULL;
	for (i = 0; i < N; i++)   //先找出优先级最高的进程,赋给头结点
	{
		if (arr[i].prior_num == N)
		{
			pos = i;
			break;
		}
	}
	head = &arr[pos];
	for (i = N - 1; i > 0; i--)    //按优先级大小依次找到其他进程,链起来
	{
		for (j = 0; j < N; j++)
		{
			if (arr[j].prior_num == i)
			{
				pos1 = j;
				break;
			}
		}
		arr[pos].next = &arr[pos1];
		pos = pos1;
	}
	return head;        //返回头结点
}


void InitPCB(PCB *arr,int *a)
{
	int i = 0;
	char *str[] = { "p1", "p2", "p3", "p4", "p5" };
	
	for (i = 0; i < N; i++)       //将5个进程初始化
	{
		strcpy(arr[i].name, str[i]);
		arr[i].prior_num = a[i];
		arr[i].state = 'R';
		arr[i].next = NULL;
		arr[i].time = (rand() % 4) + 1;  //这里将所需运行时间控制在4以内
	}
}


void printPCB(PCB *arr)      //打印进程最初状态
{
	int i = 0;
	for (i = 0; i < N; i++)
	{
		printf("进程名称:%s\n", arr[i].name);
		printf("进程优先级:%d\n", arr[i].prior_num);
		printf("进程所需运行时间:%d\n", arr[i].time);
		printf("进程当前状态:%c\n", arr[i].state);
		printf("\n");
	}
}


pPCB runPCB(pPCB head, pPCB pcb)   //进程执行函数
{
	int i = 0;
	pPCB cur=head;
	pPCB prev = NULL;
	while (cur)
	{
		
		cur->time--;         //先让进程的时间和优先级减一
		cur->prior_num--;
		
		if (cur->time == 0)    //判断所需运行时间是否为0
		{
			if (cur == head)    //判断是否是头结点
			{
				cur->state = 'E';
				head = head->next;
				cur = head;
			}
			else
			{
				cur->state = 'E';
				prev->next = cur->next;
				cur = cur->next;
			}
		}
		else       //若时间不为0,指针向后移动
		{
			prev = cur;
			cur = cur->next;
		}
	}
	return head;
}


void PrintRun(pPCB head)
{
	pPCB cur = head;
	printf("进程运行:\n");
	while (cur)
	{
		printf("进程名称:%s\n", cur->name);
		printf("进程优先级:%d\n", cur->prior_num);
		printf("所需运行时间:%d\n", cur->time);
		printf("当前状态:%c\n", cur->state);
		printf("\n");
		cur = cur->next;
	}
}

——————————————————————————————————主函数—————————————————————————————————

#include"head.h"


int main()
{
	PCB pcb;
	pPCB head;
	int a[] = { 1, 2, 3, 4, 5 };
	random(a, N);
	PCB arr[N];
	InitPCB(arr,a);
	printPCB(arr);
	head = CreateLink(arr);
	printf("运行一次:\n");
	head = runPCB(head, &pcb);
	PrintRun(head);
	printf("运行二次:\n");
	head = runPCB(head, &pcb);
	PrintRun(head);
	printf("运行三次:\n");
	head = runPCB(head, &pcb);
	PrintRun(head);
	getchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值