进程调度算法实验报告.docx
- 文档编号:5060536
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:9
- 大小:43.86KB
进程调度算法实验报告.docx
《进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
进程调度算法实验报告
进程调度算法实验报告
篇一:
操作系统进程调度算法模拟实验报告
进程调度算法模拟
专业:
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];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 算法 实验 报告