操作系统实验——处理机调度算法(C语言)

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

目录

实验要求

代码实现

运行结果

代码解析


 文章来源地址https://www.toymoban.com/news/detail-426743.html

实验要求

1、设定系统中进程数,每一个进程用一个进程控制块表示。

2、输入每个进程的“优先数”和“要求运行时间”。

3、为了调度方便,将进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程

4、处理机调度总是选队首进程运行。采用时间片轮转调度算法

5、若要求运行时间为零,则将其状态置为“结束”,且退出队列。

6、运行所设计程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。

操作系统实验——处理机调度算法(C语言)

代码实现

#include <stdio.h>
#define maxPCB 1000      //最大同时处理的进程个数
void PrintPCB(int n,int i);
void Sort(int n);
int Updatequeue(int n,int now);
int N;  	//n=N,记录初始进程块的数量 
int x=0;   	//x为已结束的进程数 
//定义一个结构体数组保存各个进程的信息
struct PCB{
	int id;
	//节点携带的数据
	int priority;    //优先级
	int time;    	 //处理机所需时间
	char state[1];   //状态
	char name[2];     //进程名
}PCB[maxPCB];

//初始化
void Init(int n)      
{
	int i;
	for(i=0;i<n;i++)  
	{
		PCB[i].id=i;
		PCB[i].state[0]='R';     //程序开始运行前,默认状态都为就绪态(Ready) 
		sprintf(PCB[i].name,"P%d",i);  //默认按P0-Pn的顺序存入进程名 
		printf("P%d的优先级为:",i);
		scanf("%d",&PCB[i].priority);//输入优先级
		printf("P%d的运行时间为:",i);
		scanf("%d",&PCB[i].time);    //输入运行时间
	}
	Sort(n);
	printf("\n按优先级从大到小进入队列后...\n");
	PrintPCB(n,0);  //打印初始排序后的队列 
}

//结果打印,用于打印结果
void PrintPCB(int n,int i)
{
	int t=n;
	int p;
	int c=n;
	printf("--------------------------------------\n");
	printf("进程名   优先数   要求运行时间   状态\n");
	while(c--)										//	按顺序打印已存在队列 
	{
		printf("  %c%c       %d\t      %d       \t   %c\t\n",PCB[i].name[0],PCB[i].name[1],PCB[i].priority,PCB[i].time,PCB[i].state[0]);
		i++;
		if(i==t) i=0;//计数满,清零 
	}
	printf("--------------------------------------\n");
	for(p=0;p<x;p++)								//打印出已经退出队列的进程,方便对比 
	{
		printf("  %c%c       %d\t      %d       \t   %c\t\n",PCB[p+N].name[0],PCB[p+N].name[1],PCB[p+N].priority,PCB[p+N].time,PCB[p+N].state[0]);
	}
	printf("--------------------------------------\n");
}

//选择排序
void Sort(int n)          
{
	int i,j,maxpriority,temp1,temp2;
	for(i=0;i<n;i++)
	{
		maxpriority=PCB[i].priority;
		for(j=i;j<n;j++)
		{
			if(maxpriority<PCB[j].priority)
			{
				
				maxpriority=PCB[j].priority;
				PCB[n]=PCB[i];
				PCB[i]=PCB[j];
				PCB[j]=PCB[n];				
			}
		}
	}
}


int Start(int temp)
{
	static now=0;						//静态变量now,作为指针进行+1轮转,保存上一次运行位置 
	//int temp;
	printf("P%d进程执行中....\n结果为:\n",PCB[now].id);
	PCB[now].time--;  					//执行一次,所需时间减1 
	if(PCB[now].time<=0)	PCB[now].state[0]='E';  //进程结束,置状态位为E,退出队列 
					
	if(PCB[now].time<=0)
	{
		temp=Updatequeue(temp,now);					
		now=0;										//删除队首后,now指针不需要动 
	}else	now++;									//如果没有更新,now指针+1 
	if(now==temp)						//计满清零
	{
		now=0;
	}
	PrintPCB(temp,now); //打印新的队列状态表 
	return temp;
}

//就绪队列更新 
int Updatequeue(int n,int now)
{
	int i;
	PCB[N+x]=PCB[now];
	printf("P%d结束运行,退出就绪队列\n\n",PCB[now].id);
	for(i=now;i<n-1;i++) 
	{
		PCB[i]=PCB[i+1];
	}
	n=n-1;				
	x++;
	return n;
}

//运行状态检查 
int Runcheck(int n)    //检查剩余进程状态位是否为'E',否则返回真 
{
	int i;
	for(i=0;i<n;i++)
	{
		if(PCB[i].state[0]=='R')   
		{
			return 1;
		}
	}
	return 0;
}

//启动函数 
void Run(int n)			
{
	while(Runcheck(n))	//反复检查进程,如果全为'E',则循环结束,算法结束 
	{
		n=Start(n);		//将返回新的进程个数作为实参继续传入函数 
	}
}
int main()
{
	int n;
	printf("请输入进程个数:") ;
	scanf("%d",&n);
	N=n; 
	Init(n);  
	Run(n);
	return 0; 
}

运行结果

程序运行结果如下

操作系统实验——处理机调度算法(C语言)

 状态位代表进程状态,R为就绪(Ready),E为结束(Exit)

代码解析

定义一个结构体数组用于存放数据(这里也可以使用一个链表来实现)

struct PCB{
	int id;
	//节点携带的数据
	int priority;    //优先级
	int time;    	 //处理机所需时间
	char state[1];   //状态
	char name[2];     //进程名
}PCB[maxPCB];

 初始化函数,提示用户输入并从键盘读入进程信息

void Init(int n)      
{
	int i;
	for(i=0;i<n;i++)  
	{
		PCB[i].id=i;
		PCB[i].state[0]='R';     //程序开始运行前,默认状态都为就绪态(Ready) 
		sprintf(PCB[i].name,"P%d",i);  //默认按P0-Pn的顺序存入进程名 
		printf("P%d的优先级为:",i);
		scanf("%d",&PCB[i].priority);//输入优先级
		printf("P%d的运行时间为:",i);
		scanf("%d",&PCB[i].time);    //输入运行时间
	}
	Sort(n);
	printf("\n按优先级从大到小进入队列后...\n");
	PrintPCB(n,0);  //打印初始排序后的队列 
}

结果打印,传入的两个参数分别为在就绪队列中进程的个数和已退出运行的进程的个数,控制打印次数

void PrintPCB(int n,int i)
{
	int t=n;
	int p;
	int c=n;
	printf("--------------------------------------\n");
	printf("进程名   优先数   要求运行时间   状态\n");
	while(c--)										//	按顺序打印已存在队列 
	{
		printf("  %c%c       %d\t      %d       \t   %c\t\n",PCB[i].name[0],PCB[i].name[1],PCB[i].priority,PCB[i].time,PCB[i].state[0]);
		i++;
		if(i==t) i=0;//计数满,清零 
	}
	printf("--------------------------------------\n");
	for(p=0;p<x;p++)								//打印出已经退出队列的进程,方便对比 
	{
		printf("  %c%c       %d\t      %d       \t   %c\t\n",PCB[p+N].name[0],PCB[p+N].name[1],PCB[p+N].priority,PCB[p+N].time,PCB[p+N].state[0]);
	}
	printf("--------------------------------------\n");
}

对输入的进程按优先级从大到小进行排序,排序完成后进入就绪队列,该函数只执行一次,进程进入队列后就不需要再进行排序了

//选择排序
void Sort(int n)          
{
	int i,j,maxpriority,temp1,temp2;
	for(i=0;i<n;i++)
	{
		maxpriority=PCB[i].priority;
		for(j=i;j<n;j++)
		{
			if(maxpriority<PCB[j].priority)
			{
				
				maxpriority=PCB[j].priority;
				PCB[n]=PCB[i];
				PCB[i]=PCB[j];
				PCB[j]=PCB[n];				
			}
		}
	}
}

核心算法:时间片轮转调度算法的具体实现。now指针指向当前轮转位置,定义为static类型,在重新回到函数时应该紧接着当前轮转位置(否则会出现永远从下标0的那个结构体开始执行,显然是不符合要求的)

int Start(int temp)
{
	static now=0;						//静态变量now,作为指针进行+1轮转,保存上一次运行位置 
	//int temp;
	printf("P%d进程执行中....\n结果为:\n",PCB[now].id);
	PCB[now].time--;  					//执行一次,所需时间减1 
	if(PCB[now].time<=0)	PCB[now].state[0]='E';  //进程结束,置状态位为E,退出队列 
					
	if(PCB[now].time<=0)
	{
		temp=Updatequeue(temp,now);					
		now=0;										//删除队首后,now指针不需要动 
	}else	now++;									//如果没有更新,now指针+1 
	if(now==temp)						//计满清零
	{
		now=0;
	}
	PrintPCB(temp,now); //打印新的队列状态表 
	return temp;
}

 在有进程执行结束时调用,更新当前剩余的就绪队列

//就绪队列更新 
int Updatequeue(int n,int now)
{
	int i;
	PCB[N+x]=PCB[now];
	printf("P%d结束运行,退出就绪队列\n\n",PCB[now].id);
	for(i=now;i<n-1;i++) 
	{
		PCB[i]=PCB[i+1];
	}
	n=n-1;				
	x++;
	return n;
}

检查所有标志位,如果发现R,则调度还未结束,返回1

检查未发现R,说明调度已结束,返回0

//运行状态检查 
int Runcheck(int n)    //检查剩余进程状态位是否为'E',否则返回真 
{
	int i;
	for(i=0;i<n;i++)
	{
		if(PCB[i].state[0]=='R')   
		{
			return 1;
		}
	}
	return 0;
}

 调用算法函数,并不断判断程序是否应该结束zhu

//启动函数 
void Run(int n)			
{
	while(Runcheck(n))	//反复检查进程,如果全为'E',则循环结束,算法结束 
	{
		n=Start(n);		//将返回新的进程个数作为实参继续传入函数 
	}
}
主函数
int main()
{
	int n;
	printf("请输入进程个数:") ;
	scanf("%d",&n);
	N=n; 
	Init(n);  
	Run(n);
	return 0; 
}

感谢阅读~各位有什么好的建议评论或者私信我都可以~有没看懂的地方也可以私信我~

觉得有用的话点个赞再走吧~

 

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

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

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

相关文章

  • 第三章 处理机调度

    第三章 处理机调度

    目录 一、调度的概念、层次 2.1 调度的基本概念 2.2 调度的三个层次 2.2.1 高级调度 2.2.2 低级调度 2.2.3 中级调度 2.2.3.1 进程的挂起态 2.2.4 三层调度的联系、对比 二、进程调度的时机、切换与过程、方式 2.1 进程调度的时机 2.2 进程调度的方式 2.2.1 非抢占方式 2.2.2 抢占方式

    2024年02月10日
    浏览(14)
  • 编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。(江西师范大学)

    编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。(江西师范大学)

    编写C程序模拟实现单处理机系统中进程调度,实现对多个进程的调度模拟,要求采用多级反馈队列调度算法进行模拟调度。 数据结构设计:PCB:结构体;就绪队列:每个节点为进程PCB;进程状态 具体调度算法:FCFS、SJF、PR;涉及多种操作:排序、链表操作 程序输出设计:调

    2024年02月04日
    浏览(19)
  • 昇腾AI处理机_学习笔记一:Img2col 卷积加速算法

    昇腾AI处理机_学习笔记一:Img2col 卷积加速算法

    Img2col 卷积加速算法 Img2col 通过矩阵乘法实现卷积的加速运算的方法,该方法被广泛应用在CPU、GPU等通用计算芯片上。同时在一些特定域结构(Domain Specific Architecture , DSA)上,比如华为的昇腾AI处理机中,使用了Img2col为需要进行卷积运算的矩阵进行了预处理。 CNN(Convolution

    2024年02月05日
    浏览(24)
  • 操作系统实验(进程调度)

    操作系统实验(进程调度)

      1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。   2.1设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。   2.2建立进程就绪队列。   2.3编制两种进程调度算法:优先权调度

    2024年02月06日
    浏览(10)
  • 操作系统-进程调度实验报告

    操作系统-进程调度实验报告

    1.实现四种不同及进程调度算法: 先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。 2. 按照下表

    2024年02月06日
    浏览(13)
  • 计算机操作系统实验:进程调度实验

    计算机操作系统实验:进程调度实验

    前言 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 总结 计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时

    2024年02月07日
    浏览(13)
  • 磁盘调度算法(操作系统实验 C++)

    磁盘调度算法(操作系统实验 C++)

    通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 问题描述: 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开

    2024年02月07日
    浏览(9)
  • 操作系统实验—进程调度算法(java)

    操作系统实验—进程调度算法(java)

    目录 文章目录 前言 一、实验原理 二、实验步骤 1.创建PCB类 2.创建创建类 3.设计主窗口类 4.调度界面函数 5.算法类及其调度算法通用函数 6.进程调度算法函数 总结 操作系统实验1:进程调度算法,步骤3、4在一个类中,步骤5、6在一个类中。 (1)先到先服务调度算法:按照进程提

    2024年02月04日
    浏览(8)
  • 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。 模拟分页式存储管理中硬件的地址转换和产生缺页中断。 用先进先出(FIFO)页面调度算法处理缺页中断。 由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,

    2024年02月04日
    浏览(14)
  • 【操作系统实验6】CPU调度程序模拟实现

    【操作系统实验6】CPU调度程序模拟实现

    加深对操作系统CPU调度以及调度算法的理解 1) 单处理器环境下,针对最短作业优先算法(SJF)和优先级调度算法(Priority),分别模拟实现抢占调度和非抢占调度的调度程序 设计使用三个队列,分别为就绪队列(readyQueue)、运行队列(runningQueue)、等待队列(waitingQueue) 进程状态三种,

    2024年02月06日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包