操作系统实验-FCFS和短作业优先SJF调度算法模拟

合集下载

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

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

操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。

其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。

实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。

实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。

在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。

实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。

在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。

2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。

在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。

3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。

在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。

实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。

在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。

因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。

结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。

同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。

进程调度算法实验报告

进程调度算法实验报告

进程调度算法实验报告进程调度算法实验报告一、引言进程调度算法是操作系统中的重要组成部分,它决定了进程在CPU上的执行顺序。

合理的进程调度算法能够提高系统的性能和效率,使得多个进程能够公平地共享CPU资源。

本实验旨在通过实际操作和数据分析,探究不同的进程调度算法对系统性能的影响。

二、实验方法1. 实验环境本次实验使用了一台配置较高的计算机作为实验环境,操作系统为Windows 10。

实验中使用了C语言编写的模拟进程调度程序。

2. 实验步骤(1)编写模拟进程调度程序,实现常见的进程调度算法,包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和优先级调度(Priority)。

(2)设计一组测试用例,包括不同执行时间的进程和不同优先级的进程。

(3)运行模拟进程调度程序,记录每个进程的等待时间、周转时间和响应时间。

(4)根据实验结果分析不同进程调度算法的性能差异。

三、实验结果与分析1. 先来先服务(FCFS)调度算法先来先服务调度算法按照进程到达的先后顺序进行调度,即先到达的进程先执行。

实验结果显示,该算法对于执行时间较短的进程表现良好,但对于执行时间较长的进程则存在明显的不公平性。

长作业的等待时间较长,导致整体执行效率较低。

2. 最短作业优先(SJF)调度算法最短作业优先调度算法按照进程执行时间的长度进行调度,即执行时间最短的进程先执行。

实验结果显示,该算法能够最大程度地减少平均等待时间和周转时间,提高系统的执行效率。

然而,该算法对于执行时间较长的进程存在饥饿问题,即长作业可能一直等待短作业的执行,导致长作业的等待时间过长。

3. 时间片轮转(RR)调度算法时间片轮转调度算法将CPU的执行时间划分为固定长度的时间片,每个进程按照轮流执行的方式进行调度。

实验结果显示,该算法能够保证每个进程都能够获得一定的执行时间,提高了系统的公平性。

然而,对于执行时间较长的进程而言,由于需要等待其他进程的轮转,其执行效率相对较低。

操作系统调度算法实验报告

操作系统调度算法实验报告

操作系统调度算法实验报告
本实验旨在研究不同操作系统调度算法在实际应用中的表现和影响。

我们选择了三种常见的调度算法进行对比分析,分别是先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转(RR)。

1. 实验准备
在开始实验之前,我们首先搭建了一个简单的模拟环境,包括一个CPU和多个进程。

每个进程具有不同的执行时间,以便模拟不同情况
下的调度效果。

2. 先来先服务(FCFS)
先来先服务是最简单的调度算法之一,即根据进程到达的顺序依次
执行。

实验结果显示,FCFS算法适用于处理大量长作业,但当出现短
作业时会导致平均等待时间较长。

3. 最短作业优先(SJF)
最短作业优先算法会优先执行执行时间最短的进程,以减少平均等
待时间。

在我们的实验中,SJF算法表现出色,尤其在短作业较多的情
况下,能够显著提高系统的响应速度。

4. 时间片轮转(RR)
时间片轮转算法将CPU时间分配给每个进程,每个进程执行一个
时间片后轮转到下一个进程。

然而,RR算法可能导致上下文切换频繁,
影响系统效率。

在实验中,我们发现RR算法在处理多任务时效果较好,但在处理长时间任务时表现一般。

5. 实验总结
通过对三种调度算法的实验比较,我们可以看出不同算法在不同情
况下有着不同的优势和劣势。

在实际应用中,需要根据具体情况选择
合适的调度算法,以提高系统的性能和效率。

希望本实验能为操作系
统调度算法的研究提供一定的参考价值。

操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。

二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。

常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、轮转法(Round Robin)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。

1.先来先服务(FCFS)算法:按照进程到达的先后顺序进行调度,被调度的进程一直执行直到结束或主动阻塞。

2.最短作业优先(SJF)算法:按照进程需要的执行时间的短长程度进行调度,执行时间越短的进程越优先被调度。

3. 优先级调度(Priority Scheduling)算法:为每个进程分配一个优先级,按照优先级从高到低进行调度。

4. 轮转法(Round Robin)算法:将进程按照到达顺序排列成一个队列,每个进程被分配一个时间片(时间量度),当时间片结束时,将进程从队列头取出放置到队列尾。

5.多级反馈队列调度算法:将进程队列分为多个优先级队列,每个队列时间片大小依次递减。

当一个队列中的进程全部执行完毕或者发生阻塞时,将其转移到下一个优先级队列。

三、实验步骤与结果1.实验环境:- 操作系统:Windows 10- 编译器:gcc2.实验过程:(1)首先,设计一组测试数据,包括进程到达时间、需要的执行时间和优先级等参数。

(2)根据不同的调度算法编写相应的调度函数,实现对测试数据的调度操作。

(3)通过模拟实验,观察不同调度算法之间的区别,比较平均等待时间、完成时间和响应时间的差异。

(4)将实验过程和结果进行记录整理,撰写实验报告。

3.实验结果:这里列举了一组测试数据和不同调度算法的结果,以便对比分析:进程,到达时间,执行时间,优先------,----------,----------,-------P1,0,10,P2,1,1,P3,2,2,P4,3,1,P5,4,5,a.先来先服务(FCFS)算法:平均等待时间:3.8完成时间:15b.最短作业优先(SJF)算法:平均等待时间:1.6完成时间:11c. 优先级调度(Priority Scheduling)算法:平均等待时间:2.8完成时间:14d. 轮转法(Round Robin)算法:时间片大小:2平均等待时间:4.8完成时间:17e.多级反馈队列调度算法:第一级队列时间片大小:2第二级队列时间片大小:4平均等待时间:3.8完成时间:17四、实验总结通过上述的实验结果可以得出以下结论:1.在上述测试数据中,最短作业优先(SJF)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。

操作系统实验之处理机调度实验报告

操作系统实验之处理机调度实验报告

操作系统实验之处理机调度实验报告一、实验目的处理机调度是操作系统中的核心功能之一,本次实验的主要目的是通过模拟不同的处理机调度算法,深入理解操作系统对处理机资源的分配和管理策略,比较不同调度算法的性能差异,并观察它们在不同负载情况下的表现。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 Python 38。

实验中使用了 Python 的相关库,如`numpy`、`matplotlib`等,用于数据生成、计算和图形绘制。

三、实验原理1、先来先服务(FCFS)调度算法先来先服务算法按照作业到达的先后顺序进行调度。

先到达的作业先被服务,直到完成或阻塞,然后再处理下一个到达的作业。

2、短作业优先(SJF)调度算法短作业优先算法选择预计运行时间最短的作业先执行。

这种算法可以有效地减少作业的平均等待时间,但可能导致长作业长时间等待。

3、时间片轮转(RR)调度算法时间片轮转算法将处理机的时间分成固定长度的时间片,每个作业轮流获得一个时间片的处理时间。

当时间片用完后,如果作业还未完成,则将其放入就绪队列的末尾等待下一轮调度。

4、优先级调度算法优先级调度算法为每个作业分配一个优先级,优先级高的作业先被执行。

优先级可以根据作业的性质、紧急程度等因素来确定。

四、实验内容与步骤1、数据生成首先,生成一组模拟的作业,包括作业的到达时间、预计运行时间和优先级等信息。

为了使实验结果更具代表性,生成了不同规模和特征的作业集合。

2、算法实现分别实现了先来先服务、短作业优先、时间片轮转和优先级调度这四种算法。

在实现过程中,严格按照算法的定义和规则进行处理机的分配和调度。

3、性能评估指标定义了以下性能评估指标来比较不同调度算法的效果:平均等待时间:作业在就绪队列中的等待时间的平均值。

平均周转时间:作业从到达系统到完成的时间间隔的平均值。

系统吞吐量:单位时间内完成的作业数量。

4、实验结果分析对每种调度算法进行多次实验,使用不同的作业集合,并记录相应的性能指标数据。

操作系统实验报告——调度算法

操作系统实验报告——调度算法

操作系统实验报告——调度算法1. 实验目的本实验旨在探究操作系统中常用的调度算法,通过编写代码模拟不同的调度算法,了解它们的特点和应用场景。

2. 实验环境本次实验使用的操作系统环境为Linux,并采用C语言进行编码。

3. 实验内容3.1 调度算法1:先来先服务(FCFS)FCFS调度算法是一种简单且常见的调度算法。

该算法按照进程到达的先后顺序进行调度。

在本实验中,我们使用C语言编写代码模拟FCFS算法的调度过程,并记录每个进程的等待时间、周转时间和响应时间。

3.2 调度算法2:最短作业优先(SJF)SJF调度算法是一种非抢占式的调度算法,根据进程的执行时间来选择下一个要执行的进程。

在本实验中,我们使用C语言编写代码模拟SJF算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。

3.3 调度算法3:轮转调度(Round Robin)Round Robin调度算法是一种经典的时间片轮转算法,每个进程在给定的时间片内依次执行一定数量的时间。

如果进程的执行时间超过时间片,进程将被暂时挂起,等待下一次轮转。

在本实验中,我们使用C语言编写代码模拟Round Robin算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。

4. 实验结果分析通过对不同调度算法的模拟实验结果进行分析,可以得出以下结论:- FCFS算法适用于任务到达的先后顺序不重要的场景,但对于执行时间较长的进程可能会导致下一个进程需要等待较久。

- SJF算法适用于任务的执行时间差异较大的场景,能够提高整体执行效率。

- Round Robin算法适用于时间片相对较小的情况,能够公平地为每个进程提供执行时间。

5. 实验总结本次实验通过模拟不同调度算法的实际执行过程,深入了解了各种调度算法的原理、特点和适用场景。

通过对实验结果的分析,我们可以更好地选择合适的调度算法来满足实际应用的需求。

在后续的学习中,我们将进一步探索更多操作系统相关的实验和算法。

调度的调度算法实验报告

调度的调度算法实验报告调度的调度算法实验报告引言:调度是计算机科学中一个重要的概念,它涉及到任务分配、资源管理和优化等方面。

调度算法则是实现调度的关键,它决定了任务的执行顺序和资源的分配方式。

在本次实验中,我们将探讨几种常见的调度算法,并通过实验对其性能进行评估和比较。

一、先来先服务算法(FCFS)先来先服务算法是最简单的调度算法之一,它按照任务到达的先后顺序进行处理。

实验中,我们模拟了一个任务队列,每个任务有不同的执行时间。

通过实验结果可以看出,FCFS算法的优点是简单易懂,但当任务的执行时间差异较大时,会导致平均等待时间较长。

二、最短作业优先算法(SJF)最短作业优先算法是一种非抢占式调度算法,它根据任务的执行时间来进行排序。

实验中,我们将任务按照执行时间从短到长进行排序,并进行调度。

实验结果显示,SJF算法的优点是能够最大程度地减少平均等待时间,但当任务的执行时间无法预测时,该算法可能会导致长任务等待时间过长的问题。

三、时间片轮转算法(RR)时间片轮转算法是一种抢占式调度算法,它将任务分为多个时间片,并按照顺序进行调度。

实验中,我们设置了每个时间片的长度,并将任务按照到达顺序进行调度。

实验结果表明,RR算法的优点是能够公平地分配资源,但当任务的执行时间超过一个时间片时,会导致上下文切换频繁,影响系统的性能。

四、最高响应比优先算法(HRRN)最高响应比优先算法是一种动态调度算法,它根据任务的等待时间和执行时间来计算响应比,并选择响应比最高的任务进行调度。

实验中,我们根据任务的到达时间、执行时间和等待时间计算响应比,并进行调度。

实验结果显示,HRRN算法能够在一定程度上平衡长任务和短任务的等待时间,但当任务的执行时间过长时,会导致其他任务的等待时间过长。

五、多级反馈队列算法(MFQ)多级反馈队列算法是一种综合性的调度算法,它将任务分为多个队列,并根据任务的执行情况进行调度。

实验中,我们设置了多个队列,并根据任务的执行时间和等待时间进行调度。

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

操作系统实验_先来先服务的调度算法及短作业优先1.引言操作系统的调度算法是指在多进程环境中,操作系统为进程分配CPU 的顺序和策略。

先来先服务(FCFS)调度算法是最简单的调度算法之一,它按照进程到达的顺序为其分配CPU。

而短作业优先(SJF)调度算法是根据进程的执行时间来为其分配CPU,执行时间越短的进程越先执行。

本文将分别介绍FCFS调度算法和SJF调度算法,并对其进行评价和比较。

2.先来先服务(FCFS)调度算法2.1调度原理FCFS调度算法的原理非常简单,按照进程到达的顺序为其分配CPU。

当一个进程进入就绪队列后,如果CPU空闲,则立即为其分配CPU。

如果CPU正忙,则进程进入等待队列,等待CPU空闲后再分配。

在该算法中,进程的运行时间不考虑,只考虑进程到达的时间。

2.2优点与缺点FCFS调度算法的主要优点是实现简单,无需对进程的运行时间进行估计。

但FCFS算法存在一定的缺点。

首先,长作业在短作业前面等待的时间较长,可能导致长作业的响应时间过长。

其次,如果有一个进程出现阻塞或响应时间过长,其后面的进程也会受到影响,造成整个系统的性能下降。

3.短作业优先(SJF)调度算法3.1调度原理短作业优先(SJF)调度算法是根据进程的执行时间来为其分配CPU。

当一个进程进入就绪队列后,如果其执行时间比当前正在运行的进程短,则优先为该进程分配CPU。

如果当前没有运行的进程或者当前运行的进程执行完毕,则立即为该进程分配CPU。

在该算法中,进程的到达时间不考虑,只考虑进程的执行时间。

3.2优点与缺点SJF调度算法的主要优点是可以最大程度地减少平均等待时间,提高系统的吞吐量。

短作业可以快速执行完毕,从而让更多的作业得以执行。

但SJF算法存在一定的缺点。

首先,需要对进程的执行时间有一个准确的估计,对于实时系统或动态系统来说,估计执行时间可能会有一定的误差。

其次,在长作业激增的情况下,短作业可能会一直得不到CPU的分配,造成长时间的等待。

先来先服务调度和最短作业优先调度算法实验报告

先来先服务调度和最短作业优先调度算法实验报告实验报告一、实验目的本实验旨在通过编写代码实现先来先服务调度算法和最短作业优先调度算法,以深入理解和掌握这两种调度算法的原理和实现方法。

二、实验方法和原理1.先来先服务调度算法(FCFS)2.最短作业优先调度算法(SJF)最短作业优先调度算法是根据作业所需的运行时间进行调度的。

当一个作业到达并获得CPU后,系统会选择剩余运行时间最短的作业进行处理,这样可以最大化地提高系统的吞吐量。

三、实验过程与结果1.先来先服务调度算法的实现我们先定义一个作业类Job,其中包含作业名称、到达时间和运行时间等属性。

首先根据到达时间对作业队列进行排序,然后按照顺序执行作业,记录每个作业的开始时间、结束时间和周转时间等指标。

下面是先来先服务调度算法的代码实现部分:```pythonclass Job: = namedef fcfs_scheduler(jobs):for job in sorted_jobs:#创建作业队列jobs =Job("Job1", 0, 3),Job("Job2", 1, 4),Job("Job3", 2, 2),Job("Job4", 4, 1)#调度作业fcfs_scheduler(jobs)#输出结果for job in jobs:```运行以上代码,会得到作业的开始时间、结束时间和周转时间等信息。

2.最短作业优先调度算法的实现最短作业优先调度算法需要知道每个作业的运行时间,而这个信息在实际情况中是未知的。

因此,我们可以先按到达时间对作业队列进行排序,然后在每个时间片中选择剩余运行时间最短的作业进行执行。

下面是最短作业优先调度算法的代码实现部分:```pythondef sjf_scheduler(jobs):while True:if not remaining_jobs:break#创建作业队列jobs =Job("Job1", 0, 3),Job("Job2", 1, 4),Job("Job3", 2, 2),Job("Job4", 4, 1)#调度作业sjf_scheduler(jobs)#输出结果for job in jobs:```运行以上代码,会得到相应的作业调度结果。

操作系统进程调度算法模拟实验

操作系统进程调度算法模拟实验进程调度是操作系统中一个重要的功能,它决定了哪些进程能够获得处理器资源以及如何按照一定的策略来分配这些资源。

为了更好地理解进程调度算法的工作原理,我们可以进行一个模拟实验来观察不同算法的表现效果。

实验设想:我们设想有5个进程要运行在一个单核处理器上,每个进程有不同的运行时间和优先级。

进程信息如下:进程A:运行时间10ms,优先级4进程B:运行时间8ms,优先级3进程C:运行时间6ms,优先级2进程D:运行时间4ms,优先级1进程E:运行时间2ms,优先级5实验步骤:1.先来先服务(FCFS)调度算法实验:将上述进程按照先来先服务的原则排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。

2.最短作业优先(SJF)调度算法实验:将上述进程按照运行时间的大小排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。

3.优先级调度算法实验:将上述进程按照优先级的大小排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。

4.时间片轮转(RR)调度算法实验:设置一个时间片大小,将上述进程按照先来先服务的原则排序,运行对应的模拟程序,观察每个进程的运行时间、完成时间和等待时间。

实验结果:通过模拟实验,我们可以得到每个进程的运行时间、完成时间和等待时间。

对于FCFS算法,进程的运行顺序是按照先来先服务的原则,因此进程A首先得到处理器资源并完成运行,其它进程依次按照到达顺序得到资源。

因此,对于进程A、B、C、D、E,它们的完成时间分别是10ms、18ms、24ms、28ms和30ms,等待时间分别是0ms、10ms、18ms、24ms和28ms。

对于SJF算法,进程的运行顺序是按照运行时间的大小,即短作业优先。

因此,进程E首先得到处理器资源并完成运行,其它进程依次按照运行时间的大小得到资源。

对于进程E、D、C、B、A,它们的完成时间分别是2ms、6ms、12ms、20ms和30ms,等待时间分别是0ms、2ms、6ms、12ms和20ms。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目先来先服务FCFS和短作业优先SJF进程调度算法姓名:学号:专业:学院:指导教师:林若宁二零一八年十一月一、实验目的模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解.二、实验内容1. 短作业优先调度算法原理短作业优先调度算法,是指对短作业或断进程优先调度的算法。

它们可以分别可以用于作业调度和进程调度。

短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。

短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

2. 先来先服务调度算法原理先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

三、程序设计1.概要设计程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果2.算法流程SJF算法流程图:3.详细设计(1)定义一个结构体typedef struct PCB{char job_id[10]; //作业IDfloat Arr_time; //到达时刻float Fun_time; //估计运行时间float Wait_time; //等待时间float Start_time; //开始时刻float Fin_time; //完成时刻float Tur_time; //周转时间float WTur_time; //带权周转时间int Order; //优先标记}list;(2)先来先服务算法函数void fcfs(list *p,int count) //先来先服务算法{list temp; //临时结构体变量int i;int j;for(i = 1;i < count;i++) //按到达时刻直接插入排序{temp = p[i];j = i-1;while(temp.Arr_time < p[j].Arr_time && j >= 0){p[j+1] = p[j];--j;}p[j+1] = temp;}for(i = 0;i < count;i++) //循环计算各个作业的时间值{if(i == 0){p[i].Start_time = p[i].Arr_time;}else{p[i].Start_time = p[i-1].Fin_time; //开始时刻==前一个作业的完成时刻}p[i].Wait_time = p[i].Start_time - p[i].Arr_time; //等待==开始-到达p[i].Fin_time = p[i].Start_time + p[i].Fun_time; //完成==开始+运行p[i].Tur_time = p[i].Fin_time - p[i].Arr_time; //周转=完成-到达p[i].WTur_time = p[i].Tur_time / p[i].Fun_time; //带权周转=周转/运行}return;}(3)最短作业优先函数void sjf(list *p,int count) //最短作业优先算法(sjf){list item; //结构体变量int i = 0;int j = 0;int k = 0; //最短运行时间作业的下标int flag = 0; //优先级设置float min = 0; //最短运行时间float temp; //开始的时刻temp = p[0].Arr_time;//先求出最先到达作业的时刻for(i = 0;i < count;i++){if(temp > p[i].Arr_time){temp = p[i].Arr_time; //保存最先到达的作业的时刻k = i; //最先到达的作业的下标,默认为p[0] }}for(i = 0;i < count;i++){p[k].Order = ++flag; //设置优先级为1,最高优先级p[k].Start_time = temp;p[k].Wait_time = temp - p[k].Arr_time; //计算各个时间p[k].Fin_time = temp + p[k].Fun_time;p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;min = 100;temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻for(j = 0;j < count;j++){if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)continue;if(min > p[j].Fun_time){min = p[j].Fun_time;k = j; //求出满足条件最短运行时间的作业的下标}}}for(i = 1;i < count;i++) //按优先级排序{item = p[i];j = i-1;while(item.Order < p[j].Order && j >= 0){p[j+1] = p[j];--j;}p[j+1] = item;}return;}四、实验结果测试数据:(1)先来先服务算法调试(2)最短作业优先算法调试五、实验小结FCFS调度算法有利于CPU繁忙型的作业,而不利于I/O繁忙型的作业(进程)。

CPU繁忙型作业是指该类作业需要大量的CPU时间进行计算,而很少请求I/O。

通常的科学计算便属于CPU繁忙型作业。

I/O繁忙型作业是指CPU进行处理时需频繁地请求I/O。

目前的大多数事务处理都属于I/O繁忙型作业。

SJ(P)F调度算法也存在不容忽视的缺点:该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。

更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。

该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。

由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

#include "stdafx.h"#include<stdio.h>#define MAX 100typedef struct PCB{char job_id[10]; //作业IDfloat Arr_time; //到达时刻float Fun_time; //估计运行时间float Wait_time; //等待时间float Start_time; //开始时刻float Fin_time; //完成时刻float Tur_time; //周转时间float WTur_time; //带权周转时间int Order; //优先标记}list;void fcfs(list *p,int count);void sjf(list *p,int count);void print(list *p,int count);void avg(list *p,int count);void fcfs(list *p,int count) //先来先服务算法{list temp; //临时结构体变量int i;int j;for(i = 1;i < count;i++) //按到达时刻直接插入排序{temp = p[i];j = i-1;while(temp.Arr_time < p[j].Arr_time && j >= 0){p[j+1] = p[j];--j;}p[j+1] = temp;}for(i = 0;i < count;i++) //循环计算各个作业的时间值{if(i == 0){p[i].Start_time = p[i].Arr_time;}else{p[i].Start_time = p[i-1].Fin_time; //开始时刻==前一个作业的完成时刻}p[i].Wait_time = p[i].Start_time - p[i].Arr_time; //等待==开始-到达p[i].Fin_time = p[i].Start_time + p[i].Fun_time; //完成==开始+运行p[i].Tur_time = p[i].Fin_time - p[i].Arr_time; //周转=完成-到达p[i].WTur_time = p[i].Tur_time / p[i].Fun_time; //带权周转=周转/运行}return;}void sjf(list *p,int count) //最短作业优先算法(sjf){list item; //结构体变量int i = 0;int j = 0;int k = 0; //最短运行时间作业的下标int flag = 0; //优先级设置float min = 0; //最短运行时间float temp; //开始的时刻temp = p[0].Arr_time;//先求出最先到达作业的时刻for(i = 0;i < count;i++){if(temp > p[i].Arr_time){temp = p[i].Arr_time; //保存最先到达的作业的时刻k = i; //最先到达的作业的下标,默认为p[0] }}for(i = 0;i < count;i++){p[k].Order = ++flag; //设置优先级为1,最高优先级p[k].Start_time = temp;p[k].Wait_time = temp - p[k].Arr_time; //计算各个时间p[k].Fin_time = temp + p[k].Fun_time;p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;min = 100;temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻for(j = 0;j < count;j++){if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)continue;if(min > p[j].Fun_time){min = p[j].Fun_time;k = j; //求出满足条件最短运行时间的作业的下标}}}for(i = 1;i < count;i++) //按优先级排序{item = p[i];j = i-1;while(item.Order < p[j].Order && j >= 0){p[j+1] = p[j];--j;}p[j+1] = item;}return;}void print(list *p,int count) //输出各个作业的详细信息{int i;printf("*****************************************************************\n");printf("ID\t到达\t运行\t等待\t开始\t完成\t周转\t带权周转\n");for(i = 0;i < count;i++){printf("%s\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n",p[i].job_id,p[i].Arr_time,p[i].Fun_time, p[i].Wait_time,p[i].Start_time,p[i].Fin_time,p[i].Tur_time,p[i].WTur_time);}return;}void avg(list *p,int count){float AvgTur1; //平均周转float AvgTur2; //平均带权周转float t1 = 0;float t2 = 0;int i;for(i = 0;i < count;i++){t1 += p[i].Tur_time; //周转时间和t2 += p[i].WTur_time; //带权周转和}AvgTur1 = t1/count;AvgTur2 = t2/count;printf("\n平均周转时间为:%f\t平均带权周转时间为:%f\n",AvgTur1,AvgTur2);printf("\n*****************************************************************\n");return;int main(){list st[MAX]; //最多可以一百个作业int job_count = 0; //作业数量int flag = 1; //算法标记int i = 0;printf("请输入作业数量:");scanf("%d",&job_count);printf("请输入作业ID,到达时刻,估计运行时间(用空格隔开):\n");do{scanf("%s %f %f",st[i].job_id,&st[i].Arr_time,&st[i].Fun_time);st[i].Order = 0; //优先级初始化}while(++i < job_count);printf("请选择算法:\n1, 先来先服务算法!\n2, 最短作业优先算法!\n");scanf("%d",&flag);switch(flag){case 1 : {fcfs(st,job_count);printf("\n*******************************************\n\n");printf("先来先服务算法\n");} break;case 2 : {sjf(st,job_count);printf("\n*******************************************\n\n");printf("最短作业优先算法\n");.} break;}print(st,job_count);avg(st,job_count);return 0;}。

相关文档
最新文档