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

上传人:b****5 文档编号:5060536 上传时间:2022-12-12 格式:DOCX 页数:9 大小:43.86KB
下载 相关 举报
进程调度算法实验报告.docx_第1页
第1页 / 共9页
进程调度算法实验报告.docx_第2页
第2页 / 共9页
进程调度算法实验报告.docx_第3页
第3页 / 共9页
进程调度算法实验报告.docx_第4页
第4页 / 共9页
进程调度算法实验报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

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

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

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

进程调度算法实验报告

进程调度算法实验报告

篇一:

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

进程调度算法模拟

专业:

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;float

dqzztime;

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

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#includeusingnamespacestd;

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

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

fcfsa[100];

voidinput(fcfs*p,intN){inti;

coutfor(i=0;i}}

voidPrint(fcfs*p,floatarrivetime,float

servicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN)

{intk;

printf("\n\n调用先来先服务算法以后进程运行的顺序是");printf("%s",p[0].name);for(k=1;k%s",p[k].name);}

coutprintf("\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)系统初始化时给每一个进程赋一个NEEDTIM话口初始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);//显示进程队列

#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时间

flag

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

structpcb*next;//链指针

};

typedefstructpcbplist;

typedefplist*link;

voidmain()

{

vvoidlink

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

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

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

gethead(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分配给就绪队列首进程使用一个时间片,运行完一个时

配给就绪队列的首进程。

固定时间片轮转法:

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

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

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

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

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

可变时间片轮转法:

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

2响应时间固定,时间片的长短依据进程数量的多少

由T=NX(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()

{

code

//TODO:

Addyourcontrolnotificationhandler

hereUpdateData(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_r

untime);m_pcb+=str1;

m_id=0;m_id=0;

m_reachtime=0;

m_runtime=0;

NO++;

UpdateData(false);

}

RR算法

voidCMfcDlg:

:

OnRr()

{

//TODO:

Addyourcontrolnotification

hereUpdateData(true);

m_result.Empty();

UpdateData(FALSE);

UpdateWindow();

intNO2=NO;

inta[1000];

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

}

inttemp;//冒泡排序for(i=1;i

handlercode

for(int

j=NO-1;j>=i;j--){

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

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

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1