操作系统实验 - 先来先服务的调度算法和短作业优先

更新时间:2023-09-27 14:59:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学号 实验日期 P71514032 2017.10.27 专业 计算机科学与技术 教师签字 成绩 姓名

实验报告

【实验名称】 【实验目的】

在多道程序或多任务系统中,系统同时处于就绪态的进程有若干个。也就是说能运行的进程数远远大于处理机个数,为了使系统中的各进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机,所以,要求使用某一种编程语言设计实现模拟单处理机调度的算法,以巩固和加深处理机调度的概念。

本实验要求采用先来先服务的调度算法和短作业优先的调度算法编写和调试一个简单的进程调度程序。通过本实验可以加深理解进程调度、进程队列的概念。

进程调度算法FCFS、FJF

【实验原理】

FCFS调度算法

先来先服务(FCFS)调度算法是一种最简单的调度算法。在进程调度中采

用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

SJF调度算法

短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度

的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运

行。

【实验内容】 问题分析

输入:进程的名称、到达时间、服务时间 输出:进程的完成时间、周转时间、带权周转时间 其中对于任意进程有: 周转时间=完成时间-到达时间 带权周转时间=周转时间/服务时间 因此,两个算法的关键是求完成时间

? 数据结构及函数说明

使用的数据结构是数组,进程的名称、到达时间、服务时间、进程的完成时间、周转时间、带权周转时间分别对应于一个数组,这些数组长度相等. struct fcfs

//定义进程的结构体 {

char name[10]; //进程名 float arrivetime; //到达时间 float servicetime; //服务时间 float starttime;//开始时间 float finishtime;//完成时间 float zztime;//周转时间

float dqzztime;//带权周转时间 };

fcfs a[100]; //结构体数组

函数说明

void Finput(fcfs *p,int N) ;//输入函数,初始化

void Fsort(fcfs *p,int N) ;//按到达时间排序,先到达排在前面 void Fsort2(fcfs *p,int N) ;//按进程大小排序,先到达排在前面 void F_method(fcfs *p, int N) //先来先服务算法 void F_method2(fcfs *p,int N)//短作业优先程序 void SJF(fcfs *p,int N); // 短作业优先 void FCFS(fcfs *p,int N); //先来先服务 void SJF(fcfs *p,int N)//短作业优先 void FPrint(fcfs *p,int N)//输出函数

求完成时间算法

1) FCFS算法流程图

开始初始化结构体数组、初始化进程队列,当前时间为0对进程数组按照到达时间小到大进行排序当前时间是否小于当前进程到达时间是当前时间=当前时间+1否当前进程的开始时间等于当前时间当前进程=下一个进程当前进程的结束时间等于开始时间+运行时间当前时间=当前进程结束时间+1否进程数组是否扫描完毕是结束

2) SJF算法流程图

开始初始化结构体数组,输入赋值,当前时间为0对进程数组按照进程运行时间进行小到大排序,标志位为0当前进程为第一个进程当前时间>当前进程的到达时间否当前进程标志位为0否是当前进程开始时间=当前时间结束时间=当前时间+运行书剑是否为最后一个进程是否当前进程标志为1当前进程=下一个进程当前时间=当前时间+1所有标志位都为1否是结束

? 程序

#include struct fcfs

//定义进程的结构体 {

char name[10]; //进程名

float arrivetime; //到达时间 float servicetime; //服务时间 float starttime;//开始时间 float finishtime;//完成时间 float zztime;//周转时间

float dqzztime;//带权周转时间 }; float

arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

fcfs a[100];

//定义先来先服务算法进程的最大数量

void Finput(fcfs *p,int N) //输入函数 {

int i;

printf(\输入进程的名称、到达时间、服务时间:(例如: x 0 100)\\n\

for(i=0; i<=N-1; i++) {

printf(\输入第%d进程的名称、到达时间、服务时间:\\n\

scanf(\

} }

//输出函数

void FPrint(fcfs *p,int N)//输出函数 {

int k;

printf(\执行顺序:\\n\ printf(\ for(k=1; k

printf(\ }

printf(\进程名\\t到达时间\\t服务时间\\t开始时间\\t结束时

本文来源:https://www.bwwdw.com/article/p64d.html

Top