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

举报
海轰Pro 发表于 2021/08/06 00:09:43 2021/08/06
【摘要】 一、实验名称 进程调度 二、实验内容 编写模拟程序实现FIFO算法,短作业优先调度算法和轮转法,比较他们的不同之处。 三、实验原理和设计思路         不同的调度算法,平均周转时间和平均带权周转时间有很大差别,应根据具体情况具体选择。    &n...

一、实验名称

进程调度

二、实验内容

编写模拟程序实现FIFO算法,短作业优先调度算法和轮转法,比较他们的不同之处。

三、实验原理和设计思路

        不同的调度算法,平均周转时间和平均带权周转时间有很大差别,应根据具体情况具体选择。
        FIFO算法当每次有新的分页需要调入时,会选择调入内存时间最久的分页换出。
        短作业优先调度算法:以进入系统的作业所要求的CPU时间为标准,是指对短作业或者短进程优先调度的算法,将每个进程与其估计运行时间进行关联选取估计计算时间最短的作业投入运行。
        轮转法:每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。

四、核心代码

#include<stdio.h>
#include<string.h>
#include <iomanip.h>
#include<iostream.h>
const int block_time=2; //定义时间片的长度为2秒
const int MAXPCB=100; //定义最大进程数
//定义进程结构体
typedef struct node {
	char name[20];
	int status;//进程状态
	int time;//运行该进程所需时间
	int privilege;//优先级

	int finished;
	int wait_time;//等待时间
} pcb;
pcb pcbs[MAXPCB];
int quantity;// 记录进程数量
//初始化函数
void initial() {
	int i;
	for ( i=0; i<MAXPCB; i++ ) {
		strcpy ( pcbs[i].name,"" );
		pcbs[i].status=0;//进程状态
		pcbs[i].time=0;//运行该进程所需时间
		pcbs[i].privilege=0;//优先级
		pcbs[i].finished=0;//结束状态 0:运行中 1:结束
		pcbs[i].wait_time=0;//等待时间
	}
	quantity=0;
}
//读数据函数
int readData() {
	FILE *fp;
	int i;
	if ( ( fp=fopen ( "jc.txt","r" ) ) ==NULL ) {
		cout<<"错误,文件打不开,请检查文件名"<<endl;
	} else {
		while ( !feof ( fp ) ) { fscanf ( fp,"%s %d %d %d",pcbs[quantity].name,&pcbs[quantity].status,&pcbs[quantity].time,&pcbs[quantity ].privilege ); quantity++;
		}

//输出
		cout<<"进程名"<<setw(10)<<"所需时间"<<setw(10)<<"优先级"<<endl;
		for ( i=0; i<quantity; i++ ) { cout<<pcbs[i].name<<setw(10)<<pcbs[i].time<<setw(10)<<pcbs[i].privilege<<endl;
		}
		cout<<endl;
		return ( 1 );
	}
	return ( 0 );

}

//重置数据,以供另一个算法使用
void init() {
	int i;
	for ( i=0; i<MAXPCB; i++ ) {
		pcbs[i].finished=0;
		pcbs[i].wait_time=0;
	}
}

//先进先出算法
void FIFO() {
	int i,j;
//输出FIFO算法
	cout<<"FIFO算法:"<<endl;
	cout<<"进程名"<<setw(10)<<"等待时间"<<endl;
	for ( i=0; i<quantity; i++ ) {
		cout<<pcbs[i].name<<setw(10)<<pcbs[i].wait_time<<endl;
		for ( j=i+1; j<quantity; j++ ) { pcbs[j].wait_time+=pcbs[i].time;
		}
	}
	cout<<endl;
}
// 非抢占式短作业算法
void nsjf(){
int queue[MAXPCB];// 输出时的顺序
int passed_time=0;// 记录 已经过去的时候 便于计算等待时间
int i,j;
int min;//最小数坐标
for(i=0;i<quantity;i++)
{
	// 第一个进程 直接进入队列
if(i==0)
{
queue[i]=0;
pcbs[i].finished=1;
pcbs[i].wait_time+=passed_time;
passed_time+=pcbs[i].time;
}
// 寻找除finish之外 所需时间最少的进程
else
{ for(j=0;j<quantity;j++)
	{
	if(pcbs[j].finished==0)
	{
	min=j;
	break;
	}
	}
	for(j=0;j<quantity;j++)
	{
	if(pcbs[j].finished==0&&pcbs[min].time>pcbs[j].time)
	{
	 min=j;
	}
	}
	queue[i]=min;
pcbs[min].finished=1;
pcbs[min].wait_time+=passed_time;
passed_time+=pcbs[min].time;
}
}
//输出nsjf调度
	cout<<"nsjf算法(非抢占):"<<endl;
	cout<<"进程名"<<setw(10)<<"等待时间"<<endl;
	for ( i=0; i<quantity; i++ ) {
		cout<<pcbs[queue[i]].name<<setw(10)<<pcbs[queue[i]].wait_time<<endl;
	}
	cout<<endl;
}

//优先级调度算法
void privilege() {
	int i,j,p;
	int passed_time=0;
	int queue[MAXPCB];// 记录输出时的数组坐标
	int current_privilege=1000;
	for ( i=0; i<quantity; i++ ) {
		current_privilege=1000;
		for ( j=0; j<quantity; j++ ) { if ( ( pcbs[j].finished==0 ) && ( pcbs[j].privilege<current_privilege ) ) { p=j; current_privilege=pcbs[j].privilege; }
		}
		queue[i]=p;
		pcbs[p].finished=1;
		pcbs[p].wait_time+=passed_time;
		passed_time+=pcbs[p].time;
	}

//输出优先数调度
	cout<<"优先级算法:"<<endl;
	cout<<"进程名"<<setw(10)<<"等待时间"<<endl;
	for ( i=0; i<quantity; i++ ) {
		cout<<pcbs[queue[i]].name<<setw(10)<<pcbs[queue[i]].wait_time<<endl;
	}
  cout<<endl;
}
//时间片轮转调度算法
void timer() {
	int i,j,number,flag=1;
	int passed_time=0;
	int max_time=0;
	int round=0;
	int queue[1000];
	int total=0;
	while ( flag==1 ) {
		flag=0;
		number=0;
		for ( i=0; i<quantity; i++ ) { if ( pcbs[i].finished==0 ) { number++; j=i; }
		}
		if ( number==1 ) { queue[total]=j; total++; pcbs[j].finished=1;
		}
		if ( number>1 ) { for ( i=0; i<quantity; i++ ) { if ( pcbs[i].finished==0 ) { flag=1; queue[total]=i; total++; if ( pcbs[i].time<=block_time* ( round+1 ) ) { pcbs[i].finished=1; } } }
		}
		round++;
	}

	if ( queue[total-1]==queue[total-2] ) {
		total--;
	}
	cout<<"时间片轮转算法(时间片为2s):"<<endl;
	cout<<"处理进程顺序为:";
	for ( i=0; i<total; i++ ) {
		cout<<pcbs[queue[i]].name<<"--->>";
	}
	cout<<"over"; cout<<endl;
	cout<<endl; }
//主函数
void main() {
	int flag;
	initial();
	flag=readData();
	if ( flag==1 ) {
		FIFO();
		init();
		timer();
		init();
		nsjf();
		init();
	}
}
  
 

五、结果截图(部分)

在这里插入图片描述
在这里插入图片描述

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/106065483

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。