实验四 进程调度模拟实现
操作系统课程设计报告-进程调度的模拟实现

操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导教师完成日期博雅学院ﻬ题目:进程调度的模拟实现的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。
也就是说能运行的进程数大于处理机个数。
为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。
要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念.二、设计内容1)概述选择一个调度算法,实现处理机调度。
设计要求:1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。
2)可选择进程数量3)本程序包括三种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
调度时总是选取优先数最大的进程优先运行2.每个进程的优先数,运行时间,由程序任意指定.3.为了调度方便,把进程按给定优先级(动态优先级算法中)从小到大排成一个队列。
按给定运行时间(短作业优先)从小到大排成一个队列用一个变量作为队首指针,指向队列的第一个进程。
4.处理机调度总是选队首进程运行。
由于本实验是模拟处理机调度,所以被选中的进程并不实际的启动运行,而是执行:优先数-1(动态优先级算法中)要求运行时间-1来模拟进程的一次运行。
5.进程运行一次后,若要求运行时间不等于0,则再将它加入队列(动态优先级算法中:按优先数大小插入.),且改变队首指针:若要求运行时间=0,则把它的状态改为完成(C)状态,且退出队列。
(5)对于遇到优先数一致的情况,采用FIFO策略解决.3。
概要设计(1)本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
模拟进程调度实验报告

模拟进程调度实验报告模拟进程调度实验报告引言:进程调度是操作系统中的一个重要功能,它决定了各个进程在处理器上的执行顺序。
合理的进程调度算法能够提高系统的性能和效率。
为了深入了解进程调度算法的工作原理和效果,我们进行了一系列的模拟实验。
实验目的:1. 了解不同进程调度算法的工作原理;2. 分析不同算法对系统性能的影响;3. 探索如何选择合适的进程调度算法。
实验过程:1. 实验环境的搭建我们使用了一台配置较高的计算机作为实验环境,操作系统选择了Linux。
为了模拟多个进程同时运行的情况,我们编写了一段简单的多进程程序,并通过设置不同的优先级和时间片来模拟不同的进程调度算法。
2. FCFS(先来先服务)调度算法FCFS是最简单的进程调度算法,它按照进程到达的顺序进行调度。
我们通过设置不同的进程到达时间,观察FCFS算法的运行情况。
实验结果显示,FCFS算法对于长时间运行的进程效果较好,但是对于短时间进程会出现饥饿现象。
3. SJF(短作业优先)调度算法SJF算法是根据进程的执行时间来进行调度的,执行时间短的进程优先执行。
我们通过设置不同的进程执行时间,观察SJF算法的运行情况。
实验结果显示,SJF算法能够有效地减少平均等待时间和周转时间,但是对于长时间进程会出现饥饿现象。
4. RR(时间片轮转)调度算法RR算法是按照时间片的方式进行调度的,每个进程被分配一个固定的时间片,当时间片用完后,进程被挂起,等待下一次调度。
我们通过设置不同的时间片长度,观察RR算法的运行情况。
实验结果显示,RR算法能够公平地分配CPU 时间,并且能够较好地处理长时间和短时间进程。
实验结果与讨论:通过对不同进程调度算法的模拟实验,我们得出了以下结论:1. FCFS算法适用于长时间运行的进程,但对于短时间进程容易出现饥饿现象。
2. SJF算法能够有效地减少平均等待时间和周转时间,但对于长时间进程也容易出现饥饿现象。
3. RR算法能够公平地分配CPU时间,但对于长时间进程可能会产生较大的上下文切换开销。
进程调度算法模拟实验报告

竭诚为您提供优质文档/双击可除进程调度算法模拟实验报告篇一:操作系统进程调度算法模拟实验报告进程调度算法模拟专业:xxxxx学号:xxxxx姓名:xxx实验日期:20xx年xx月xx日一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。
二、实验要求编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法分别进行模拟调度。
三、实验方法内容1.算法设计思路将每个进程抽象成一个控制块pcb,pcb用一个结构体构建一个进程调度类。
将进程调度的各种算法分装在一个类中。
类中存在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程。
还有一个pcb实例。
主要保存正在运行的进程。
类中其他方法都是围绕这三个容器可以这个运行中的pcb展开。
主要用到的技术是sTL中的vector以维护和保存进程容器、就绪容器、完成容器。
当程序启动时,用户可以选择不同的调度算法。
然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。
进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。
判断进程容器中是否有新的进程可以加入就绪队列。
2.算法流程图主程序的框架:();//先来先服务();//最短进程优先调度//简单时间片轮转//最高优先数优先//输入进程信息();.m_waitQueue.empty()||.m_processQueue.empt() ();进程调度过程:;3.算法中用到的数据结构structfcfs{//先来先服务算法从这里开始charname[10];floatarrivetime;floatservicetime;float starttime;floatfinishtime;floatzztime;floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息4.主要的常量变量vector m_processQueue;//进程输入队列vector m_waitQueue;//进程就绪队列vectorm_FinishQueue;//完成队列vect(:进程调度算法模拟实验报告)or ::iteratorm_iter;//迭代器pcbm_runprocess;//运行中的进程intm_processcount;//进程数floatm_RunTime;//运行时间intm_tagIsRun;//是否在运行标志。
模拟进程调度实验报告

模拟进程调度实验报告摘要本实验主要采用C语言编写程序,模拟简单的进程调度框架,通过调度算法模拟CPU对于不同进程的调度过程,进一步深化对进程调度算法的理解和应用。
在实验过程中,我们采用了先来先服务(FCFS)、时间片轮转(RR)和优先级调度算法(PSA)三种调度算法进行模拟,并对不同算法的表现进行性能比较和分析。
实验结果表明,PSA算法和FCFS算法的平均等待时间和平均周转时间要比RR算法更小。
RR算法通过时间片的切换,能够较好地解决短进程优先的问题,但对于长进程来说仍然存在较大的等待时间。
在进行进程调度算法的选择时,需根据具体需求和系统特性综合考虑,选择合适的算法以达到最佳性能。
关键词:进程调度、先来先服务、时间片轮转、优先级调度算法、等待时间、周转时间Abstract一、引言进程调度是操作系统的核心概念之一,是操作系统对计算机硬件资源的有效管理机制。
操作系统需要根据一定的策略对进程进行调度,分配CPU时间片、内存等资源,使多个进程在同时执行的情况下,能高效地共享计算机硬件资源。
进程调度算法的优化和改进对操作系统的性能和运行效率至关重要。
本实验主要针对常用的三种进程调度算法,即先来先服务(FCFS)、时间片轮转(RR)和优先级调度算法(PSA),通过程序模拟这些算法的调度过程,进一步深入理解和应用进程调度算法,对进程调度算法进行性能比较和分析。
二、实验设计1.先来先服务算法(FCFS)我们通过先来先服务算法(FCFS)进行模拟。
FCFS算法即按照进程到达时间的先后顺序进行调度,当前一个进程执行完成后,才调度下一个进程,并按照到达的先后顺序不断地运行进程,直到所有进程执行完成。
在程序中,我们首先对进程进行排序,按照到达的先后顺序排列,模拟进程的到达过程。
然后,我们采用循环语句和判断语句模拟CPU对进程的调度过程,记录每个进程的等待时间和周转时间,并计算出平均等待时间(AWT)和平均周转时间(ATT)。
进程调度算法的实现实验报告

进程调度算法的实现实验报告南昌大学实验报告---(4)进程调度算法的实现学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:实验成绩:一、实验目的通过实验加强对进程调度算法的理解和掌握。
二、实验内容编写程序实现进程调度算法,具体可以编写程序实现先来先服务算法或优先度高者调度算法。
三、实验要求1、需写出设计说明;2、设计实现代码及说明;3、运行结果;四、主要实验步骤1、分析实验内容,画出算法流程图;2、根据流程图写出实验代码;3、编译代码,验证结果正确与否;4、对程序进行修改,得到最后结果。
流程图如下: 开始系统随机产生数据将数据按照到达时间从小到大排序用户输入数据进程到达时前一个进程是否已经完成完成时间=服务时间+前一个进程完成时间完成时间=服务时间+到达时间周转时间=完成时间-到达时间带权周转时间=完成时间/服务时间是否所有进程已完成计算输出结果结束YN YN YN五、实验数据及处理结果六、实验体会或对改进实验的建议在做这个实验的时候,一开始以为很简单,只要做简单的加减乘除就行了,但是仔细做过以后发现需要考虑很多情况。
比如说输入进程到达时间的时候,要是乱序的该怎么办?还有到达时间和服务时间等等定义的都是整型变量,但是带权周转时间确会得到小数,此时就需要用到强制转换。
在做系统产生随机数的时候也要考虑随机数的范围,如到达时间可以为0,但是服务时间却不能为0,否则带权周转时间的计算会出错。
七、参考资料《计算机操作系统》《计算机操作系统实验指导书》《C程序设计》《C语言程序设计_现代方法》八、实验代码#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 5 //进程个数,可改变int rt[N]; //到达时间int st[N]; //服务时间int ct[N]; //完成时间int cyt[N]; //周转时间float rct[N]; //带权周转时间float av[2];int n,m,c=1,which;void line() //美化程序,使程序运行时更加明朗美观{p rintf("------------------------------------------------------------------\n");}void start() //表示FCFS算法开始{l ine();p rintf(" FCFS 算法开始\n");p rintf("——Designed by Zhang Hong\n");l ine();}void end() //表示FCFS算法结束{l ine();p rintf(" FCFS算法结束,谢谢使用\n");l ine();}void input(){p rintf("请输入%d个进程的到达时间:",N);f or (n=0;n<N;n++)scanf("%d",&rt[n]);p rintf("请输入%d个进程对应的服务时间:",N);f or (n=0;n<N;n++)scanf("%d",&st[n]);}void random(){s rand((unsigned)time(NULL));f or (n=0;n<N;n++){rt[n]=rand()%100;for (m=0;m<n;m++)if (n!=0 && rt[n]==rt[m]){rt[n]=rand()%100;m=0;}st[n]=rand()%98+1;for (m=0;m<n;m++)if (n!=0 && st[n]==st[m]){st[n]=rand()%98+1;m=0;}}}void ordination() //重新排序,应对出现输入的到达时间为乱序的情况{i nt temp;f or (n=0;n<N;n++)for (m=0;m<N-n-1;m++)if (rt[m+1]<rt[m]){temp=rt[m+1];rt[m+1]=rt[m];rt[m]=temp;temp=st[m+1];st[m+1]=st[m];st[m]=temp;}}void fcfs() //执行fcfs算法{a v[0]=0;a v[1]=0;c t[0]=rt[0]+st[0];f or (n=1;n<N;n++){if (ct[n-1]>=rt[n]) //考虑当前一个进程完成而后一个进程还没有到达的情况ct[n]=ct[n-1]+st[n];elsect[n]=rt[n]+st[n];}f or (n=0;n<N;n++)cyt[n]=ct[n]-rt[n];f or (n=0;n<N;n++)rct[n]=(float)cyt[n]/(float)st[n];f or (n=0;n<N;n++){av[0]+=(float)cyt[n]/N;av[1]+=rct[n]/N;}}void output() //输出结果{l ine();p rintf("进程名\t");f or (n=0;n<N;n++)printf("\t%c",65+n);p rintf("\t平均\n到达时间");f or (n=0;n<N;n++)printf("\t%d",rt[n]);p rintf("\n服务时间");f or (n=0;n<N;n++)printf("\t%d",st[n]);p rintf("\n完成时间");f or (n=0;n<N;n++)printf("\t%d",ct[n]);p rintf("\n周转时间");f or (n=0;n<N;n++)printf("\t%d",cyt[n]);p rintf("\t%0.1f",av[0]);p rintf("\n带权周转时间");f or (n=0;n<N;n++)printf("\t%0.1f",rct[n]);p rintf("\t%0.1f",av[1]);p rintf("\n");l ine();}void main(){s tart();f or (;c==1;){for (;;){printf("输入数据还是由系统随机产生数据?\n1、输入数据\t2、系统随机产生数据\n请输入:");scanf("%d",&which);if (which==1){input();break;}elseif (which==2){random();break;}printf("输入错误,请重新输入!");}ordination(); //进程按照到达时间进行排序fcfs();output();printf("继续输入,退出输入。
【精品】进程调度算法模拟实验报告

【精品】进程调度算法模拟实验报告一、实验目的本实验通过模拟进程的调度算法,使学生掌握多种进程调度算法的实现过程及其优缺点。
二、实验内容本实验实现了三种进程调度算法:先来先服务(First Come First Served,FCFS)、最短作业优先(Shortest Job First,SJF)、时间片轮转(Round Robin,RR)。
(一)FCFS算法FCFS算法是一种非抢占式的进程调度算法,按照进程到达的先后顺序进行执行,即先到达的进程先被执行,后到达的进程后被执行。
当一个进程在执行过程中发生等待时,其他新到达的进程会继续执行。
等待时间长的进程会长时间等待,造成了响应时间长的问题。
SJF算法是一种动态优先级的进程调度算法,按照进程预计运行时间的大小来决定其优先级,预计运行时间短的进程具有高优先级。
当一个新进程到达时,如果其预计运行时间比当前正在运行的所有进程都短,那么这个新进程就可以立即执行。
该算法在保证短作业优先的同时,可能会导致长作业饥饿的问题。
(三)RR算法RR算法是一种抢占式的进程调度算法,每个进程被分配一个时间片,当一个进程的时间片用完时,就被剥夺CPU,然后排到队列的末尾,等待下一次调度。
该算法能够保证每个进程的响应时间比较短,但可能会导致CPU利用率较低。
三、实验步骤(一)编写程序框架首先,根据实验要求,编写完整的程序框架,包括进程类Process和调度器类Scheduler。
Process类中包含了进程需要的属性和方法,如进程ID、进程到达时间、进程执行时间、进程状态等。
Scheduler类中包含了进程调度所需要的方法,如FCFS、SJF、RR 调度算法等。
(二)实现进程调度算法FCFS算法较为简单,只需要按照进程到达时间排序即可。
```pythondef FCFS(self):queue = Queue()process_time = 0while not self.is_finished():ready_process = self.get_arrived_process(process_time)if ready_process:queue.put(ready_process)if not queue.empty():current_process = queue.get()current_process.status = 'running'current_process.start_time = process_timecurrent_process.end_time = current_process.start_time + current_process.run_timeself.finished_processes.append(current_process)process_time += 1```2. SJF算法SJF算法需要进行进程预计运行时间的排序,然后按照排序后的顺序进行执行。
实验四_进程调度(2)

实验四进程调度(二)实验目的进程调度是处理器管理的核心内容。
本实验要求用高级语言编写和调试一个简单的进程调度程序,通过本实验加深对进程控制块、进程队列等概念的了解,掌握时间片调度算法的具体实施方法。
实验类型设计型实验预习要求已完成进程管理理论课程的学习,了解进程、进程调度的基本概念以及典型进程调度算法的基本思想。
实验设备与环境PII以上电脑一台,已经安装VC++、GCC或其他C语言编译环境实验原理操作系统是计算机系统中必不可少的系统软件。
它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。
进程调度解决了竞争处理器的问题。
进程调度程序按照某种调度算法从就绪队列中选择一个进程,让它占用处理器。
或者说,进程调度程序把处理器分配给了一个被选中的进程。
所以,有时也把进程调度程序称为“处理器调度”程序。
在时间片轮转调度算法方面:时间片取值的大小关系到计算机系统的效率和用户的满意度,所以,时间片的值应根据进程要求系统给出应答时间和进入系统的进程数来决定。
如果要求系统快速应答则时间片小一些,这样使轮转一遍的总时间减少而可对进程尽快回答。
如果进程数少,则时间片可以大一些,这样可减少进程调度的次数,提高系统效率。
对每个进程可规定相同的时间片,也可对不同的进程规定不同的时间片。
实验任务设计一个程序,根据不同的调度算法模拟操作系统对进程的调度。
调度算法: 时间片循环法1、设计进程控制块PBC表结构,适用循环时间片轮转算法。
2、 PBC结构通常包括以下信息:进程名、进程优先数、轮转时间片、进程的CPU时间,进程状态等。
根据调度算法不同,PCB结构可作适当的调整。
3、建立进程队列。
对不同的算法编制不同的入链程序。
程序要求达到的运行效果:在设置好进程数量、调度算法后,系统能按设定的参数运行,并在屏幕上交替显示就绪队列和完成队列的进程名等信息。
实验步骤和方法编制调度算法:、循环时间轮转调度1、数据结构设计:PCB结构:name 进程名round 进程轮转时间片cputime 进程占用的CPU时间needtime 进程到完成还要的时间state 进程状态(假设状态为Ready、Run、Finish)next 链指针2、算法设计时间以时间片为计量单位。
操作系统进程调度模拟程序实验报告

操作系统进程调度模拟程序实验报告实验目的:了解操作系统进程调度的基本原理和方法,通过编写模拟程序来验证调度算法的正确性。
实验内容:1. 实现进程调度模拟程序,包括进程的创建、调度、挂起、恢复和销毁等基本操作。
2. 实现三种常用的调度算法:先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转(RR)。
3. 对比不同调度算法的性能,包括平均等待时间、平均周转时间和平均响应时间等指标。
实验步骤:1. 首先定义进程类Process,包括进程的ID、到达时间、执行时间和优先级等属性。
2. 实现创建进程的函数create_process,通过用户输入的方式创建多个进程,并保存到一个进程队列中。
3. 根据选择的调度算法,实现调度函数schedule,按照对应的算法对进程进行调度,并记录每个进程的执行时间和等待时间等信息。
4. 对于FCFS算法,按照进程的到达时间进行排序,然后按顺序执行。
5. 对于SJF算法,按照进程的执行时间进行排序,然后按顺序执行。
6. 对于RR算法,设定一个时间片大小,每个进程执行一个时间片后,将其放回队列末尾,然后继续执行下一个进程,直到所有进程都执行完毕。
7. 在各个调度算法中计算平均等待时间、平均周转时间和平均响应时间等指标,并输出结果。
实验结果:通过对不同进程和不同调度算法的模拟,可以得到如下结果:1. FCFS调度算法的平均等待时间较长,不适用于执行时间较长的任务。
2. SJF调度算法的平均等待时间和平均周转时间较短,适用于执行时间较短的任务。
3. RR调度算法能够平均分配CPU时间,适用于执行时间较长的任务。
实验总结:通过本次实验,我们进一步加深了对操作系统进程调度的理解和认识。
通过编写模拟程序,我们能够清楚地了解不同调度算法的工作原理和对应的性能表现。
在实际应用中,根据任务的特点和需求选择合适的调度算法,能够提高系统的性能和效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机操作系统综合设计
实验四
实验名称:进程调度模拟实现
实验类型:设计型实验
实验环境: Visual C++ 6.0
指导老师:陈立伟
专业班级:
姓名:
学号:
联系电话:
实验地点:东六E座4-02
实验日期: 2014年12月7日
实验报告日期: 2014年12月 7日
成绩:__________________________
一、实验目的
1)理解进程调度相关理论。
2)掌握FCFS进程调度方法。
二、实验平台
windows 7 Visual C++ 6.0
三、实验步骤
1、实验内容
1)设计可用于该实验的进程控制块,进程控制块至少包括进程号、到达时间和要求服务时间;
2)动态或静态创建多个(≥10)进程;
3)实现FCFS或其他调度算法;
4)可动态修改进程到达时间;
5)调度所创建的进程并显示调度结果。
2、实验步骤
1)输入给定的实验指导书中提供的代码
A、打开Visual C++ 6.0;
B、新建c++文件,创建FCFS.cpp;
2)进行功能测试并得出正确结果
A、编译、运行FCFS.cpp;
输入8,即是8个进程数。
输入8个进程号,以及到达时间和所需时间。
得到执行结果:
进程执行的先后顺序;
进程开始执行的时间;
输入y:要修改输入修改项,再次得到结果;
四、实验总结
因为FCFS是先来先服务的算法,我们是依据它的进程到达的时间来规定进程的执行顺序的,所以还要对输入的进程,按照它的进程到达时间来排序,并按照这个顺序执行进程,输入的有进程号,进程到达时间,进程执行时间,所以我们定义了一个结构体,里面包含了以上三个内容,并且定义两个全局变量:int time = 0; char flag = 'y'; 来计算总的时间还有标识是否结束程序,初始化为0和标识程序不结束的标识y。
因为进程号不应该相同,所以我们不应该在输入的时候还要做一个判断遍历前面已经输入的进程,若当前输入的进程号已经存在那么提示并重新输入,不存在则顺序执行。
当要修改程序到达的时间,我们要修改的必须是一个存在的,所以在做修改的输入判断的时候,就是遍历所有的进程,当输入的进程号存在的时候才做出相应动作,如果不存在那么输出提示并询问是否继续修改。