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

一、实验名称

进程调度

二、实验内容

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

三、实验原理和设计思路

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

四、核心代码

//先进先出算法
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 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;  
}

五、结果截图(部分)

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

雨听

青苔入镜 檐下风铃 摇晃曾经 回忆 无从剪接
微信搜索【海轰Pro】
相互学习,共同进步!
海轰会不间断更新源码的 Thanks♪(・ω・)ノ

猜你喜欢

转载自blog.csdn.net/weixin_44225182/article/details/106065483