先来先服务调度算法和短作业优先调度算法
- 格式:doc
- 大小:172.00 KB
- 文档页数:8
常用的调度算法调度算法是指操作系统中用于决定进程何时执行、何时暂停等的一种算法。
常用的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转等。
下面将对这些常用的调度算法进行详细介绍。
一、先来先服务(FCFS)先来先服务是最简单的调度算法之一,它按照进程到达的顺序进行调度,即谁先到谁先执行。
这种算法容易实现,但是存在“饥饿”现象,即如果某个进程长时间等待,则其他进程可能会一直占用CPU资源,导致该进程无法得到执行。
因此,在实际应用中,FCFS很少被使用。
二、短作业优先(SJF)短作业优先是一种以作业运行时间为依据的调度算法。
它通过预测每个进程需要运行的时间,并将其按照运行时间从小到大排序,然后依次执行。
这种算法可以最大限度地减少平均等待时间和平均周转时间,并且不会出现“饥饿”现象。
但是,在实际应用中,由于很难准确预测每个进程需要运行的时间,因此SJF也存在缺陷。
如果预测不准确,那么就会出现长作业等待短作业的情况,导致长作业的等待时间变长。
三、优先级调度优先级调度是一种按照进程优先级进行调度的算法。
每个进程都有一个优先级,系统会根据进程的优先级来决定下一个要执行的进程。
通常情况下,优先级越高的进程越有可能得到CPU资源。
但是,如果某个进程的优先级一直比其他进程高,那么其他进程就会一直等待,导致“饥饿”现象。
此外,在实际应用中,由于不同进程之间的优先级差别较大,因此可能会导致低优先级的进程长时间等待。
四、时间片轮转时间片轮转是一种按照时间片进行调度的算法。
它将CPU资源划分成若干个时间片,并将每个时间片分配给一个正在运行或等待运行的进程。
当一个进程用完了它所分配到的时间片后,系统会将其挂起,并将CPU资源分配给下一个等待运行的进程。
这种算法可以避免“饥饿”现象,并且能够保证所有正在运行或等待运行的进程都能够得到CPU资源。
但是,如果时间片太小,会导致进程频繁切换,影响系统性能;如果时间片太大,会导致长作业等待时间变长。
关于作业调度算法作业调度算法是指在计算机系统中对作业进行合理安排和调度的一种方法。
作业调度算法的目标是优化系统资源的利用,提高作业的响应时间和吞吐量,提高系统的整体性能。
在实际应用中,作业调度算法起着至关重要的作用。
作业调度算法有很多种,每种算法都有其适用的场景和特点。
下面将介绍几种常见的作业调度算法。
1.先来先服务(FCFS)算法:先来先服务算法是通过按照作业到达的顺序进行调度的算法。
简单来说,就是按照作业提交的先后顺序进行调度。
这种算法的特点是简单、公平,但是对于作业的响应时间和系统的吞吐量效果较差。
2.短作业优先(SJF)算法:短作业优先算法是根据作业的执行时间进行调度的算法。
它的原理是,执行时间短的作业能够更快地完成,从而能够提高系统的响应时间和吞吐量。
然而,这种算法容易导致长作业等待时间过长,从而影响长作业的执行效率。
3.最高响应比优先(HRRN)算法:最高响应比优先算法是根据作业的等待时间和执行时间的比值进行调度的算法。
它的原理是,等待时间长的作业和执行时间短的作业都有更高的响应比,因此优先调度等待时间长的作业。
这种算法能够兼顾作业的响应时间和系统的吞吐量。
4.时间片轮转(RR)算法:时间片轮转算法是指将CPU的执行时间分成多个时间片,每个时间片的长度固定,作业按照时间片的顺序进行调度。
当作业的执行时间超过一个时间片时,将被放入一个等待队列,并在下一个时间片重新调度。
这种算法能够保证每个作业都能获得一定的执行时间,但不能很好地兼顾作业的响应时间。
5.最短剩余时间(SRT)算法:最短剩余时间算法是在短作业优先算法的基础上进行优化得到的。
在该算法中,系统会根据当前作业的执行时间和剩余执行时间来选择下一个要执行的作业。
这种算法能够更加准确地估计作业的完成时间,从而提高系统的响应时间和吞吐量。
除了以上几种常见的作业调度算法,还有很多其他的算法可以根据系统的特点和需求进行选择和优化,如最短作业优先(SJN)算法、优先级调度算法、多级反馈队列调度算法等。
作业调度算法之短作业优先调度算法和先来先服务调度算法假设有四个作业,他们的提交、运⾏时间如下表所⽰。
请回答下列问题:
(1)若采⽤短作业优先调度算法,求作业运⾏顺序和平均带权周转时间为多少?
(2)若采⽤先来先服务调度算法,求作业运⾏顺序和平均带权周转时间为多少?
作业号到达时间运⾏时间
18.0 2.0
28.30.5
38.50.4
48.70.1
解:
(1)短作业优先调度算法,作业运⾏顺序:4,3,2,1
(2)先来先服务调度算法,作业运⾏顺序:1,2,3,4
作业号1234
到达时间8.08.38.58.7
运⾏时间 2.00.50.40.1
短作业优先调度算法
完成时刻11.79.79.28.8周转时间 3.7 1.40.70.1带权周转时间 1.85 1.751平均带全周转时间 1.85
先来先服务调度算法
完成时刻1010.510.911周转时间2 2.2 2.4 2.3带权周转时间1 4.4623平均带全周转时间8.6
注:周转时间= 完成时刻—到达时刻带权周转时间= 周转时间/运⾏时间。
操作系统实验_先来先服务的调度算法及短作业优先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的分配,造成长时间的等待。
操作系统中常用作业调度算法的分析作业调度是操作系统中的一个重要组成部分,它负责对待执行的作业进行排队和调度,以最大化系统资源的利用效率、满足用户需求、保证系统稳定性等目标。
常见的作业调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度、时间片轮转(RR)等,接下来我们分别对这几种算法进行分析。
1. FCFS调度算法先来先服务调度算法是操作系统中最简单的一种调度算法,也是最常用的一种调度算法。
它的处理方式是根据提交时间顺序,按照FIFO的顺序进行调度。
该算法的优点是简单易用,而且很容易实现。
同时,对于大多数情况下,该算法的资源分配相对公平。
但是,该算法存在着一些问题。
当一个作业的执行时间较长时,会大大降低系统的吞吐量,严重影响系统的效率。
因此,在实际应用中,该算法往往不能满足对作业的实时响应和高效完成的要求。
最短作业优先调度算法是一种非抢占式调度算法,它将作业按照其需要执行的时间长短大小进行排序,然后从执行时间最短的作业开始调度。
在实际应用中,该算法可以减少平均等待时间和平均周转时间,提高系统的效率和性能。
但是,该算法有个致命的缺点——它无法预测作业的执行时间。
如果一个长作业被排在了等待队列的前面,那么所有后续的短作业都要等待非常长的时间,这可能导致饥饿现象的出现。
3. 优先级调度算法优先调度算法是一种根据作业优先级大小进行调度的算法,可以根据作业的重要程度或紧急程度来设置不同的优先级。
该算法可以提高系统的响应速度和稳定性,满足系统特定的需求。
但是,该算法也存在着一些问题。
如果一个作业的优先级太高,那么其余的作业可能会一直处于等待状态,这种情况也会导致饥饿现象的出现。
此外,该算法的优先级设置需要有一定的经验和技巧,否则可能会对系统的性能产生不良影响。
4. 时间片轮转算法时间片轮转算法是一种循环调度算法,它将CPU的时间分成多个固定大小的时间片,然后在每个时间片内轮流执行等待队列中的作业,以便平均分配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:```运行以上代码,会得到相应的作业调度结果。
调度算法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)调度算法,首先根据进程的到达时间排序,然后依次执行每个进程,并计算总等待时间和总周转时间。
先来先服务调度算法和短作业优先调度算法#include <stdio.h>struct fcfs{//定义进程的结构体char name[10]; float arrivetime; float servicetime;// 进程名// 到达时间// 服务时间float starttime; float finishtime;//开始时间// 完成时间float zztime; float dqzztime;//周转时间// 带权周转时间};struct sjf{//定义进程的结构体char name[10]; float arrivetime; float servicetime;// 进程名// 到达时间// 服务时间float starttime; float finishtime;//开始时间// 完成时间float zztime; float dqzztime;//周转时间// 带权周转时间};fcfs a[100];//定义先来先服务算法进程的最大数量sjf b[100];// 定义短作业优先算法进程的最大数量void Finput(fcfs *p,int N){// 输入函数int i;printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n");for(i=0;i<=N-1;i++){printf("input the %dth process's information:\n",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}//输出函数void FPrint(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("\nrun order:\n");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\n\nthe process's information:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n\n",p[k].name,p[k].arrivetime,p[k].ser vicetime,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 Fdeal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,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-1].finishtime+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 FCFS(fcfs *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;Fsort(p,N);Fdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);FPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);}void Sinput(sjf *p,int N){// 输入函数int i;printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n\n");for(i=0;i<=N-1;i++){printf("input the %dth process's information:\n",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}//输出函数void SPrint(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("\nrun order:\n");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\n\nthe process's information:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n\n",p[k].name,p[k].arrivetime,p[k].ser vicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}}void Ssort(sjf *p,int N)//按短作业优先算法排序{for(int i=1;i<=N-1;i++)for(int j=1;j<=i;j++)if(p[i].servicetime<p[j].servicetime){sjf temp;temp=p[i];p[i]=p[j];p[j]=temp;}}//运行结果void Sdeal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,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-1].finishtime+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 SJF(sjf *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;Ssort(p,N);Sdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);SPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);}void main(){// 主函数while(1){int n;printf(" 选择哪种算法? 1、先来先服务算法( FCFS) 2、段作业优先算法( SJF)\n");scanf("%d",&n);if(n==1)//先来先服务算法(FCFS){int N;printf("------先来先服务调度算法------\n");printf("input the process's number:\n");scanf("%d",&N);Finput(a,N);FCFS(a,N);}if(n==2)//短作业优先算法(SJF){int M;printf("------ 短作业优先调度算法------\n");printf("input the process's number:\n");scanf("%d",&M);Sinput(b,M);SJF(b,M);}char o;printf(" 继续工作吗?(Y/N):");scanf("%s",&o);if(o=='Y')continue;if(o=='N')break;}}。
操作系统实验_先来先服务的调度算法及短作业优先先来先服务调度算法是一种非抢占式的调度算法,它按照作业到达的先后顺序将作业分配给CPU。
具体来说,当一个作业进入就绪队列时,调度程序将把它放在队列的末尾,然后从队列的头部选择一个作业执行。
只有当一个作业执行完成后,作业队列的头部才会选择下一个作业执行。
先来先服务调度算法的优点是简单易实现,没有复杂的排序操作,适用于短作业和长作业混合的场景。
其缺点是没有考虑作业的执行时间,导致长作业会占用CPU很长时间,影响其他作业的响应时间。
短作业优先调度算法是一种抢占式的调度算法,它根据作业的执行时间选择优先级。
具体来说,当一个作业进入就绪队列时,调度程序会比较该作业的执行时间和其他就绪作业的执行时间,并选择执行时间最短的作业执行。
如果有一个新的作业到达,且其执行时间比当前执行的作业要短,那么调度程序会中断当前作业的执行并切换到新的作业执行。
短作业优先调度算法的优点是能够最大程度上减少作业的等待时间和响应时间,提高系统的吞吐量。
其缺点是需要对作业的执行时间有较准确的估计,否则可能导致长作业陷入饥饿状态。
此外,由于需要频繁进行作业的切换,短作业优先调度算法在实现上相对复杂。
在实际应用中,先来先服务调度算法适用于短作业和长作业混合的场景,或者作业的执行时间无法估计准确的情况下。
例如,在批处理系统中,作业的执行时间往往是固定的,先来先服务调度算法可以保证公平性,并且能够有效利用CPU资源。
而短作业优先调度算法适用于多任务环境下,作业的执行时间可以估计准确的情况下。
例如,在交互式系统中,用户的操作往往是短暂的,短作业优先调度算法可以最大限度地减少用户的等待时间,提高系统的响应速度。
总之,先来先服务调度算法和短作业优先调度算法是操作系统中常用的两种调度算法。
它们分别适用于不同的应用场景,在实际应用中可以根据具体需求选择不同的调度算法。
几种操作系统调度算法操作系统调度算法是操作系统中用于确定进程执行的顺序和优先级的一种方法。
不同的调度算法有不同的优缺点,适用于不同的场景和需求。
下面将介绍几种常见的操作系统调度算法:1.先来先服务(FCFS)调度算法:先来先服务调度算法是最简单的调度算法之一、按照进程到达的顺序进行调度,首先到达的进程先执行,在CPU空闲时执行下一个进程。
这种算法实现简单,并且公平。
但是,由于没有考虑进程的执行时间,可能会导致长作业时间的进程占用CPU资源较长时间,从而影响其他进程的响应时间。
2.短作业优先(SJF)调度算法:短作业优先调度算法是根据进程的执行时间进行排序,并按照执行时间最短的进程优先执行。
这种算法可以减少平均等待时间,提高系统的吞吐量。
然而,对于长作业时间的进程来说,等待时间会相对较长。
3.优先级调度算法:优先级调度算法是根据每个进程的优先级来决定执行顺序的。
优先级可以由用户设置或者是根据进程的重要性、紧迫程度等因素自动确定。
具有较高优先级的进程将具有更高的执行优先级。
这种算法可以根据不同情况进行灵活调度,但是如果不恰当地设置优先级,可能会导致低优先级的进程长时间等待。
4.时间片轮转(RR)调度算法:时间片轮转调度算法将一个固定的时间片分配给每个进程,当一个进程的时间片用完时,将该进程挂起,调度下一个进程运行。
这种算法可以确保每个进程获得一定的CPU时间,提高系统的公平性和响应速度。
但是,对于长时间运行的进程来说,可能会引起频繁的上下文切换,导致额外的开销。
5.多级反馈队列(MFQ)调度算法:多级反馈队列调度算法将进程队列划分为多个优先级队列,每个队列有不同的时间片大小和优先级。
新到达的进程被插入到最高优先级队列,如果进程在时间片内没有完成,则被移到下一个较低优先级队列。
这种算法可以根据进程的执行表现自动调整优先级和时间片,更好地适应动态变化的环境。
以上是几种常见的操作系统调度算法,每种算法都有其优缺点和适用场景。
先来先服务调度算法和短作业优先调度算法#include <stdio.h>struct fcfs //定义进程的结构体{char name[10]; //进程名float arrivetime; //到达时间float servicetime; //服务时间float starttime; //开始时间float finishtime; //完成时间float zztime; //周转时间float dqzztime; //带权周转时间};struct sjf //定义进程的结构体{char name[10]; //进程名float arrivetime; //到达时间float servicetime; //服务时间float starttime; //开始时间float finishtime; //完成时间float zztime; //周转时间float dqzztime; //带权周转时间};fcfs a[100]; //定义先来先服务算法进程的最大数量sjf b[100]; //定义短作业优先算法进程的最大数量void Finput(fcfs *p,int N) //输入函数{int i;printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n");for(i=0;i<=N-1;i++){printf("input the %dth process's information:\n",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}//输出函数void FPrint(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("\nrun order:\n");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\n\nthe process's information:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n\n",p[k].name,p[k].arrivetime,p[k].ser vicetime,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 Fdeal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,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-1].finishtime+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 FCFS(fcfs *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;Fsort(p,N);Fdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);FPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);}void Sinput(sjf *p,int N) //输入函数{int i;printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n\n");for(i=0;i<=N-1;i++){printf("input the %dth process's information:\n",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}//输出函数void SPrint(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("\nrun order:\n");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\n\nthe process's information:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n\n",p[k].name,p[k].arrivetime,p[k].ser vicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}}void Ssort(sjf *p,int N) //按短作业优先算法排序{for(int i=1;i<=N-1;i++)for(int j=1;j<=i;j++)if(p[i].servicetime<p[j].servicetime){sjf temp;temp=p[i];p[i]=p[j];p[j]=temp;}}//运行结果void Sdeal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,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-1].finishtime+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 SJF(sjf *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;Ssort(p,N);Sdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);SPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);}void main() //主函数{while(1){int n;printf("选择哪种算法?1、先来先服务算法(FCFS)2、段作业优先算法(SJF)\n");scanf("%d",&n);if(n==1) //先来先服务算法(FCFS){int N;printf("------先来先服务调度算法------\n");printf("input the process's number:\n");scanf("%d",&N);Finput(a,N);FCFS(a,N);}if(n==2) //短作业优先算法(SJF){int M;printf("------短作业优先调度算法------\n");printf("input the process's number:\n");scanf("%d",&M);Sinput(b,M);SJF(b,M);}char o;printf("继续工作吗?(Y/N):");scanf("%s",&o);if(o=='Y')continue;if(o=='N')break;}}。