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

合集下载

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

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

实验报告说明
1.实验项目名称:要用最简练的语言反映实验的内容。

要求与实验指导书中相一致。

2.实验类型:一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。

3.实验目的与要求:目的要明确,要抓住重点,符合实验指导书中的要求。

4.实验原理:简要说明本实验项目所涉及的理论知识。

5.实验环境:实验用的软硬件环境(配置)。

6.实验方案设计(思路、步骤和方法等):这是实验报告极其重要的内容。

概括整个实验过程。

对于操作型实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。

对于设计型和综合型实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。

对于创新型实验,还应注明其创新点、特色。

7.实验过程(实验中涉及的记录、数据、分析):写明具体上述实验方案的具体实施,包括实验过程中的记录、数据和相应的分析。

8.结论(结果):即根据实验过程中所见到的现象和测得的数据,做出结论。

9.小结:对本次实验的心得体会、思考和建议。

10.指导教师评语及成绩:指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值。

注意:
实验报告将记入实验成绩;
每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。

常用的调度算法

常用的调度算法

常用的调度算法调度算法是指操作系统中用于决定进程何时执行、何时暂停等的一种算法。

常用的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转等。

下面将对这些常用的调度算法进行详细介绍。

一、先来先服务(FCFS)先来先服务是最简单的调度算法之一,它按照进程到达的顺序进行调度,即谁先到谁先执行。

这种算法容易实现,但是存在“饥饿”现象,即如果某个进程长时间等待,则其他进程可能会一直占用CPU资源,导致该进程无法得到执行。

因此,在实际应用中,FCFS很少被使用。

二、短作业优先(SJF)短作业优先是一种以作业运行时间为依据的调度算法。

它通过预测每个进程需要运行的时间,并将其按照运行时间从小到大排序,然后依次执行。

这种算法可以最大限度地减少平均等待时间和平均周转时间,并且不会出现“饥饿”现象。

但是,在实际应用中,由于很难准确预测每个进程需要运行的时间,因此SJF也存在缺陷。

如果预测不准确,那么就会出现长作业等待短作业的情况,导致长作业的等待时间变长。

三、优先级调度优先级调度是一种按照进程优先级进行调度的算法。

每个进程都有一个优先级,系统会根据进程的优先级来决定下一个要执行的进程。

通常情况下,优先级越高的进程越有可能得到CPU资源。

但是,如果某个进程的优先级一直比其他进程高,那么其他进程就会一直等待,导致“饥饿”现象。

此外,在实际应用中,由于不同进程之间的优先级差别较大,因此可能会导致低优先级的进程长时间等待。

四、时间片轮转时间片轮转是一种按照时间片进行调度的算法。

它将CPU资源划分成若干个时间片,并将每个时间片分配给一个正在运行或等待运行的进程。

当一个进程用完了它所分配到的时间片后,系统会将其挂起,并将CPU资源分配给下一个等待运行的进程。

这种算法可以避免“饥饿”现象,并且能够保证所有正在运行或等待运行的进程都能够得到CPU资源。

但是,如果时间片太小,会导致进程频繁切换,影响系统性能;如果时间片太大,会导致长作业等待时间变长。

操作系统中常用作业调度算法的分析

操作系统中常用作业调度算法的分析

操作系统中常用作业调度算法的分析作业调度算法是操作系统中非常重要的一部分,它负责决定哪个进程应该被调度执行、以及在什么时候执行。

不同的作业调度算法会对系统的性能和资源利用率产生不同的影响,因此了解和分析常用的作业调度算法对于优化系统性能至关重要。

在操作系统中,常用的作业调度算法包括先来先服务(FCFS)、短作业优先(SJF)、最高响应比优先(HRRN)、优先级调度、轮转调度和多级反馈队列调度等。

下面对这些常见的作业调度算法进行详细分析。

1. 先来先服务(FCFS)先来先服务是最简单的作业调度算法之一,它按照作业到达的先后顺序来进行调度。

当一个作业到达系统后,系统会将其放入就绪队列,然后按照先来先服务的原则,依次执行队列中的作业。

FCFS算法的优点是实现简单、公平性好,但缺点也非常明显。

由于该算法没有考虑作业的执行时间,因此可能导致长作业等待时间过长,影响系统的响应时间和吞吐量。

2. 短作业优先(SJF)短作业优先算法是一种非抢占式作业调度算法,它会根据作业的执行时间来进行调度。

当一个作业到达系统后,系统会根据其执行时间与就绪队列中其他作业的执行时间进行比较,选取执行时间最短的作业进行执行。

SJF算法的优点是能够最大程度地减少平均等待时间,提高系统的响应速度和吞吐量。

但这种算法也存在缺陷,即当有长作业不断地进入系统时,可能导致短作业一直得不到执行,进而影响系统的公平性。

3. 最高响应比优先(HRRN)最高响应比优先算法是一种动态优先级调度算法,它根据作业的响应比来进行调度。

作业的响应比定义为(等待时间+服务时间)/ 服务时间,响应比越高的作业被优先调度执行。

HRRN算法的优点是能够最大程度地提高系统的响应速度,同时保持较高的公平性。

但由于需要不断地计算和更新作业的响应比,因此算法的复杂度较高。

4. 优先级调度优先级调度算法是一种静态优先级调度算法,它根据作业的优先级来进行调度。

每个作业在进入系统时就会被赋予一个优先级,系统会按照作业的优先级来决定执行顺序。

调度算法C语言实现

调度算法C语言实现

调度算法C语言实现调度算法是操作系统中的重要内容之一,它决定了进程在系统中的运行方式和顺序。

本文将介绍两种常见的调度算法,先来先服务(FCFS)和最短作业优先(SJF),并用C语言实现它们。

一、先来先服务(FCFS)调度算法先来先服务(FCFS)调度算法是最简单的调度算法之一、它按照进程到达的先后顺序进行调度,即谁先到达就先执行。

实现这个算法的关键是记录进程到达的顺序和每个进程的执行时间。

下面是一个用C语言实现先来先服务调度算法的示例程序:```c#include <stdio.h>//进程控制块结构体typedef structint pid; // 进程IDint arrivalTime; // 到达时间int burstTime; // 执行时间} Process;int maiint n; // 进程数量printf("请输入进程数量:");scanf("%d", &n);//输入每个进程的到达时间和执行时间Process process[n];for (int i = 0; i < n; i++)printf("请输入进程 %d 的到达时间和执行时间:", i);scanf("%d%d", &process[i].arrivalTime,&process[i].burstTime);process[i].pid = i;}//根据到达时间排序进程for (int i = 0; i < n - 1; i++)for (int j = i + 1; j < n; j++)if (process[i].arrivalTime > process[j].arrivalTime) Process temp = process[i];process[i] = process[j];process[j] = temp;}}}//计算平均等待时间和平均周转时间float totalWaitingTime = 0; // 总等待时间float totalTurnaroundTime = 0; // 总周转时间int currentTime = 0; // 当前时间for (int i = 0; i < n; i++)if (currentTime < process[i].arrivalTime)currentTime = process[i].arrivalTime;}totalWaitingTime += currentTime - process[i].arrivalTime;totalTurnaroundTime += (currentTime + process[i].burstTime) - process[i].arrivalTime;currentTime += process[i].burstTime;}//输出结果float avgWaitingTime = totalWaitingTime / n;float avgTurnaroundTime = totalTurnaroundTime / n;printf("平均等待时间:%f\n", avgWaitingTime);printf("平均周转时间:%f\n", avgTurnaroundTime);return 0;```以上程序实现了先来先服务(FCFS)调度算法,首先根据进程的到达时间排序,然后依次执行每个进程,并计算总等待时间和总周转时间。

作业调度算法(先来先服务算法,短作业算法)

作业调度算法(先来先服务算法,短作业算法)

题目:作业调度算法班级:网络工程姓名:朱锦涛学号:E一、实验目的用代码实现页面调度算法,即先来先服务(FCFS)调度算法、短作业优先算法、高响应比优先调度算法。

通过代码的具体实现,加深对算法的核心的理解。

二、实验原理1.先来先服务(FCFS)调度算法FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。

然后把它放入就绪队列。

2.短作业优先算法SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。

作业的长短是以作业所要求的运行时间来衡量的。

SJF算法可以分别用于作业和进程调度。

在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存。

3、高响应比优先调度算法高响应比优先调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间的算法,因此既照顾了短作业,又不致使长作业等待的时间过长,从而改善了处理机调度的性能。

如果我们引入一个动态优先级,即优先级是可以改变的令它随等待的时间的延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。

该优先级的变化规律可以描述为:优先权 = (等待时间 + 要求服务时间)/要求服务时间三、实验内容源程序:#include<>#include<>#include<>struct work{i nt id;i nt arrive_time;i nt work_time;i nt wait;f loat priority;typedef struct sjf_work{s truct work s_work; d = rand()%10;w[i].arrive_time = rand()%10;w[i].work_time = rand()%10+1;}f or(j=0;j<5;j++){printf("第%d个作业的编号是:%d\t",j+1,w[j].id);printf("第%d个作业到达时间:%d\t",j+1,w[j].arrive_time);printf("第%d个作业服务时间:%d\t",j+1,w[j].work_time);printf("\n");for(j=1;j<5;j++)for(k=0;k<5-j;k++){if(w[k].arrive_time > w[k+1].arrive_time) {temp = w[k];w[k] = w[k+1];w[k+1] = temp;}}printf("\n");w_finish_time[0] = w[0].arrive_time +w[0].work_time;for(j=0;j<5;j++){if(w_finish_time[j] < w[j+1].arrive_time){w_finish_time[j+1] = w[j+1].arrive_time + w[j+1].work_time;}elsew_finish_time[j+1] = w_finish_time[j] +w[j+1].work_time;}for(j=0;j<5;j++)w_rel_time[j] = w_finish_time[j] -w[j].arrive_time;for(j=0;j<5;j++){rel_time += w_rel_time[j];}for(j=0;j<5;j++){printf("第%d个系统执行的作业到达时间:%d ",j+1,w[j].arrive_time);printf("编号是:%d ",w[j].id);printf("服务时间是:%d ",w[j].work_time);printf("完成时间是:%d ",w_finish_time[j]);printf("周转时间是:%d ",w_rel_time[j]);printf("\n");}printf("平均周转时间:%f\n",rel_time/5); }void SJF(){i nt w_rel_time[10];i nt w_finish_time[10];f loat rel_time = 0;s rand(time(0));i nt i;i nt j = 0;P NODE pHead = (PNODE)malloc(sizeof(NODE));i f (NULL == pHead){printf("分配失败, 程序终止!\n");exit(-1);P NODE pTail = pHead;p Tail->pNext = NULL; 来先服务算法该算法严格按照各作业到达时间来为其分配进程和资源,实验的结果见截图,最后算出该算法五个作业的平均周转时间。

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

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

操作系统实验_先来先服务的调度算法及短作业优先先来先服务调度算法是一种非抢占式的调度算法,它按照作业到达的先后顺序将作业分配给CPU。

具体来说,当一个作业进入就绪队列时,调度程序将把它放在队列的末尾,然后从队列的头部选择一个作业执行。

只有当一个作业执行完成后,作业队列的头部才会选择下一个作业执行。

先来先服务调度算法的优点是简单易实现,没有复杂的排序操作,适用于短作业和长作业混合的场景。

其缺点是没有考虑作业的执行时间,导致长作业会占用CPU很长时间,影响其他作业的响应时间。

短作业优先调度算法是一种抢占式的调度算法,它根据作业的执行时间选择优先级。

具体来说,当一个作业进入就绪队列时,调度程序会比较该作业的执行时间和其他就绪作业的执行时间,并选择执行时间最短的作业执行。

如果有一个新的作业到达,且其执行时间比当前执行的作业要短,那么调度程序会中断当前作业的执行并切换到新的作业执行。

短作业优先调度算法的优点是能够最大程度上减少作业的等待时间和响应时间,提高系统的吞吐量。

其缺点是需要对作业的执行时间有较准确的估计,否则可能导致长作业陷入饥饿状态。

此外,由于需要频繁进行作业的切换,短作业优先调度算法在实现上相对复杂。

在实际应用中,先来先服务调度算法适用于短作业和长作业混合的场景,或者作业的执行时间无法估计准确的情况下。

例如,在批处理系统中,作业的执行时间往往是固定的,先来先服务调度算法可以保证公平性,并且能够有效利用CPU资源。

而短作业优先调度算法适用于多任务环境下,作业的执行时间可以估计准确的情况下。

例如,在交互式系统中,用户的操作往往是短暂的,短作业优先调度算法可以最大限度地减少用户的等待时间,提高系统的响应速度。

总之,先来先服务调度算法和短作业优先调度算法是操作系统中常用的两种调度算法。

它们分别适用于不同的应用场景,在实际应用中可以根据具体需求选择不同的调度算法。

几种操作系统调度算法

几种操作系统调度算法

几种操作系统调度算法操作系统调度算法是操作系统中用于确定进程执行的顺序和优先级的一种方法。

不同的调度算法有不同的优缺点,适用于不同的场景和需求。

下面将介绍几种常见的操作系统调度算法:1.先来先服务(FCFS)调度算法:先来先服务调度算法是最简单的调度算法之一、按照进程到达的顺序进行调度,首先到达的进程先执行,在CPU空闲时执行下一个进程。

这种算法实现简单,并且公平。

但是,由于没有考虑进程的执行时间,可能会导致长作业时间的进程占用CPU资源较长时间,从而影响其他进程的响应时间。

2.短作业优先(SJF)调度算法:短作业优先调度算法是根据进程的执行时间进行排序,并按照执行时间最短的进程优先执行。

这种算法可以减少平均等待时间,提高系统的吞吐量。

然而,对于长作业时间的进程来说,等待时间会相对较长。

3.优先级调度算法:优先级调度算法是根据每个进程的优先级来决定执行顺序的。

优先级可以由用户设置或者是根据进程的重要性、紧迫程度等因素自动确定。

具有较高优先级的进程将具有更高的执行优先级。

这种算法可以根据不同情况进行灵活调度,但是如果不恰当地设置优先级,可能会导致低优先级的进程长时间等待。

4.时间片轮转(RR)调度算法:时间片轮转调度算法将一个固定的时间片分配给每个进程,当一个进程的时间片用完时,将该进程挂起,调度下一个进程运行。

这种算法可以确保每个进程获得一定的CPU时间,提高系统的公平性和响应速度。

但是,对于长时间运行的进程来说,可能会引起频繁的上下文切换,导致额外的开销。

5.多级反馈队列(MFQ)调度算法:多级反馈队列调度算法将进程队列划分为多个优先级队列,每个队列有不同的时间片大小和优先级。

新到达的进程被插入到最高优先级队列,如果进程在时间片内没有完成,则被移到下一个较低优先级队列。

这种算法可以根据进程的执行表现自动调整优先级和时间片,更好地适应动态变化的环境。

以上是几种常见的操作系统调度算法,每种算法都有其优缺点和适用场景。

作业调度算法先来先服务算法短作业算法页

作业调度算法先来先服务算法短作业算法页

作业调度算法: 先来先服务算法、短作业优先算法引言在计算机操作系统中,作业调度算法是一种重要的技术,用于管理和调度计算机系统中的作业。

作业调度算法决定了如何分配计算机资源,以便最大化系统的效率和吞吐量。

本文将介绍两种常见的作业调度算法:先来先服务算法(First Come First Serve,FCFS)和短作业优先算法(Shortest Job First,SJF)。

先来先服务算法(FCFS)先来先服务算法是最简单的作业调度算法之一。

按照作业提交的顺序进行调度,先提交的作业先执行,后提交的作业则等待。

这种调度算法不考虑作业的执行时间或优先级,只根据作业提交的先后顺序来进行调度。

算法流程1.将作业按照提交的先后顺序排列。

2.按照排列顺序执行作业。

优点•算法实现简单,易于理解和实现。

•适用于短作业或者作业提交顺序代表了作业的优先级的情况。

缺点•短作业可能因为长作业的存在而等待时间过长,导致响应时间较长。

•不考虑作业执行时间,可能导致平均等待时间和平均周转时间较长。

•无法适应不同作业的执行时间需求。

短作业优先算法(SJF)短作业优先算法是一种将作业按照执行时间长度进行排序的作业调度算法。

在短作业优先算法中,最短执行时间的作业先执行,以此类推。

该算法可以最大程度地减少作业的等待时间和周转时间。

算法流程1.将作业按照执行时间长度从短到长进行排序。

2.按照排列顺序执行作业。

优点•可以最大程度地减少作业的等待时间和周转时间。

•适用于短作业和长作业相互混合的情况。

缺点•难以准确估计作业的执行时间,可能导致长作业等待时间过长。

•需要预先知道作业的执行时间长度才能进行排序。

•不适用于长作业占主导地位的情况。

性能对比与选择先来先服务算法和短作业优先算法都有其优点和缺点。

选择合适的算法取决于具体的应用场景和需求。

•如果作业都很短,并且没有严格的截止时间要求,先来先服务算法可以简单高效地满足需求。

•如果作业的执行时间非常重要,并且具有较严格的截止时间要求,短作业优先算法可以最大程度地减少作业的等待时间和周转时间。

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

学号P7******* 专业计算机科学与技术姓名实验日期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算法流程图2)SJF算法流程图程序#include <stdio.h>struct fcfs//定义进程的结构体{char name[10]; //进程名float arrivetime; //到达时间float servicetime; //服务时间float starttime;//开始时间float finishtime;//完成时间float zztime;//周转时间float dqzztime;//带权周转时间};floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzz time=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",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}//输出函数void FPrint(fcfs *p,int N)//输出函数{int k;printf("\n执行顺序:\n");printf("%s",p[0].name);for(k=1; k<N; k++){printf("-%s",p[k].name);}printf("\n进程名\t到达时间\t服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n\n");for(k=0; k<=N-1; k++){printf("%s\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\t\n\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}}void Fsort(fcfs *p,int N) //按到达时间排序,先到达排在前面{for(int i=0; i<=N-1; i++)for(int j=0; j<=i; j++)if(p[i].arrivetime<p[j].arrivetime)//进行排序,如果先到达就排在前面{fcfs temp;temp=p[i];p[i]=p[j];p[j]=temp;}} //运行结果void F_method(fcfs *p, int N){int k;for(k=0; k<=N-1; k++){if(k==0){p[k].starttime=p[k].arrivetime;//如果是第一个进程,开始时间等于到达时间p[k].finishtime=p[k].arrivetime+p[k].servicetime;//结束时间等于到达时间加上服务时间}else{p[k].starttime=p[k-1].finishtime; //开始时间=上一个一个进程的完成时间p[k].finishtime=p[k].starttime+p[k].servicetime;//结束时间=开始时间加上+现在进程的服务时间}}for(k=0; k<=N-1; k++) //求每个进程的信息{p[k].zztime=p[k].finishtime-p[k].arrivetime; //周转时间=完成时间-到达时间p[k].dqzztime=p[k].zztime/p[k].servicetime; //带权周转时间=周转时间/服务时间}}void F_method2(fcfs *p,int N) //短作业优先核心程序{int num;int arrive=65535; //寻找最早到达的进程int min_serive=65535; //寻找最小服务时间进程int i;fcfs b[100]; //新建一个,进行排序int state[100];//设置100个标志位for( i=0; i<N; i++)state[i]=0;for(i=0; i<N; i++)if(p[i].arrivetime<arrive){ arrive=p[i].arrivetime;num=i;}b[0]=p[num];state[num]=1;b[0].finishtime=b[0].arrivetime+b[0].servicetime;int j=0;for(int k=1; k<N; k++){ min_serive=65535;for(i=0; i<N; i++){if(state[i]==1||p[i].arrivetime>b[j].finishtime)//如果遇到已排序或者未到达的进程跳过continue;else if(p[i].servicetime<min_serive){min_serive=p[i].servicetime;num=i;}}state[num]=1; //找到合适的进程并赋值到Bb[++j]=p[num];b[j].starttime=b[j-1].finishtime;b[j].finishtime=b[j-1].finishtime+b[j].servicetime;}for(j=0; j<=N-1; j++) //求每个进程的信息{b[j].zztime= b[j].finishtime- b[j].arrivetime; //周转时间=完成时间-到达时间b[j].dqzztime= b[j].zztime/ b[j].servicetime; //带权周转时间=周转时间/服务时间}for(j=0; j<N; j++)p[j]=b[j];}//先来先服务void FCFS(fcfs *p,int N){Fsort(p,N);//对每个进程排序F_method(p,N);FPrint(p,N);}void SJF(fcfs *p,int N){F_method2(p,N);FPrint(p,N);}int main() //主函数{int N;printf("输入进程数:");scanf("%d",&N);Finput(a,N);printf("先来先服务\n");FCFS(a,N);printf("\n\n\n");printf("短作业优先\n");SJF(a,N);return 0;}【小结或讨论】1.能实现的功能输入进程个数Num,每个进程到达时间ArrivalTime[i],服务时间ServiceTime[i]。

采用先来先服务FCFS或者短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计Num个进程的平均周转时间和平均带权周转时间。

2、FCFS算法相对于SJF算法来说,比较简单,在FCFS算法中,主要用到的是队列,按照作业的到达时间来进行排序排序算法。

相关文档
最新文档