操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)_c语言程序编程模拟三个用户进程,它们的优先级从高到低分别为 p1,p2,p3,它们需要打(3)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

根据新的更高优先级进程能否抢占正在执行的进程,可将该调度算法分为两类:

1)非抢占式优先级调度算法

当一个进程正在处理机上运行时,即使有某个优先级更高的进程进入就绪队列,仍让正在执行的进程继续执行下去,直到因为其自身的原因(任务完成或者发生等待事件),这才把处理机的使用权分配给其它优先级更高的进程

2)抢占式优先级调度算法

顾名思义,当有一个优先级更高的进程进入就绪队列时,立即暂停正在执行的进程,将处理机的使用权分配给优先级更高的进程,等其执行完毕方可继续执行本进程

优先级分类

根据进程创建后其优先级是否可以改变,可以将进程优先级分为一下两类:

1)静态优先级

优先级是在创建进程时就已经被确定的,且在进程运行的整个期间保持不变。主要根据进程类型、进程对资源的要求、用户的要求来确定静态优先级

2)动态优先级

在进程的运行过程中,根据进程情况的变化动态调整优先级。主要根据进程占有CPU时间的长短、就绪进程等待CPU时间的长短来确定动态优先级


实验内容与要求

进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。本实验可加深对进程调度算法的理解。实验内容如下:

  • 设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
  • 模拟调度程序可选择优先级调度算法或者时间片轮转调度算法
  • 程序执行中应能在屏幕上显示出各进程的状态变化
  • 使用C/C++语言进行模拟

实验步骤

调度算法总流程图

优先级调度算法流程图

实验代码

进程控制块PCB结构体如下:

typedef struct pcb{
	int id;//进程的ID
	int prior;//进程的优先级,允许为负,规定:-20表示进程已完成
	int used;//已经使用的时间片
	int need;//还需要的时间片
	char status;//进程的状态  R,J,F分别表示进程正在运行、进程就绪、进程完成 
}PCB;

完整代码:

/*
操作系统,进程调度算法的模拟
按照优先级算法进行进程调度 
*/ 
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include<ctime>
//定义进程控制块PCB的结构体
typedef struct pcb{
	int id;//进程的ID
	int prior;//进程的优先级
	int used;//已经使用的时间片
	int need;//还需要的时间片
	char status;//进程的状态  R,J,F分别表示进程正在运行、进程就绪、进程完成 
}PCB;
PCB *head,p[5];

//打印显示输出进程
void print(){
	printf("-----------------------------------------------------\n");
	printf("进程ID\t优先级\t已使用的时间片\t还需时间片\t状态\n");
	for(int j=0;j<5;j++){
		printf("%d\t  %d\t  %d\t\t  %d\t\t %c\n",p[j].id,p[j].prior,p[j].used,p[j].need,p[j].status);
	}
} 

//使用冒泡算法按照优先级降序排列
void sort(){
	for(int i=0;i<5;i++){
		for(int j=0;j<4;j++){
			if(p[j].prior<p[j+1].prior){
				PCB temp=p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
} 

//初始化进程队列
void inputprocess(){
	srand(time(0));//为随机数产生种子
	 //依次先为每一个进程p[i]初始化 
	for(int i=0;i<5;i++){
		p[i].id=i+1;
		p[i].prior=1+rand()%5;//生成1~5的随机数作为各个进程的优先级
		p[i].used=0;
		p[i].need=1+rand()%5;//总时间片 
		p[i].status='J';//初始化为就绪态 
	} 
	sort();//按照优先级进行排序
	head=p;
	printf("开始进程的状态:\n");
	print();//打印进程的状态 
} 

按照最高优先级优先调用来调用进程队列
void runprocess(){
	PCB *p1=NULL;
	do{
	  p1=head;
	  head=p+1;
	//根据优先级调度原则,判断队列的队首进程是否能够运行
	while(p1->need>0&&p1->prior>=head->prior){


![img](https://img-blog.csdnimg.cn/img_convert/9e96367dc160c8fd38e04aba0561af45.png)
![img](https://img-blog.csdnimg.cn/img_convert/646b75e909377fe853cbab262ed40d66.png)
![img](https://img-blog.csdnimg.cn/img_convert/0d3e78b1e20c7984aa9f5c82cf9c6c6e.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是优先级调度算法的 C 语言源代码实现: ``` #include<stdio.h> //进程控制块 struct process { int pid; //进程 ID int arrival_time; //到达时间 int burst_time; //执行时间 int priority; //优先级 }; int main() { int n, i, j, total_wait_time = 0, total_turnaround_time = 0; struct process p[10], temp; float avg_wait_time, avg_turnaround_time; //输入进程数 printf("Enter the number of processes: "); scanf("%d", &n); //输入每个进程的到达时间、执行时间和优先级 for(i = 0; i < n; i++) { printf("Enter arrival time, burst time and priority for process %d: ", i + 1); scanf("%d %d %d", &p[i].arrival_time, &p[i].burst_time, &p[i].priority); p[i].pid = i + 1; } //按照优先级进程进行排序 for(i = 0; i < n - 1; i++) { for(j = i + 1; j < n; j++) { if(p[i].priority > p[j].priority) { temp = p[i]; p[i] = p[j]; p[j] = temp; } } } //计算等待时间和周转时间 total_wait_time = 0; for(i = 0; i < n; i++) { total_wait_time += total_turnaround_time - p[i].arrival_time; total_turnaround_time += p[i].burst_time; } //计算平均等待时间和平均周转时间 avg_wait_time = (float)total_wait_time / n; avg_turnaround_time = (float)total_turnaround_time / n; //输出结果 printf("\nProcess\tArrival Time\tBurst Time\tPriority\tWait Time\tTurnaround Time\n"); for(i = 0; i < n; i++) { printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", p[i].pid, p[i].arrival_time, p[i].burst_time, p[i].priority, total_turnaround_time - p[i].arrival_time - p[i].burst_time, total_turnaround_time - p[i].arrival_time); } printf("\nAverage Wait Time: %.2f\n", avg_wait_time); printf("Average Turnaround Time: %.2f\n", avg_turnaround_time); return 0; } ``` 注意:该代码仅为示例,可能存在错误或不完善之处,仅供参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值