进程调度算法实验报告doc.docx

上传人:b****6 文档编号:16042003 上传时间:2023-07-10 格式:DOCX 页数:9 大小:19.26KB
下载 相关 举报
进程调度算法实验报告doc.docx_第1页
第1页 / 共9页
进程调度算法实验报告doc.docx_第2页
第2页 / 共9页
进程调度算法实验报告doc.docx_第3页
第3页 / 共9页
进程调度算法实验报告doc.docx_第4页
第4页 / 共9页
进程调度算法实验报告doc.docx_第5页
第5页 / 共9页
进程调度算法实验报告doc.docx_第6页
第6页 / 共9页
进程调度算法实验报告doc.docx_第7页
第7页 / 共9页
进程调度算法实验报告doc.docx_第8页
第8页 / 共9页
进程调度算法实验报告doc.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

进程调度算法实验报告doc.docx

《进程调度算法实验报告doc.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告doc.docx(9页珍藏版)》请在冰点文库上搜索。

进程调度算法实验报告doc.docx

进程调度算法实验报告doc

进程调度算法实验报告

篇一:

操作系统进程调度算法模拟实验报告

  进程调度算法模拟

  专业:

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;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;

  };//定义一个结构体,里面包含的有一个进程相关的信息

  4.主要的常量变量

  vectorm_ProcessQueue;//进程输入队列

  vectorm_WaitQueue;//进程就绪队列vectorm_FinishQueue;//完成队列vector:

:

iteratorm_iter;//迭代器PCBm_runProcess;//运行中的进程

  intm_ProcessCount;//进程数floatm_RunTime;//运行时间

  intm_tagIsRun;//是否在运行标志。

表示正在运行,表示没有floatm_TimeSlice;//时间片大小

  intm_TimeSliceCount;//指时间片轮转中一次分到的时间片个数charm_SchedulerAlgorithm;//调度算法

  5.主要模块

  voidPCBInput();//输入进程信息

  voidPCBSort();//对进程控制块按照优先级排序(采用冒泡排序)

  voidProcessSelect();//若当前就绪队列不为空则根据选择的调度算法开始调度。

否则,系统时间voidPCBDisplay();//打印当前状况下。

就绪队列、完成队列、运行中的进程信息

  voidProcessRun();//进程运行一次。

运行时间加个时间片。

并判断进程是否达到完成条件。

若是则voidProcessQueueProcess();//查看当前时间下,有无进程加入。

若有则把该进程调入就绪队列voidProcessDispatch();//进程分派,进程执行完成后决定进程该进入哪个队列(就绪、完成)voidTimePast(){m_RunTime+=m_TimeSlice;ProcessQueueProcess();}//当前系统时间加个时间voidSchedulerStatistics();//调度统计,计算周转时间等voidFCFS();//先来先服务voidSJF();//最短进程优先调度voidRR();//简单时间片轮转voidPD();//最高优先数优先

  加.以等待新的进程到来

  ProcessStatus='f'.否则为'w';

  片,并检查是否有新的进程加入

  四、实验代码

  #include#include#include

  usingnamespacestd;

  structfcfs{//先来先服务算法从这里开始charname[10];floatarrivetime;floatservicetime;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;

  };//定义一个结构体,里面包含的有一个进程相关的信息

  fcfsa[100];

  voidinput(fcfs*p,intN){inti;

  cout  for(i=0;i  }}

  voidPrint(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN)

  {intk;

  printf("\n\n调用先来先服务算法以后进程运行的顺序是:

");printf("%s",p[0].name);for(k=1;k%s",p[k].name);}

  cout  printf("\t进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n");

  for(k=0;k  printf("\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n",p[k].name,p[k].arrivetime,

  p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

  }

  getchar();//此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪

  }

  voidsort(fcfs*p,intN)//排序

篇二:

进程的调度算法实验报告-计算机操作系统教程(第三版)

  进程的调度算法实验报告(完整版)

  一、实验目的:

  用高级语言编写和调试一个简单的进程调度程序。

加深了解有关进程控制块,进程队列的概念,并体会和了解优先数和时间片调度算法的具体实施方法。

  二、实验内容:

  根据不同的调度算法模拟操作系统对进程的调度。

调度算法有二种:

动态优先级法和时间片循环法。

  1、设计进程控制块PCB表结构,分别适用优先数调度算法和循环时间片轮转算法。

  2、PCB结构通常包括以下信息:

进程名、进程优先数、轮转时间片、进程的CPU时间,进程状态等。

根据调度算法不同,PCB结构可作适当的调整。

  3、建立进程队列。

对不同的算法编制不同的入链程序编制两种进程调度算法:

a、优先数调度;b、循环时间轮转调度

  三、实验设计

  1.实验原理:

  2.算法思想:

  以时间片为计量单位

  A:

优先数调度算法

  1)系统初始化时给每一个进程赋一个NEEDTIME和初始PRI。

并按优先数入队。

  2)系统每次选定一个优先级最高的进程投入运行,进程每执行一次,优先数减2,并将它的进程占用的CPU时间加10,进程到完成还要的CPU时间减10。

  3)每当一个进程运行一个时间片后,系统根据它的CPUTIME来判断它是否已经结束,若CPUTIME>0,那么将它重新排入就绪队列。

  4)如果系统中尚有进程没有运行完毕,那么转入2)。

  B:

循环时间片轮转算法

  1)系统初始化时给每一个进程赋以一个NEEDTIME,并将所有进程按进入的次序排成一个队列。

  2)取队头进程,并投入运行。

  3)采用相对固定时间片(ROUND),进程每执行一次,进程占用的CPU时间加ROUND,进程到完成还要的CPU时间减ROUND。

并排到就绪队列的尾部。

  4)如果当前进程的NEEDTIME>0,那么将它排到队尾。

  5)如果尚有进程在队列中,那么转入2)

  3.编程语言、主要数据结构和意义

  使用VC6.0语言

  PCB结构:

name进程名

  pri/round进程优先数/进程轮转时间片

  cputime进程占用的CPU时间

  needtime进程到完成还要的时间

  state进程状态(假设状态为Ready、Run、Finish)

  next链指针

  voidshowlist(link,char*,int);//显示进程队列

  voidinstlist(link,link);//按优先数插入进程

  voidappenlist(link,link);//按就绪先后加入进程

  linkgethead(link);//取队首进程

  4.流程图(优先数算法)

  5.源程序(含主要注释)

  #include"stdlib.h"

  #include"iostream.h"

  #include"string.h"

  constintMAX=5;

  constintROUND=2;

  constchar*ITOA[10]={"0","1","2","3","4","5","6","7","8","9"};typedefenumflag{Ready,Run,Finish};

  structpcb

  {

  public:

  charname[10];//进程名

  intpri;//进程优数

  intround;//进程轮转时间片

  intcputime;//进程占用的CPU时间

  intneedtime;//进程到完成还要的CPU时间flagstate;//进程状态

  structpcb*next;//链指针

  };

  typedefstructpcbplist;

  typedefplist*link;

  voidmain()

  {

  voidshowlist(link,char*,int);//显示进程队列v

oidinstlist(link,link);//按优先数插入进程voidappenlist(link,link);//按就绪先后加入进程linkgethead(link);//取队首进程

  intnum=MAX+1;

  charstr[10];

  linkptr,head1,head2;

  inti;

  intj=0;

  head1=newplist;

  head1->next=NULL;//就绪队首指针

  head2=newplist;

  head2->next=NULL;//完成队首指针

  while((num>MAX)||(num  {

  //printf("请输入演示进程数\n");

  cout  //scanf("%d",&num);

篇三:

操作系统原理---进程调度实验报告

  一、实验目的通过对进程调度算法的设计,深入理解进程调度的原理。

  进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。

  进程通过定义一个进程控制块的数据结构(PCB)来表示;每个进程需要赋予进程ID、进程到达时间、进程需要运行的总时间的属性;在RR中,以1为时间片单位;运行时,输入若干个进程序列,按照时间片输出其执行序列。

  二、实验环境

  VC++6.0

  三、实验内容

  实现短进程优先调度算法(SPF)和时间片轮转调度算法(RR)[提示]

  :

  

(1)先来先服务(FCFS)调度算法

  原理:

每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。

该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。

  将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。

它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。

  按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长。

  

(2)时间片轮转调度算法RR

  原理:

时间片轮转法主要用于进程调度。

采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。

进程调度按一定时间片(q)轮番运行各个进程.

  进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。

  固定时间片轮转法:

  1所有就绪进程按FCFS规则排队。

  2处理机总是分配给就绪队列的队首进程。

  3如果运行的进程用完时间片,则系统就把该进程送回就绪队列的队尾,重新排队。

4因等待某事件而阻塞的进程送到阻塞队列。

  5系统把被唤醒的进程送到就绪队列的队尾。

  可变时间片轮转法:

  1进程状态的转换方法同固定时间片轮转法。

  2响应时间固定,时间片的长短依据进程数量的多少由T=N×(q+t)给出的关系调整。

  3根据进程优先级的高低进一步调整时间片,优先级越高的进程,分配的时间片越长。

多就绪队列轮转法:

  (3)算法类型

  (4)模拟程序可由两部分组成,先来先服务(FCFS)调度算法,时间片轮转。

流程图如下:

  (5)按模拟算法设计程序,运行设计的程序,观察得到的结果。

  四、实验结果(含程序、数据记录及分析、实验总结等)

  MFC的设计框如下:

  实验代码以及分析:

  RR算法实现分析:

先根据到达时间对进程进行排序,然后调度时,超出时间片的就放至队尾,然后继续调度。

  变量添加:

  intm_id;IDC_EDIT_ID

  用来输入进程ID

  intm_reachtime;IDC_EDIT_REACHTIME用来输入进程到达时间intm_run;IDC_EDIT_RUN

  用来输出正在运行的进程

  intm_runtime;IDC_EDIT_RUNTIME

  用来输入进程运行时间

  intm_timeslice;IDC_EDIT_TIMELICE用来输入时间片

  CStringm_result;IDC_EDIT_RESULT

  用来输出最终调度队列

  CStringm_readyqueue;IDC_EDIT_READYQUEUE

  用来输出等待队列

  CStringm_pcb;IDC_EDIT_PCB

  用来显示输入的进程信息

  数据存储:

利用结构体来存储进程信息

  structPCB{

  intid;intreachtime;intruntime;

  }pcb[1000],pcb1[1000];

  添加进程:

  voidCMfcDlg:

:

OnADD()

  {

  //TODO:

AddyourcontrolnotificationhandlercodehereUpdateData(true);

  CStringstr1;

  pcb[NO].id=m_id;

  pcb[NO].reachtime=m_reachtime;

  pcb[NO].runtime=m_runtime;

  str1.Format("%-8d%-8d%-8d\r\n",m_id,m_reachtime,m_runtime);m_pcb+=str1;

  m_id=0;m_id=0;

  m_reachtime=0;

  m_runtime=0;

  NO++;

  UpdateData(false);

  }

  RR算法

  voidCMfcDlg:

:

OnRr()

  {

  //TODO:

AddyourcontrolnotificationhandlercodehereUpdateData(true);

  m_result.Empty();

  UpdateData(FALSE);

  UpdateWindow();

  intNO2=NO;

  inta[1000];

  for(inti=0;i  a[i]=pcb[i].reachtime;

  }

  inttemp;//冒泡排序for(i=1;i  for(intj=NO-1;j>=i;j--){

  if(a[j]  temp=a[j-1];

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2