操作系统调度算法实验
先来先服务,时间片调度,优先级调度算法实验报告
先来先服务,时间片调度,优先级调度算法实验报告实验报告1. 引言进程调度是操作系统中非常重要的一部分,它决定了进程在CPU上执行的顺序和时间长度。
在本次实验中,我们通过实现先来先服务调度算法、时间片调度算法和优先级调度算法,并对其性能进行比较,来深入了解各种调度算法的工作原理及优缺点。
2. 先来先服务调度算法先来先服务调度算法按照进程到达的先后顺序进行调度。
当一个进程到达时,如果CPU空闲,则将其分配给CPU进行执行;如果CPU 正在执行其他进程,则该进程将等待直到CPU空闲。
优点是简单易实现,适用于长作业。
缺点是可能出现饥饿现象,即低优先级的进程可能会一直等待高优先级进程的执行。
3. 时间片调度算法时间片调度算法将CPU的执行时间划分为固定长度的时间片,每个进程在一个时间片内执行,当时间片用完后,系统将切换到下一个进程执行。
该算法确保每个进程都有公平的执行时间,避免了饥饿现象。
然而,对于CPU利用率较高的情况下,可能会导致进程频繁地切换,增加了上下文切换的开销。
4. 优先级调度算法优先级调度算法根据进程的优先级来进行调度,优先级较高的进程将具有更高的执行优先级。
当多个进程同时到达CPU时,系统将选择优先级最高的进程先执行。
该算法可以分为静态优先级调度和动态优先级调度两种方式。
优点是可以根据进程的重要性灵活调整执行顺序。
缺点是可能导致优先级低的进程长时间等待,造成饥饿现象。
5. 实验结果与分析我们通过模拟多个进程的到达和执行过程,在不同的场景下比较了先来先服务调度算法、时间片调度算法和优先级调度算法的性能。
实验结果显示,在长作业的情况下,先来先服务调度算法表现较好;在要求公平性的场景下,时间片调度算法比较适合;而对于需要根据优先级来调度的场景,优先级调度算法可以更好地满足需求。
6. 结论不同的进程调度算法在不同的场景下有各自的优劣。
先来先服务调度算法简单易实现,适用于长作业;时间片调度算法保证了公平性,适用于要求公平的场景;而优先级调度算法则可以根据进程的重要性进行调度。
操作系统实验报告进程调度
操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。
其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。
实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。
实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。
在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。
实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。
在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。
2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。
在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。
3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。
在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。
实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。
在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。
因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。
结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。
同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。
操作系统磁盘调度算法实验报告及代码
操作系统磁盘调度算法实验报告及代码一、实验目的通过实验掌握磁盘调度算法的实现过程,了解各种不同磁盘调度算法的特点和优缺点,并比较它们的性能差异。
二、实验原理磁盘调度是操作系统中的重要内容,其主要目的是提高磁盘的利用率和系统的响应速度。
常见的磁盘调度算法有:FCFS(先来先服务)、SSTF (最短寻道时间)、SCAN(扫描)、C-SCAN(循环扫描)等。
三、实验过程1.编写代码实现磁盘调度算法首先,我们需要定义一个磁盘请求队列,其中存放所有的IO请求。
然后,根据所选的磁盘调度算法,实现对磁盘请求队列的处理和IO请求的调度。
最后,展示运行结果。
以FCFS算法为例,伪代码如下所示:```diskQueue = new DiskQueue(; // 创建磁盘请求队列while (!diskQueue.isEmpty()request = diskQueue.dequeue(; // 取出队列头的IO请求//处理IO请求displayResult(; // 展示运行结果```2.运行实验并记录数据为了验证各种磁盘调度算法的性能差异,我们可以模拟不同的场景,例如,随机生成一批磁盘IO请求,并使用不同的磁盘调度算法进行处理。
记录每种算法的平均响应时间、平均等待时间等指标。
3.撰写实验报告根据实验数据和结果,撰写实验报告。
实验报告通常包括以下内容:引言、实验目的、实验原理、实验步骤、实验结果、实验分析、结论等。
四、实验结果与分析使用不同的磁盘调度算法对磁盘IO请求进行处理,得到不同的实验结果。
通过对比这些结果,我们可以看出不同算法对磁盘IO性能的影响。
例如,FCFS算法对于请求队列中的请求没有排序,可能会导致一些请求等待时间过长。
而SSTF算法通过选择离当前磁道最近的请求进行处理,能够减少平均寻道时间,提高磁盘性能。
五、实验总结通过本次实验,我们学习了操作系统中磁盘调度算法的原理和实现过程。
不同的磁盘调度算法具有不同的优缺点,我们需要根据实际情况选择合适的算法。
操作系统调度算法实验报告
操作系统调度算法实验报告摘要:本篇实验报告旨在研究和分析不同的操作系统调度算法对系统性能的影响。
通过实验,我们对先来先服务调度算法、短作业优先调度算法和时间片轮转调度算法进行了比较和评估。
实验结果表明,不同的调度算法对系统响应时间、吞吐量和公平性等方面都有不同的影响。
一、引言操作系统的调度算法是管理计算机资源的关键部分之一。
调度算法的好坏直接影响着系统的性能和用户体验。
本实验旨在通过模拟不同的调度算法,评估其对系统的影响,以便选择最适合特定环境的调度算法。
二、实验方法本实验使用了一个模拟的操作系统调度器,通过调度器模拟不同的进程到达和执行过程。
我们选择了三种常见的调度算法进行比较和评估。
1. 先来先服务(First-Come, First-Served)调度算法先来先服务调度算法按照进程到达的先后顺序进行调度。
当一个进程到达后,它将占用处理器直到该进程执行完毕。
我们记录了每个进程的到达时间、执行时间和完成时间,并计算了系统的平均等待时间和平均周转时间。
2. 短作业优先(Shortest Job First)调度算法短作业优先调度算法按照进程执行时间的长短进行调度。
当一个进程到达后,系统会选择执行剩余执行时间最短的进程。
我们同样记录了每个进程的到达时间、执行时间和完成时间,并计算了系统的平均等待时间和平均周转时间。
3. 时间片轮转(Round Robin)调度算法时间片轮转调度算法将处理器时间分成若干个时间片,每个进程只能占用一个时间片。
当一个进程用完一个时间片后,它排到队列的末尾等待下一个时间片。
我们选择了不同的时间片长度,并观察了系统的响应时间和吞吐量。
三、实验结果与分析我们通过多组实验数据对不同的调度算法进行了评估。
以下是实验结果的分析:1. 先来先服务调度算法根据实验数据,我们发现先来先服务调度算法对长作业具有较高的等待时间和周转时间。
这是因为当一个长作业到达后,其他短作业需要等待该作业执行完毕才能获得处理器资源。
操作系统实验三 时间片轮转法完成进程调度
实验三:时间片轮转法完成进程调度一、实验目的:(1)加深对进程的理解(2)理解进程控制块的结构(3)理解进程运行的并发性(4)掌握时间片轮转法进程调度算法实验内容:(1)建立进程控制块(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。
(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)实验程序:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{char name[10];/*进程标识符*/int prio;/*进程优先数*/int round;/*进程时间轮转时间片*/int cputime; /*进程占用CPU时间*/int needtime; /*进程到完成还要的时间*/int count;/*计数器*/char state; /*进程的状态*/struct node *next; /*链指针*/}PCB;PCB *finish,*ready,*tail,*run; //队列指针int N,t; //进程数,时间片的大小void firstin(){run=ready;//就绪队列头指针赋值给运行头指针run->state='R'; //进程状态变为运行态ready=ready->next; //就绪队列头指针后移到下一进程}void prt1(char a)//输出标题函数{if(toupper(a)=='P')//优先级法printf("进程名占用CPU时间到完成还要的时间轮转时间片状态\n");} void prt2(char a,PCB *q)//进程PCB输出{if(toupper(a)=='P')//优先级法的输出printf("%4s %8d %12d %14d %8c\n",q->name,q->cputime,q->needtime,q->roun d,q->state);}void prt(char algo)//输出函数二、三、{PCB *p;prt1(algo);//输出标题if(run!=NULL)//如果运行指针不空prt2(algo,run);//输出当前正在运行的PCBp=ready;//输出就绪队列PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}p=finish;//输出完成队列的PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}getchar(); //按住任意键继续}void insert(PCB *q)//时间片轮转的插入算法{PCB *p1,*s,*r;s=q;//待插入的PCB指针p1=ready;//就绪队列头指针r=p1;//*r做pl的前驱指针while(p1!=NULL)if(p1->round<=s->round){r=p1;p1=p1->next;}if(r!=p1){r->next=s;s->next=p1;}else{s->next=p1;//否则插入在就绪队列的头ready=s;}}void create(char alg)//时间片轮转法创建链表进程PCB{PCB *p;int i,time;char na[10];ready=NULL;finish=NULL;run=NULL;printf("输入进程名及其需要运行的时间(中间以空格隔开):\n"); for(i=1;i<=N;i++){p=new PCB;scanf("%s %d",&na,&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='W';//进程的状态p->round=0;if(ready!=NULL)insert(p);else{p->next=ready;ready=p;}}printf("*************时间片轮转法进程调度过程*************\n"); prt(alg);run=ready;ready=ready->next;run->state='R';}void timeslicecycle(char alg)//时间片轮转法{while(run!=NULL){run->cputime=run->cputime+t;//处理时间加trun->needtime=run->needtime-t;//完成需要时间减trun->round=run->round+t;//运行完将其变为完成态,插入完成队列if(run->needtime<=0)//当进程完成时{run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)//就绪队列不空,将第一个进程投入进行firstin();}else{run->state='W';//将进程插入到就绪队列中等待轮转insert(run);//将就绪队列的第一个进程投入运行firstin();}prt(alg);}}void main()//主函数{char algo='P';//算法标记printf("输入进程的个数:");scanf("%d",&N);//输入进程数printf("定义时间片大小:");scanf("%d",&t);//输入时间片大小create(algo);//创建进程timeslicecycle(algo);//时间片轮转法调度}//main()四、实验结果:五、实验小结:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。
时间片轮转调度算法实验
时间片轮转调度算法实验时间片轮转调度算法是一种广泛应用于计算机操作系统中的调度算法。
本文将介绍时间片轮转调度算法的基本原理、特点以及实验过程。
一、时间片轮转调度算法的基本原理时间片轮转调度算法是一种基于时间片的调度算法,它将CPU时间分配给多个进程,每个进程都被赋予一个时间片,当时间片用完后,该进程将被挂起,CPU时间将被分配给下一个进程。
被挂起的进程将被放入一个就绪队列中,等待下一轮时间片到来。
二、时间片轮转调度算法的特点1.公平性:时间片轮转调度算法可以保证每个进程都能够得到一定的CPU时间,从而保证了公平性。
2.响应时间快:时间片轮转调度算法可以保证进程的响应时间快,因为每个进程都会被分配一定的CPU时间。
3.适用性广:时间片轮转调度算法适用于多种场景,包括多用户、多任务、实时任务等。
4.实现简单:时间片轮转调度算法的实现比较简单,可以通过一个就绪队列和一个定时器来实现。
三、时间片轮转调度算法的实验过程1.实验环境:本次实验使用了Linux操作系统,编程语言为C++。
2.实验步骤:(1)创建进程:首先需要创建多个进程,并将它们放入就绪队列中。
(2)分配时间片:为了模拟时间片轮转调度算法,需要为每个进程分配一个时间片。
(3)执行进程:按照就绪队列中的顺序,依次执行每个进程,并在执行完一个时间片后,将进程放回就绪队列中。
(4)更新进程状态:根据进程的执行情况,更新进程的状态,包括运行中、就绪、阻塞等。
(5)输出结果:最后,输出每个进程的执行结果,包括进程的状态、执行时间等。
3.实验结果:经过实验,我们发现时间片轮转调度算法可以保证每个进程都能够得到一定的CPU时间,并且响应时间较快。
同时,我们也发现时间片的大小会对进程的执行时间和响应时间产生影响。
如果时间片过小,会导致进程频繁切换,从而降低CPU的利用率;如果时间片过大,会导致进程响应时间过长,影响用户体验。
四、总结时间片轮转调度算法是一种广泛应用于计算机操作系统中的调度算法,具有公平性、响应时间快、适用性广、实现简单等特点。
操作系统进程调度算法模拟实验报告
操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。
二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。
常见的调度算法有先来先服务(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)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。
操作系统原理实验
操作系统原理实验一、实验目的本实验旨在通过实际操作,加深对操作系统原理的理解,掌握操作系统的基本功能和调度算法。
二、实验环境1. 操作系统:Windows 102. 虚拟机软件:VirtualBox3. 实验工具:C语言编译器(如gcc)、汇编语言编译器(如nasm)、调试器(如gdb)三、实验内容1. 实验一:进程管理在这个实验中,我们将学习如何创建和管理进程。
具体步骤如下:a) 创建一个C语言程序,实现一个简单的计算器功能。
该计算器能够进行基本的加减乘除运算。
b) 使用fork()系统调用创建一个子进程,并在子进程中执行计算器程序。
c) 使用wait()系统调用等待子进程的结束,并获取子进程的退出状态。
2. 实验二:内存管理在这个实验中,我们将学习如何进行内存管理。
具体步骤如下:a) 创建一个C语言程序,模拟内存分配和释放的过程。
该程序能够动态地分配和释放内存块。
b) 使用malloc()函数分配一块内存,并将其用于存储数据。
c) 使用free()函数释放已分配的内存块。
3. 实验三:文件系统在这个实验中,我们将学习如何进行文件系统的管理。
具体步骤如下:a) 创建一个C语言程序,实现一个简单的文件系统。
该文件系统能够进行文件的创建、读取、写入和删除操作。
b) 使用open()系统调用打开一个文件,并进行读取和写入操作。
c) 使用unlink()系统调用删除一个文件。
四、实验步骤1. 安装虚拟机软件VirtualBox,并创建一个虚拟机。
2. 在虚拟机中安装操作系统Windows 10。
3. 在Windows 10中安装C语言编译器、汇编语言编译器和调试器。
4. 根据实验内容,编写相应的C语言程序并保存。
5. 在命令行中使用gcc编译C语言程序,并生成可执行文件。
6. 运行可执行文件,观察程序的执行结果。
7. 根据实验要求,进行相应的操作和测试。
8. 完成实验后,整理实验报告,包括实验目的、实验环境、实验内容、实验步骤和实验结果等。
操作系统实验--处理机调度算法实现
当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。
struct proc //定义进程结构体
{
char name[5];
int num;
int pri;
};
void main()//主函数
{ char ch;
struct proc pr[n];//声明结构体数组
int i,k,j;
int count=n;
for(i=0;i<n;i++)//输入5个进程
函数描述:
struct proc/*定义结构体内部包含进程的信息*/
{
char name[5]; /*定义进程名*/
int num; /*定义运行时间*/
int pri; /*定义优先权*/
};
Void main()/*主函数:掌控整个程序的运行过程,是程序的主体部分*/
struct proc pr[n];/*声明结构体数组*/
4.处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。
5.若要求运行时间为零,则将其状态置为“结束”,且退出队列。
6.运行所设计程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)
for(k=1;k<n;k++)
操作系统进程调度实验
操作系统进程调度实验操作系统进程调度是操作系统中非常重要的一个功能,它决定了多个进程的执行顺序和调度策略。
进程调度的好坏直接影响着系统的性能和资源利用率。
本实验旨在通过实现一个简单的进程调度模拟,了解不同的调度算法,探讨其优劣和适用场景。
一、实验目的和原理本实验的目标是实现进程调度模拟,并探究不同调度算法的性能和适用场景。
通过实验,我们可以了解以下内容:1.进程调度算法的基本原理和实现方式;2.比较不同调度算法的优劣和特点;3.了解不同调度算法在不同场景下的应用。
二、实验环境和工具本实验使用C语言进行实现,可以选择任何一种编程环境和工具,例如Dev-C++、Visual Studio等。
三、实验过程及方法1.实现一个进程控制块(PCB)的数据结构,用来保存进程的相关信息,包括进程ID、进程状态、优先级等。
2.实现一个进程队列,用来保存就绪队列中的进程。
可以使用数组或链表等数据结构实现。
3. 实现不同调度算法的函数,包括先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)和时间片轮转(Round Robin)等。
4.根据实际需求生成一批进程,设置其信息,并根据不同算法进行调度。
5.对比不同算法的运行结果和性能,分析其优劣。
四、实验结果和分析通过实验,我们可以得到每个算法的平均等待时间、平均周转时间和吞吐量等性能指标。
根据这些指标,我们可以对不同算法进行评价和分析。
1.先来先服务(FCFS)算法FCFS算法是最简单的调度算法,按照进程到达的顺序进行调度。
它的主要优点是实现简单、公平性好。
然而,FCFS算法有明显的缺点,会导致长作业等待时间过长,产生"饥饿"现象。
2.最短作业优先(SJF)算法SJF算法是按照进程的执行时间长短进行调度的算法。
它能够最大限度地减少平均等待时间和周转时间,但是需要提前知道所有进程的执行时间,这在实际中是很难做到的。
操作系统进程调度算法模拟实验
操作系统进程调度算法模拟实验进程调度是操作系统中一个重要的功能,它决定了哪些进程能够获得处理器资源以及如何按照一定的策略来分配这些资源。
为了更好地理解进程调度算法的工作原理,我们可以进行一个模拟实验来观察不同算法的表现效果。
实验设想:我们设想有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。
操作系统实验二处理机调度-实时调度算法EDF和RMS实验报告
实验报告
姓
名:
学号:日期:2011-1-10 实验
题
目:
实验二:处理机调度---实时调度算法EDF和RMS
实验目的:
深入理解处理机调度算法,了解硬实时概念,掌握周期性实时任务调度算法EDF(Earliest Deadline First)和RMS(Rate-Monotonic Scheduling)的可调度条件,并能在可调度的情况下给出具体调度结果。
实验内容:
在Linux环境中采用用户级线程模拟实现EDF和RMS两种实时调度算法。
给定一组实时任务,按照EDF算法和RMS算法分别判断是否可调度。
在可调度的情况下,创建一组用户级线程,分别代表各个实时任务,并按算法所确定的调度次序安排各个线程运行,运行时在终端上画出其Gantt图。
为避免图形绘制冲淡算法,Gantt图可用字符表示。
实验步骤:1.启动虚拟机,在Linux系统终端中找到代码
2.仔细阅读教材相关内容和实验指导书中实验准备;
3.将代码在Linux系统上编译并运行。
4.根据实验结果分析。
5.结束实验,退出保存。
实验结果:实验结果如实验指导书上所示。
EDF算法结果:
RMS算法结果:。
操作系统实验进程调度
实验三进程调度一. 实验目的加深理解并模拟实现进程(作业)调度算法。
1)熟悉常用的进程调度算法, 如FCFS、SPF、FPF、高响应比优先、时间片轮转;2)结合所学的数据结构及编程知识, 选择三种进程调度算法予以实现。
二. 实验属性该实验为设计性实验。
三. 实验仪器设备及器材普通PC386以上微机四. 实验要求本实验要求2学时完成。
1)本实验要求完成如下任务:2)编程实现单处理机系统中的进程调度, 要求从FCFS、SPF、FPF、高响应比优先、时间片轮转算法中至少选择三个;3)最后编写主函数对所做工作进行测试。
实验前应复习实验中所涉及的理论知识和算法, 针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。
实验后认真书写符合规范格式的实验报告(参见附录A), 并要求用正规的实验报告纸和封面装订整齐, 按时上交。
五: 实验具体设计此程序模拟了两种调度算法, FCFS和SPF, 首先FCFS就是按照进程的创建顺序依次顺序进行, 流程图为:进程顺序执行SPF:每次都进行循环, 选出在该时间刻运行时间最短的进程优先执行。
1.程序代码具体详解:2.创建一结构体作为进程控制器typedef struct PCB{int ID;char state;int arrivetime;int starttime;int finishtime;int servicetime;struct PCB *next;}pcb;定义全局变量作为计时器int time;//计时器创建进程链表:从txt文件中读取数据, 构造一条不含头结点的单链表void Create_process(){ifstream inFile;inFile.open("test.txt");inFile>>n;inFile.get();int i=0;for (;i<n;i++){p=(pcb *)malloc(sizeof(pcb));inFile>>p->ID;inFile>>p->arrivetime;inFile>>p->servicetime;p->starttime=0;p->finishtime=0;p->state='F';p->next=NULL;if(head==NULL){head=p;q=p;time=p->arrivetime;}if(p->arrivetime < time)time=p->arrivetime;q->next=p;q=p;}若执行FCFS算法, 按顺序遍历链表void fcfs1(){int i;p=head;for(i=0;i<n;i++){if(p->state=='F')q=p;run_fcfs1(q);}p=p->next;}}void run_fcfs1(pcb *p1){time = p1->arrivetime > time? p1->arrivetime:time;p1->starttime=time;printf("\n现在时间: %d,开始运行作业%d\n",time,p1->ID);time+=p1->servicetime;p1->state='T';p1->finishtime=time;printf("ID号到达时间开始运行时间服务时间完成时间\n");printf("%d%10d%12d%12d%12d\n",p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p 1->finishtime);}若执行SPF算法, 每次都从链表头开始遍历链表, 找出arrivetime<=time并且运行时间最短的节点, 执行该节点进程, 最后再删除该节点。
操作系统实验_先来先服务的调度算法和短作业优先
操作系统实验_先来先服务的调度算法和短作业优先先来先服务(FCFS)调度算法是一种非抢占式调度算法,在这种算法中,进程按照到达系统的先后顺序执行,并且在一个进程执行完毕之前,不会有其他进程执行。
如果一个进程没有执行完成,后续进程需要等待。
FCFS调度算法的优点是实现简单,公平性好。
由于按照到达时间先后顺序执行进程,能够保证所有进程都能够得到执行的机会。
然而,FCFS调度算法容易出现“饥饿”现象,即如果一个进程占用了较长的CPU时间,其他进程可能需要等待较长时间。
短作业优先(SJF)调度算法是一种非抢占式调度算法,它选择下一个执行的进程是根据预计的执行时间最短的进程。
在SJF调度算法中,进程按照预计的执行时间进行排序,并按照顺序执行。
SJF调度算法的优点是能够最大程度地减少平均等待时间。
因为进程按照预计的执行时间最短的顺序执行,执行时间短的进程优先执行,可以最大限度地减少其他进程等待的时间。
然而,SJF调度算法需要预先知道所有进程的执行时间,并且如果一个进程执行时间长,其他进程需要等待的时间可能会很长。
FCFS调度算法和SJF调度算法都有各自的优点和局限性。
FCFS调度算法适用于进程执行时间相对均匀的情况,可以保证所有进程都能够得到执行的机会。
但是,如果一个进程执行时间很长,可能会导致其他进程等待的时间非常长,容易出现“饥饿”现象。
SJF调度算法适用于进程执行时间差异较大的情况,可以最大程度地减少平均等待时间。
但是,SJF调度算法需要预先知道所有进程的执行时间,而且在实际应用中,很难准确预测进程的执行时间。
在实验中,可以通过编写相应的模拟程序来实现FCFS调度算法和SJF调度算法。
可以设定一个进程队列,每个进程有自己的到达时间和执行时间。
按照FCFS算法,按照到达时间先后顺序执行进程;按照SJF算法,按照执行时间从小到大的顺序执行进程。
通过模拟进程的调度过程,可以观察到FCFS算法和SJF算法的效果差异。
操作系统实验报告作业调度
操作系统实验报告作业调度作业调度是操作系统中的一个重要组成部分,用于管理和分配计算机系统中的作业,确保系统可靠高效地运行。
作业调度算法的选择直接影响到系统的性能和资源利用率。
本实验通过对不同作业调度算法的理论分析和实际测试,探究它们的特点和优劣,最终找到适合特定场景的作业调度算法。
以下是本次实验的详细报告。
一、实验目的1.理解作业调度算法的原理和功能;2.掌握常用的作业调度算法;3.分析和比较不同作业调度算法的优缺点。
二、实验内容1. FIFO(First In First Out)作业调度算法;2. SJF(Shortest Job First)作业调度算法;3. RR(Round Robin)作业调度算法;4. HRN(Highest Response Ratio Next)作业调度算法。
三、实验过程1.FIFO作业调度算法FIFO算法是最简单的作业调度算法,按照作业提交的先后顺序进行调度。
首先将所有作业按照到达时间排序,然后按照顺序依次执行作业。
2.SJF作业调度算法SJF算法是根据作业的执行时间进行排序,优先执行执行时间最短的作业。
通过比较作业的执行时间,选择最短的作业进行执行。
3.RR作业调度算法RR算法是采用时间片轮转的方式进行调度。
每个作业分配一个时间片,当时间片用完后,将该作业移到队列的末尾继续执行。
时间片的长度可以根据需要进行调整。
4.HRN作业调度算法HRN算法是根据作业的响应比来确定调度顺序。
响应比由作业的等待时间和作业执行时间的比值来计算,响应比越大,优先级越高。
选择响应比最高的作业进行执行。
四、实验结果分析在本实验中,我们通过实际测试不同作业调度算法的性能来进行评估。
测试使用了一组模拟作业集,包括不同的作业执行时间和到达时间。
通过对比不同算法的实际表现1.FIFO算法的优点是简单易实现,但缺点是无法考虑作业的执行时间,因此可能导致平均等待时间较长。
2.SJF算法的优点是能够有效地减少平均等待时间,但缺点是对于长作业可能导致短作业长时间等待。
fcfs算法实验报告
fcfs算法实验报告《FCFS算法实验报告》一、实验背景FCFS(First Come First Serve)算法是操作系统中最简单的调度算法之一,它按照作业到达的先后顺序进行调度,先到达的作业先执行,后到达的作业后执行。
本次实验旨在通过模拟FCFS算法的调度过程,分析其特点和优缺点。
二、实验过程1. 实验环境本次实验使用C语言编写程序模拟FCFS算法的调度过程,实验环境为Windows操作系统。
2. 实验步骤(1)设计作业队列首先,设计一个作业队列,包括作业的到达时间和执行时间,用来模拟作业的到达顺序和执行时间。
(2)实现FCFS调度算法编写程序实现FCFS调度算法,根据作业队列中作业的到达时间和执行时间,按照先来先服务的原则进行调度。
(3)模拟调度过程运行程序,模拟FCFS算法的调度过程,记录作业的执行顺序和等待时间。
三、实验结果通过模拟调度过程,得出如下实验结果:1. 作业执行顺序:根据FCFS算法,作业的执行顺序与其到达顺序一致。
2. 平均等待时间:FCFS算法的平均等待时间较长,特别是当作业的执行时间差异较大时,平均等待时间会显著增加。
四、实验分析根据实验结果,可以得出如下分析:1. FCFS算法的优点是实现简单,适用于作业执行时间相对均匀的情况。
2. FCFS算法的缺点是平均等待时间较长,不适用于作业执行时间差异较大的情况,容易导致部分作业等待时间过长。
五、实验结论FCFS算法是一种简单而直观的调度算法,适用于作业执行时间相对均匀的情况。
然而,在实际应用中,由于作业的执行时间往往存在差异,FCFS算法的平均等待时间较长,不适用于所有情况。
因此,在实际应用中需要根据具体情况选择合适的调度算法。
六、总结本次实验通过模拟FCFS算法的调度过程,分析了其特点和优缺点。
通过实验结果和分析,对FCFS算法有了更深入的了解,为实际应用提供了参考。
七、参考文献[1] 汤小丹. 操作系统教程[M]. 北京: 清华大学出版社, 2007.[2] Silberschatz A, Galvin P B, Gagne G. Operating System Concepts[M]. John Wiley & Sons, 2018.以上就是本次实验的全部内容,希望对大家有所帮助。
操作系统实验_先来先服务的调度算法和短作业优先
操作系统实验_先来先服务的调度算法和短作业优先操作系统中的进程调度算法是实现多道程序设计的关键,作为操作系统中的调度器,它决定了进程在CPU上执行的顺序,直接影响到系统的性能和响应时间。
本文将重点介绍两种常用的进程调度算法:先来先服务调度算法(FCFS)和短作业优先调度算法(SJF)。
先来先服务调度算法是一种最简单、最基础的调度算法,其实现非常简单:按照进程到达CPU的先后顺序,将其依次调入CPU执行。
当一个进程进入就绪队列后,在CPU空闲的时候,就将其调入CPU执行,直到进程执行完成或者主动放弃CPU时间片。
这种调度算法的优势在于实现简单、公平性好;但其缺点也很明显,由于没有考虑进程的执行时间长短,如果一个长时间的进程先到达就绪队列,则会造成其他进程的等待时间过长,导致系统的响应时间较长。
与FCFS相对的是短作业优先调度算法(Shortest Job First, SJF)。
SJF调度算法会根据进程的相对执行时间长短来进行调度,即将执行时间最短的进程优先调度进入CPU执行。
SJF算法的关键在于如何估计进程的执行时间,通常有两种方法:预测和历史信息。
预测方法是根据进程的相关信息,如进程的大小、执行时间等进行预测;而历史信息方法是根据以往同类任务的执行时间的平均值或历史执行时间进行估算。
在实际操作中,通常采用后者进行调度。
SJF调度算法的优势在于可以最大程度地减少平均等待时间,提高系统的响应效率。
然而,该算法也存在一些问题,如如何准确估算进程的执行时间、对长时间任务不够友好等。
两种调度算法各自都有其优势和劣势,因此在实际操作中需要根据具体的情况选择适用的调度算法。
如果系统中存在大量长时间任务,可以考虑使用FCFS来保证公平性;而如果系统中的任务短且繁琐,可以优先考虑SJF算法来减少平均等待时间。
此外,还有一些改进版的调度算法,如最短剩余时间优先调度算法(Shortest Remaining Time First, SRTF)和多级反馈队列调度算法(Multi-Level Feedback Queue, MLFQ)等,它们在一定程度上兼顾了FCFS和SJF的优势,更适用于实际的操作系统。
操作系统实验_先来先服务的调度算法及短作业优先
操作系统实验_先来先服务的调度算法及短作业优先先来先服务调度算法是一种非抢占式的调度算法,它按照作业到达的先后顺序将作业分配给CPU。
具体来说,当一个作业进入就绪队列时,调度程序将把它放在队列的末尾,然后从队列的头部选择一个作业执行。
只有当一个作业执行完成后,作业队列的头部才会选择下一个作业执行。
先来先服务调度算法的优点是简单易实现,没有复杂的排序操作,适用于短作业和长作业混合的场景。
其缺点是没有考虑作业的执行时间,导致长作业会占用CPU很长时间,影响其他作业的响应时间。
短作业优先调度算法是一种抢占式的调度算法,它根据作业的执行时间选择优先级。
具体来说,当一个作业进入就绪队列时,调度程序会比较该作业的执行时间和其他就绪作业的执行时间,并选择执行时间最短的作业执行。
如果有一个新的作业到达,且其执行时间比当前执行的作业要短,那么调度程序会中断当前作业的执行并切换到新的作业执行。
短作业优先调度算法的优点是能够最大程度上减少作业的等待时间和响应时间,提高系统的吞吐量。
其缺点是需要对作业的执行时间有较准确的估计,否则可能导致长作业陷入饥饿状态。
此外,由于需要频繁进行作业的切换,短作业优先调度算法在实现上相对复杂。
在实际应用中,先来先服务调度算法适用于短作业和长作业混合的场景,或者作业的执行时间无法估计准确的情况下。
例如,在批处理系统中,作业的执行时间往往是固定的,先来先服务调度算法可以保证公平性,并且能够有效利用CPU资源。
而短作业优先调度算法适用于多任务环境下,作业的执行时间可以估计准确的情况下。
例如,在交互式系统中,用户的操作往往是短暂的,短作业优先调度算法可以最大限度地减少用户的等待时间,提高系统的响应速度。
总之,先来先服务调度算法和短作业优先调度算法是操作系统中常用的两种调度算法。
它们分别适用于不同的应用场景,在实际应用中可以根据具体需求选择不同的调度算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统调度算法实验系别:计算机与信息工程系学号:B11053214姓名:刘芳芳实验时间:2011年10月27日课程名称计算机操作系统实验名称调度算法日期2011-10-27学号B11053214 姓名刘芳芳班级B110532实验目的:(1)通过编写程序实现进程或作业先来先服务、短作业优先、最高响应比优先调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。
(2)了解进程(线程)的调度机制。
(3)学习使用进程(线程)调度算法,掌握相应的与调度有关的函数。
实验条件:电脑一台,装有Microsoft Visual C++6.0的运行环境一、实验内容:1、模拟实现操作系统中的先来先服务优先调度的算法2、模拟实现操作系统中的短作业优先调度算法3、模拟实现操作系统中的高优先权优先调度算法二、实验的核心算法思想2.1第1题(先来先服务优先调度算法):先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。
2.2第2题(短作业优先调度算法):短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。
该算法对长作业不利,完全未考虑作业的紧迫程度。
2.3第3题(最高响应比优先算法):最高响应比优先法(HRRN)是对FCFS方式和SJF 方式的一种综合平衡。
HRRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
响应比R定义如下: R=(W+T)/T=1+W/T其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。
每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。
这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。
这种算法是介于FCFS和SJF 之间的一种折中算法。
由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF 法,从而采用HRRN 方式时其吞吐量将小于采用SJF 法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加。
三、实验算法的流程图表示3.1 第1题(先来先服务优先调度算法)的流程图:开始创建进程PCB按到达时间排序调用action,执行进程输出结果结束3.2 第2题(短作业优先调度算法)的流程图:开始获取进程信息按进程越要时间排序调用action,执行进程输出结果结束3.3 第3题(最高响应比优先调度算法)的流程图:开始首先进行第一个进程计算剩余进程的响应比按优先级排序运行优先级最高的进程结束四、源代码4.1 第1题(先来先服务优先调度算法)的源代码:#include <stdio.h>struct fcfs{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};fcfs a[100];void input(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);/* printf("input the %dth process's arrivetime:\n",i+1);scanf("%f",&p[i].arrivetime);printf("input the %dth process's servicetime:\n",i+1);scanf("%f",&p[i].servicetime);*/}}void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("run order:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\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",p[k].name,p [k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zzt ime,p[k].dqzztime);/*printf("\nname:%s\t",p[k].name);printf("\narrivetime:%-.2f\t",p[k].arrivetime);printf("\nservicetime:%-.2f\t",p[k].servicetime);printf("\nstarttime:%-.2f\t",p[k].starttime);printf("\nfinishtime:%-.2f\t",p[k].finishtime);printf("\nzztime:%-.2f\t",p[k].zztime);printf("\ndqzztime:%-.2f\t\n",p[k].dqzztime);*/}}//pai xuvoid sort(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;}}//yun xing jieduanvoid deal(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){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;sort(p,N);deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); }void main(){ int N;printf("------先来先服务调度算法------\n");printf("input the process's number:\n");scanf("%d",&N);input(a,N);FCFS(a,N);}4.2 第2题(短作业优先调度算法)的源代码:#include "stdio.h"struct sjf{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};sjf a[100];void input(sjf *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 Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;printf("run order:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\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",p[k].name,p [k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zzt ime,p[k].dqzztime);}}//pai xuvoid sort(sjf *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){sjf temp;temp=p[i];p[i]=p[j];p[j]=temp;}}//yun xing jieduanvoid deal(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 sjff(sjf *p,int N){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0 ;sort(p,N);for(int m=0;m<N-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[m].finishtime=p[m-1].finishtime+p[m].servicetime;int i=0;for(int n=m+1;n<=N-1;n++){if(p[n].arrivetime<=p[m].finishtime)i++;}float min=p[m+1].servicetime;int next=m+1;//m+1=nfor(int k=m+1;k<m+i;k++){if(p[k+1].servicetime<min){ min=p[k+1].servicetime;next=k+1;}}sjf temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); }void main(){ int N;printf("------短作业优先调度算法------\n");printf("input the process's number:\n");scanf("%d",&N);input(a,N);sjf *b=a;sjf *c=a;sjff(b,N);}4.3 第3题(最高响应比优先调度算法)的源代码:#include<dos.h>#include<time.h>#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<string.h>typedef char string[10]; /* //定义string为含有10个字符元素的字符数组类型*/struct task {string name; /*作业号*/int arrTime; /* 作业到达时间*/int serTime; /*作业要求服务时间*/int waiTime; /*等待时间*/int begTime; /*开始运行时间*/int finTime; /*结束运行时间*/int turTime; /*周转时间*/int wTuTime; /*带权周转时间*/int priority;/*优先权*/int finish;/*是否已经完成*/}JCB[10];int num;void input(){int i;system("cls");printf("\n请输入作业数量: ");scanf("%d", &num);for(i=0;i<num;i++){printf("\n请输入作业 NO.%d:\n",i);printf(" 作业名称: ");scanf("%s",JCB[i].name);printf(" 到达时间: ");scanf("%d",&JCB[i].arrTime);printf(" 服务时间: ");scanf("%d",&JCB[i].serTime);JCB[i].priority = 0;JCB[i].finish =0;}}int HRN(int pre){int current=1,i,j;/* 优先权 =(等待时间+服务时间)/服务时间*/for(i=0; i<num; i++){JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待时间=上一个作业的完成时间-到达时间*/JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;}for(i=0; i<num; i++){if(!JCB[i].finish){current=i; /*找到第一个还没完成的作业*/break;}}for( j=i; j<num; j++) /*和后面的作业比较*/{if( !JCB[j].finish) /* 还没完成(运行)*/{if(JCB[current].arrTime<=JCB[pre].finTime) /*如果作业在上一个作业完成之前到达*/{if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/}else /* 如果作业是在上一个作业完成之后到达*/{if(JCB[j].arrTime<JCB[current].arrTime)current=j; /* 找出比较早到达的一个*/if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同时到达*/ if(JCB[j].priority>JCB[current].priority)current=j; /*找出服务时间比较短的一个*/}}}return current;/*返回当前作业*/}void runing(int i, int times, int pre, int staTime, int endTime){if(times==0){JCB[i].begTime=JCB[i].arrTime;JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;JCB[i].turTime=JCB[i].serTime;JCB[i].wTuTime=1.0;staTime=JCB[i].begTime;}else{if(JCB[i].arrTime>JCB[pre].finTime)JCB[i].begTime=JCB[i].arrTime;elseJCB[i].begTime=JCB[pre].finTime;JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;}if(times==num-1)endTime=JCB[i].finTime;JCB[i].finish=1;}void print(int i,int times){if(times==0){printf(" 名称到达时间服务时间开始时间完成时间周转时间带权周转时间\n");}printf("%9s%9d%9d%9d%9d%9d%9d\n",JCB[i].name,JCB[i].arrTime,JCB[i].serTime,JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);}void check( ){int i;int staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;int current=0, times=0, pre=0;JCB[pre].finTime=0;for(i=0; i<num; i++){JCB[i].finish=0;}staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;current=0; times=0; pre=0;JCB[pre].finTime=0;printf("-------------------------------------------------------------------------\n");for(i=0; i<num; i++){JCB[i].finish=0;}staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;current=0; times=0; pre=0;JCB[pre].finTime=0;printf("\n-- HRRN -----------------------------------------------------------------\n");for(times=0; times<num; times++){current=HRN(pre);runing(current, times, pre, staTime, endTime);print(current, times);pre=current;}for(i=0; i<num; i++){sumTurTime+=JCB[i].turTime;sumWTuTime+=JCB[i].wTuTime;}aveTurTime=sumTurTime/num;aveWTuTime=sumWTuTime/num;printf("(计与平均值) %9d%9d%9d%9d\n",NULL,sumTurTime,aveTurTime,aveWTuTime) ;printf("-------------------------------------------------------------------------\n");}void main(){char again;do {system("cls"); /*清屏*/printf("please input 4 groups of datas:\n");input();check();printf("Continue...(Y/N): ");do{again = getch();}while(again!='Y' && again!='y' && again!='N' && again!='n');}while(again=='Y' || again=='y');}五、运行结果5.1第1题(先来先服务优先调度算法)的运行结果5.2第2题(短作业(进程)优先调度算法)的运行结果5.3第3题(最高响应比优先权优先调度算法)的运行结果六、心得体会通过模拟进程的调度问题,更加深了我对于操作系统理论的理解,在自己的动手操作过程中,能够体会成功的喜悦和遇到问题自己解决的能力,对于我来说是一次提高,让自己多多的在实践中可以加深对理论的理解,也让我明白了以后应该如何更好,更高效的学习。