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

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

#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;
}


  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统中常用的动态优先级进程调度算法包括Round-Robin算法、最短进程优先(SPN)算法、最短剩余时间优先(SRTN)算法等等。下面是一个使用Round-Robin算法的进程调度程序示例,使用C语言编写: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_PROCESS_NUM 10 // 最大进程 #define TIME_QUANTUM 4 // 时间片长度 typedef struct Process { char name[10]; // 进程名 int arrival_time; // 到达时间 int burst_time; // 运行时间 int priority; // 优先级 int remaining_time; // 剩余时间 } Process; int main() { int n; // 进程 Process processes[MAX_PROCESS_NUM]; int current_time = 0; // 当前时间 int completed_num = 0; // 已完成的进程 int i, j; printf("请输入进程:"); scanf("%d", &n); for(i = 0; i < n; i++) { printf("请输入第%d个进程的信息:\n", i + 1); printf("进程名:"); scanf("%s", processes[i].name); printf("到达时间:"); scanf("%d", &processes[i].arrival_time); printf("运行时间:"); scanf("%d", &processes[i].burst_time); printf("优先级:"); scanf("%d", &processes[i].priority); processes[i].remaining_time = processes[i].burst_time; } while(completed_num < n) { int min_priority = 10000; // 最小优先级 int min_priority_index = -1; // 最小优先级进程的下标 // 找到当前时间所有已到达的进程中优先级最高的进程 for(i = 0; i < n; i++) { if(processes[i].arrival_time <= current_time && processes[i].remaining_time > 0 && processes[i].priority < min_priority) { min_priority = processes[i].priority; min_priority_index = i; } } // 如果当前时间没有已到达的进程,则时间加一 if(min_priority_index == -1) { current_time++; continue; } // 运行当前进程 printf("当前时间:%d,运行进程:%s\n", current_time, processes[min_priority_index].name); processes[min_priority_index].remaining_time -= TIME_QUANTUM; current_time += TIME_QUANTUM; // 判断当前进程是否已完成 if(processes[min_priority_index].remaining_time <= 0) { completed_num++; printf("当前时间:%d,进程:%s已完成\n", current_time, processes[min_priority_index].name); } } return 0; } ``` 该程序中使用了Round-Robin算法,通过循环遍历所有已到达的进程中优先级最高的进程来选择要运行的进程。运行进程时每次使用固定长度的时间片,当进程剩余时间小于等于0时即表示该进程已完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值