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

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

1.实现四种不同及进程调度算法:

先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。

2.通过实验理解有关进程控制块,进程队列等的概念。

1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。

2. 按照下表输入3个作业信息,输出使用不同调度算法的结果。

3. 在现有三个调度算法的基础上,进一步实现短作业优先调度

ProcessID

arrivetime

servicetime

priority:

1

1

9

2

2

4

6

3

3

6

3

1

  参数表格2     

ProcessID

arrivetime

servicetime

priority:

1

1

2

2

2

7

2

4

3

5

7

1

4

9

1

3

说明:

  1. 主程序中从键盘得到进程的数量,创建PCB,调用layout()函数显示选择界面。
  2. Layout()函数中选择相应的算法并调用相关函数如:FCFS(),最后打印。

一 设计有N个进程并发的调度算法

   进程调度算法:每个进程有一个进程控制块(PCD)表示。进程控制块下包含:进程ID,         优先级,到达时间,需要运行时间等。

二  在linux系统上输入程序,调试,编译

三  设计输入数据,选择不同的进程调度算法,打印执行结果

四  根据实验要求,填写实验报告

-----贴几张调用算法图,加自己写的一些简单分析

  1. 选择FSFS算法结果

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

  1. 结果分析:调用先来先服务算法,1号进程先来于是先执行1号,处理机开始时间是1,加上1号服务时间于是结束为10;2号进程来的时间为4,比3号早,于是先执行2号,执行完后时间为16,;最后执行3号,执行完时间为19.
  • 2-调用timesegment算法结果

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

  • 2-结果分析:调用时间片轮转算法,本例中设置时间片长度为3,1号进程先来,时间为1时候开始,先执行3,然后2来,再执行3,然后3已结到了,再执行3,此时为10,3号进程执行完毕。之后1号和2号轮流执行一个时间片的时间,最后2号执行完为16,1号执行完为19.
  • 3-调用priority算法结果

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

  • 3-实验结果分析:调用优先级非抢占式进程算法,1号进程先来,于是先执行1号,从1开始,执行9,  1号结束后为10,之后2号进程的优先级比3号高,执行完2号后为16;之后执行3号,结果为19.
  • 4-调用SJF算法结果

操作系统-进程调度实验报告文章来源地址https://www.toymoban.com/news/detail-462992.html

  • 4-结果分析:调用非抢占式短作业优先算法,一号进程先来,执行完后为10;然后比较2号和3号,3号的运行时间短,先执行3号,执行完为13,;最后执行完2号,执行完为19.

参考代码:

#include<stdio.h>
#include<malloc.h>
#include <stdbool.h>
#include<stdlib.h>
#define max 50

struct PCB
{
	int name;
	int arrivetime; //到达时间
	int servicetime; //服务时间
	//int starttime[max]; //开始时间
    int finishtime; //完成/结束时间
    int turntime; //周转时间
    int average_turntime; //带权周转时间
	int sign; //标志进程是否完成
	int remain_time; //剩余时间
	int priority;  //优先级
}pcb[max];

void init(int n)  //初始化
{ int i;
	for(i=0;i<n;i++)
	{
		pcb[i].arrivetime=0; 
		pcb[i].servicetime=0; 
	    //pcb[i].starttime=0; 
	    pcb[i].finishtime=0; 
	    pcb[i].turntime=0;
	    pcb[i].average_turntime=0;
		pcb[i].remain_time=0;
		pcb[i].sign=0;
		pcb[i].priority=0;
	}
}
void creat(int n) //创建PCB
{
	int i;
	for(i=1;i<=n;i++)
	{
		printf("\n%d:\n input the information of process\n input processID:",i);
		scanf("%d",&pcb[i].name);
		printf("input the arrivetime:");
		scanf("%d",&pcb[i].arrivetime);
		printf("input the servicetime:");
		scanf("%d",&pcb[i].servicetime);
		printf("input the priority:");
		scanf("%d",&pcb[i].priority);
		pcb[i].remain_time=pcb[i].servicetime;  //初始化剩余时间为服务时间
	}
}

void FCFS(int n) //先来先服务
{
	int starttime;
	printf("input the start time:\n");
	scanf("%d",&starttime);
	if(starttime>=pcb[1].arrivetime)
	{
		pcb[1].finishtime=pcb[1].servicetime+starttime;
	}
	else
	{
		pcb[1].finishtime=pcb[1].arrivetime+ pcb[1].servicetime;
	}
         int i;
         pcb[1].turntime=pcb[1].finishtime-pcb[1].arrivetime;
	pcb[1].average_turntime=pcb[1].turntime/pcb[1].servicetime;
	for(i=1;i<n;i++)
	{
		if(pcb[i].finishtime>pcb[i+1].arrivetime)
		pcb[i+1].finishtime=pcb[i].finishtime+pcb[i+1].servicetime;
		else
			pcb[i+1].finishtime=pcb[i+1].arrivetime+pcb[i+1].servicetime;
		pcb[i+1].turntime=pcb[i+1].finishtime-pcb[i+1].arrivetime;
		pcb[i+1].average_turntime=pcb[i+1].turntime/pcb[i+1].servicetime;
	}
}

void print_FCFS(int n)
{
		//printf("ProcessID, arrivetime\t Servicetime\t finishtime\t turntime\t:,,%s\t%d\t%d\t%d\t%d\t%d\t"); //进程名,到达时间,服务时间,完成时间,周转时间,周转时间
	printf("process ID  arrivetime servicetime finishtime turntime , averageturntime  .\n");
         int i;
	for(i=1;i<=n;i++)
	{
		printf("%d  ,%d  ,%d  ,%d  ,%d  ,%d  ",pcb[i].name  ,pcb[i].arrivetime  ,pcb[i].servicetime  ,pcb[i].finishtime  ,pcb[i].turntime  ,pcb[i].average_turntime);
		printf("\n");
	}

}
void time_segment(int n) //时间片轮转
{
	int i,j;
	int T;   //时间片
	int flag=1;   //就绪队列中是否还有进程,0为没进程,1为有进程
	//int time=pcb[0].arrivetime;   //当前的时间
	int time=0;
	int sum=0;   //已经完成的进程数

	//按各进程的arrivetime进行升序排列
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime<pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	// 新加上的
	time=pcb[1].arrivetime;
	    //printf("output the sort result:\n");
		//for(i=1;i<=n;i++)    //检查排序是否正确
     	//printf("%d\t",pcb[i].name);
	printf("input the slicetime:\n");
	scanf("%d",&T);
	//printf("\n running processID runtime resttime finishtime\n”) //  开始运行时间   运行时间   剩余服务时间   结束时间

	while(sum<n) 
	{
		flag=0;   //当前就绪队列中没有进程
		int i;
                for(i=1;i<=n;i++)
		{
          //标志进程是否完成
			if(pcb[i].sign==1) continue; //表示该进程已完成
			else
			{


	           //没有完成的进程需要的时间大于一个时间片
				if(pcb[i].remain_time > T)
				{
					flag=1;
				if(time<pcb[i].arrivetime)
				time=pcb[i].arrivetime;
				else{
				time=time+T;
				}	
					
                 // remain是剩余时间
					pcb[i].remain_time=pcb[i].remain_time-T;
          
					//printf("%10d%16d%12d%12d%12d\n",pcb[i].name,time-T,T,pcb[i].remain_time,time);
				}

				//没有完成的进程需要的时间小于或等于一个时间片
				else if(pcb[i].remain_time <= T)
				{
					flag=1;  //加入就绪队列
					if(time<pcb[i].arrivetime)
				time=pcb[i].arrivetime;
					time=time+pcb[i].remain_time;
					pcb[i].finishtime=time;
                    pcb[i].sign=1;
					//printf("%10d%16d%12d%12d%12d\n",pcb[i].name,time-pcb[i].remain_time,pcb[i].servicetime,0,time); 
		 	        pcb[i].remain_time=0;
				}
				
				if(pcb[i].sign==1) sum++;
			}

		}//for


	if(flag==0&&sum<n)   // 还有没执行的进程,且没进入就就绪队列 
	{
        int i;
	for(i=1;i<=n;i++)
	if(pcb[i].sign==0) {time=pcb[i].arrivetime;break;}
	}


	}//while

}
void print_time(int n)
{       int i;
	for(i=0;i<n;i++)
	{
	printf("\n processID servicetime finishtime\n");  //进程名   服务时间   完成时间
	printf("%6d%10d%10d",pcb[i+1].name,pcb[i+1].servicetime,pcb[i+1].finishtime);
	printf("\n");
	}
}

void Priority(int n)
{
	int i,j;
	int time = pcb[1].arrivetime;
	//按各进程的arrivetime进行升序排列,最早到达的进程先执行
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime < pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	
	    //printf("output the sort result: \n"); //输出排序结果
	    //for(i=1;i<=n;i++)    //检查排序是否正确
     	//printf("%d\t",pcb[i].name);

	printf("\n processID runtime priority fihishtime \n");//进程名   服务时间   优先级  完成时间
	//先到达的进程第一个执行
	if(i=1)
	{
		pcb[i].finishtime=pcb[i].arrivetime + pcb[i].servicetime;
		time =pcb[i].arrivetime + pcb[i].servicetime;
		printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
		printf("\n");
		//测试第一个进程输出正确
	/*	printf("output the first process:\n");//输出第一个程序的
		printf("processID arrivetime finishtime\n");//名称  到达时间  完成时间
		printf("%4d%8d%8d",pcb[i].name,pcb[i].arrivetime,pcb[i].finishtime);
		printf("\n"); */
		i++; 
	}
	
	

/*
	//按各进程的priority进行降序排列,优先级最高的进程先执行
	for(i=2;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].priority > pcb[i].priority)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	
	for(i=2;i<=n;i++)
	{
		time = time + pcb[i].servicetime;
		pcb[i].finishtime = time;
		printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
		printf("\n");
	}//for
	
*/

int num=2;
	for(i=2;i<=n;i++)
	{
//按各进程的priority进行降序排列,优先级最高的进程先执行

	for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].priority > pcb[i].priority)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
//在优先级调整后判断此时最先到达的进程号
for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime< pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}




i=num;
  if(time<pcb[i].arrivetime)
{
  time=pcb[i].arrivetime;
pcb[i].finishtime = time+pcb[i].servicetime;
}
else
{
time = time + pcb[i].servicetime;
pcb[i].finishtime = time;
}
printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
printf("\n");
time=pcb[i].finishtime;

num++;
	}//for

}//void

void SJF(int n)
{
int i,j;
	int time = pcb[1].arrivetime;
	//按各进程的arrivetime进行升序排列,最早到达的进程先执行
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime < pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	
	    

	printf("\n processID runtime priority fihishtime \n");//进程名   服务时间   优先级  完成时间
	//先到达的进程第一个执行
	if(i=1)
	{
		pcb[i].finishtime=pcb[i].arrivetime + pcb[i].servicetime;
		time =pcb[i].arrivetime + pcb[i].servicetime;
		printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
		printf("\n");
		
	
		i++; 
	}
	
	



int num=2;
	for(i=2;i<=n;i++)
	{
//按各进程的servicetime进行降序排列

	for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].servicetime < pcb[i].servicetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	if(pcb[num-1].finishtime<pcb[num].arrivetime)
	{
//在优先级调整后判断此时最先到达的进程号
for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime< pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	}




i=num;
  if(time<pcb[i].arrivetime)
{
  time=pcb[i].arrivetime;
pcb[i].finishtime = time+pcb[i].servicetime;
}
else
{
time = time + pcb[i].servicetime;
pcb[i].finishtime = time;
}
printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
printf("\n");
time=pcb[i].finishtime;

num++;
	}//for


}

void layout(int n) 
{

while(true)
{
	int ch=0;
	printf("\t\t************schedule algorithm************\n");
	printf("\t\t1.FSFS\n");
	printf("\t\t2.timesegment\n");
	printf("\t\t3.priority\n");
	printf("\t\t4.SJF\n");
	printf("\t\t5表示退出\n");
	printf(" choose the algorithm:\n");
	scanf("%10d",&ch);
	switch(ch)
	{
	case 1:
		    FCFS(n);
		    print_FCFS(n); break;
	case 2:
		    time_segment(n);
		    print_time(n); break;
	case 3:
		    Priority(n); break;
        case 4:
		    SJF(n); break;
	case 5:     exit(0);	    
	default:printf("enter error data!\n");
	//P:int类型的变量,case后面不要加''
	}
}
}

int main()
{ 
	int n;
	printf("input the number of process\n");
	scanf("%d",&n);
	init(n);
	creat(n);
	layout(n);
	//FCFS(n);
	//print_FCFS(n);
	//time_segment(n);
	//print_time(n);
	//Priority(n);
	return 0;
}

到了这里,关于操作系统-进程调度实验报告的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机操作系统实验-进程调度模拟算法

    进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。 1.设计进程控制块 PCB 的结构,通常应包括如下信息: 进程名、进程优先数(

    2024年02月05日
    浏览(46)
  • 操作系统:实验一:进程调度实验——最高优先数优先的调度算法以及先来先服务算法 源码

    操作系统:实验一:进程调度实验——最高优先数优先的调度算法以及先来先服务算法 源码

    一、实验目的 (1)了解进程实体PCB结构; (2)理解进程不同状态和状态之间的转换过程; (3)掌握优先数的调度算法和先来先服务算法; 二、实验内容与要求 设计一个有 N个进程共行的进程调度程序 四、实验步骤 (1)实验设计 进程调度算法: 采用最高优先数优先的调

    2024年02月06日
    浏览(8)
  • 操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

    操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

    1. mygdb 侧调试命令: 2. 第三关.txt : 1.概述:0号进程和1号进程间进程调度过程 (1)从 system_call 函数进入相应的系统调用函数 在两个进程运行 alarm 和 pause 函数时,到执行 alarm 和 pause 系统调用时,都会进入到system_call函数,在下图第一处划线位置根据系统调用号,调用相应的

    2024年02月11日
    浏览(86)
  • 操作系统进程调度算法(c语言模拟实现)

    操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(16)
  • 操作系统进程调度算法的模拟实现(c语言版本)

    操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

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

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

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

    2024年02月06日
    浏览(13)
  • 【操作系统】基于动态优先级的进程调度算法-C语言实现(有代码)

    【操作系统】基于动态优先级的进程调度算法-C语言实现(有代码)

    本文章将会介绍如何编写动态优先级的进程调度算法,并使用从语言实现。 一、什么是动态优先级的调度算法        进程运行一个时间片后,如果进程已占用 CPU时间已达到所需要的运行时间,则撤消该进程;如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行

    2024年02月06日
    浏览(14)
  • 先来先服务调度算法(C语言代码实现) 大三操作系统实验

    先来先服务调度算法(C语言代码实现) 大三操作系统实验

    实验原理: 先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度。先来先服务算法是按照作业或进程的到达先后次序来进行调度。当作业调度中采用该算法时,每次调度都是从后备队列中选择一个最先进入该队列中作业,将

    2024年04月16日
    浏览(9)
  • 操作系统实验——进程管理的算法实现

    笔者在大学下属的事业单位上班,最近去帮着带下操作系统的实验课,这里随手水点参考代码,欢迎各位领导老师莅临指正 编写一个简单的进程调度器 进程控制块(PCB)的定义与管理 进程调度算法的实现 进程创建、销毁和切换 给定一批进程对比3-4种调度算法的时间(自选

    2024年02月06日
    浏览(13)
  • 操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

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

    文章目录 优先级调度算法介绍 两种情况 调度算法分类 优先级分类 实验内容与要求 实验步骤 调度算法总流程图  优先级调度算法流程图  实验代码 实验结果         优先级调度算法既可以用于作业调度,又可以用于进程调度。该算法中的优先级用于描述作业或者进程的

    2024年02月01日
    浏览(14)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包