操作系统调度算法实验

合集下载

先来先服务,时间片调度,优先级调度算法实验报告

先来先服务,时间片调度,优先级调度算法实验报告

先来先服务,时间片调度,优先级调度算法实验报告实验报告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. 完成实验后,整理实验报告,包括实验目的、实验环境、实验内容、实验步骤和实验结果等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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题(最高响应比优先权优先调度算法)的运行结果六、心得体会通过模拟进程的调度问题,更加深了我对于操作系统理论的理解,在自己的动手操作过程中,能够体会成功的喜悦和遇到问题自己解决的能力,对于我来说是一次提高,让自己多多的在实践中可以加深对理论的理解,也让我明白了以后应该如何更好,更高效的学习。

相关文档
最新文档