操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

这篇具有很好参考价值的文章主要介绍了操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

优先级调度算法介绍

两种情况

调度算法分类

优先级分类

实验内容与要求

实验步骤

调度算法总流程图

 优先级调度算法流程图

 实验代码

实验结果


优先级调度算法介绍

        优先级调度算法既可以用于作业调度,又可以用于进程调度。该算法中的优先级用于描述作业或者进程的紧迫程度,主要思想是每次选取优先级最高的进程或者作业,将资源或者处理机分配给它使用。

两种情况

  • 在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的一个或者几个作业,将它们存入调入内存,分配必要的资源,创建进程并放入就绪队列。
  • 在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。

调度算法分类

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

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

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

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

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

优先级分类

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

1)静态优先级

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

2)动态优先级

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


实验内容与要求

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

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

实验步骤

调度算法总流程图

操作系统实验一模拟优先级调度算法(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){
		p1->need--;
		p1->prior--;
		p1->status='R';
		p1->used++;
		print();
	}
	//如果进程总的时间片已经用完,一律将其进程的优先级设置为-20,状态为已完成
	if(p1->need==0){
		p1->prior=-20;
		p1->status='F';
	} else{
		p1->status='J';
	} 
	sort();//再次排序为下一次运行做准备
	head=p;
    }while(head->prior!=-20);
    print();
	printf("-----------------------------------------------------\n");
	printf("所有的进程已执行完毕!");
}
int main(){
	inputprocess();
	runprocess();
	return 0;
}

实验结果

操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

 操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

另外,模拟时间片轮转算法可以看一下这篇文章:模拟时间片轮转算法

操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

看完了吧,记得点赞哦!(doge)文章来源地址https://www.toymoban.com/news/detail-430155.html

到了这里,关于操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STL】优先级队列剖析及模拟实现

    ✍ 作者 : 阿润菜菜 📖 专栏 : C++ 优先队列是一种 容器适配器 ,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的(默认大堆)。优先级队列的内部实现通常是用 堆 来维护元素的优先级,使得每次出队的元素都是当前队列中优先级最高的元素。 优先

    2023年04月22日
    浏览(39)
  • 优先级队列priority_queue模拟实现

    🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【C++的学习】 📝📝本篇内容:C++容器优先级队列priority_queue模拟实现 ⬆⬆⬆⬆上一篇:string模拟实现 💖💖作者简介:轩情吖,请多多指教( •̀֊•́ ) ̖́- ①优先级队列是一种容器适配器,它的第一个元素总是

    2024年02月02日
    浏览(37)
  • 【C++】优先级队列的基本概念以及其模拟实现

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! C++仿函数(function object)是一种可以像函数一样调用的对象。仿函数通常是一个类,它重载了函数调用运算符operator(),使得对象可以被调用。 仿函数就是基于函数模板生成

    2024年02月15日
    浏览(43)
  • [C++历练之路]优先级队列||反向迭代器的模拟实现

    W...Y的主页 😊  代码仓库分享💕 🍔前言: 在C++的宇宙中,优先队列似乎是一座巨大的宝库,藏匿着算法的珍宝。而就在这片代码的天空下,我们不仅可以探索优先队列的神奇,还能够揭开反向迭代器的神秘面纱。让我们一同踏入这个编程的探险之旅,在这里,我们将用C

    2024年02月04日
    浏览(47)
  • 【C++初阶】模拟实现优先级队列priority_queue

    👦个人主页:@Weraphael ✍🏻作者简介:目前学习C++和算法 ✈️专栏:C++航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨ 优先级队列顾名思义就是 按优先级出队列 priority_queue 是一个容器适配器,默认使用

    2024年02月10日
    浏览(36)
  • Java【优先级队列】详细图解 / 模拟实现 + 【PriorityQueue】常用方法介绍

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月07日
    浏览(46)
  • 【C++杂货铺】优先级队列的使用指南与模拟实现

    优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先级队列中位于顶部的元素)。 优先级队列被实现为容器适配器,容器适配器即将特定容器

    2024年02月09日
    浏览(41)
  • 【数据结构初阶】——第八节.优先级队列(小根堆的模拟实现)

     作者简介:大家好,我是未央; 博客首页: 未央.303 系列专栏:Java初阶数据结构 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 目录 文章目录 前言 引言 一、堆的概念 二、堆的性质  三、堆的操作 3.1 向下调整算法 3.2 小根堆的创建 3.3 向上调整

    2024年02月07日
    浏览(47)
  • 【c++】:“无敌的适配器来咯“栈和队列模拟实现以及优先级队列的模拟实现。

        文章目录 前言 一.栈和队列的模拟实现 二.优先级队列 总结   栈的介绍和使用: 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的,容器适配器即是对特定类封

    2024年02月01日
    浏览(32)
  • 不同语言操作符的优先级

    看到标题,可能会心生疑惑: 这么基础且重要的操作,不同语言不应该是一致的吗? 并不一定,比如对于右移运算和加法运算,Go就与其他多数语言表现得不一致: Go: Java: C/C++: nodejs: python: php: 本文由 mdnice 多平台发布

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包