2100062黄耿星多级反馈队列实验报告Word格式.docx
- 文档编号:3624351
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:18
- 大小:212.69KB
2100062黄耿星多级反馈队列实验报告Word格式.docx
《2100062黄耿星多级反馈队列实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《2100062黄耿星多级反馈队列实验报告Word格式.docx(18页珍藏版)》请在冰点文库上搜索。
2、采用多级反馈队列调度算法进行进程调度。
3、每个进程对应一个PCB。
在PCB中包括进程标识符pid、进程的状态标识status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。
4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid是在1到100范围内的一个整数。
可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程标识号是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。
5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。
被进程调度程序选中后变为“run”。
6、进程优先级priority是0到49范围内的一个随机整数。
7、进程生命周期life是1到5范围内的一个随机整数。
8、初始化时,创建一个邻接表,包含50个就绪队列,各就绪队列的进程优先级priority分别是0到49。
9、为了模拟用户动态提交任务的过程,要求动态创建进程。
进入进程调度循环后,每次按ctrl+f即动态创建一个进程,然后将该PCB插入就绪队列中。
按ctrl+q退出进程调度循环。
10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。
将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。
设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。
如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪队列中;
否则该进程执行完成,撤消其PCB。
以上为一次进程调度循环。
11、在上机实现该程序之后,要求写出实验报告,其中包括实验名称、实验目的、实验内容、程序的主要流程图、实验心得和主要源程序清单等。
四、需求分析:
进程调度虽然是操作系统内部的低级调度,但进程调度的优劣直接影响操作系统的整体性能。
对进程调度性能的衡量方法可分为定性和定量2种。
在定性衡量方面,首先是调度的可靠性。
另外,间接性也是衡量进程调度的一个重要指标。
而对于进程调度的定量评价包括CPU的利用率评价、进程在就绪队列中的等待时间与执行时间之比等。
进程调度的算法包括:
先来先服务(FCFS)、轮转法(RR)、多级反馈队列等。
其中多级反馈队列在实际应用中起着比较突出的作用。
因此,我们有必要深入剖析理解该算法。
五、详细设计
1.流程图
开始
YN
N
Y
2.程序源代码
/********************************************************
*名称:
OnDraw
*参数:
无
*功能:
在屏幕上显示邻接链表
*返回值:
void
*作者:
hgx
*日期:
2012-5-27
*********************************************************/
voidCMyView:
:
OnDraw(CDC*pDC)
{
CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->
SetTextColor(RGB(0,0,255));
TextOut(0,0,pDoc->
str);
TextOut(0,20,pDoc->
illustrate);
//设置间隔
inttx=120,ty=30;
COLORREFcolor=RGB(255,0,0);
SetTextColor(color);
CPenMyPen1,MyPen2,*oldPen;
MyPen1.CreatePen(PS_SOLID,3,color);
MyPen2.CreatePen(PS_SOLID,3,RGB(0,0,0));
oldPen=pDC->
SelectObject(&
MyPen1);
CRectrcReg(0,20,120,40);
//依次画出每一个邻接链表
for(inti=50;
i>
=0;
i--)
{
//头结点
rcReg.top+=ty;
rcReg.bottom+=ty;
pDC->
Rectangle(rcReg);
DrawText(MyMetric.MyVexNode[i].str,rcReg,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//边节点
CRectrcNode(rcReg);
LinkNode*p=MyMetric.MyVexNode[i].firstNode;
while(p!
=NULL)
{
pDC->
MyPen2);
rcNode.left+=tx;
rcNode.right+=tx;
Rectangle(rcNode);
CStringtemp;
temp.Format("
PID=%d%s%d"
p->
pid,p->
status,p->
life);
DrawText(temp,rcNode,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
p=p->
next;
}
}
//恢复默认
oldPen);
}
CMetric
初始化邻接链表50个数据分别代表50个优先等级(0-49)
CMetric:
CMetric()
count=0;
for(inti=0;
i<
50;
i++)
MyVexNode[i].firstNode=NULL;
MyVexNode[i].str.Format("
优先级别%d"
i);
执行进程:
"
);
memset(check,0,100);
~CMetric
析构函数回收资源报错?
?
why?
~CMetric()
//delete[]MyVexNode;
//delete[]check;
AddLinkNode
生成节点,并添加到邻接链表中
voidCMetric:
AddLinkNode()
LinkNode*newLinkNode;
newLinkNode=newLinkNode;
//next
newLinkNode->
next=NULL;
//status
status.Format("
ready"
srand((unsigned)time(NULL));
//产生随机pid(1-100)
pid=GetOnlynum()+1;
//产生随机priority(0-49)
priority=rand()%50;
//产生随机life(1-5)
life=rand()%5+1;
InsetLinkNode(newLinkNode);
count++;
GetOnlynum
产生唯一的PID
int唯一的PID(0-99)
intCMetric:
GetOnlynum()
intnum=rand()%100;
//判断是否唯一
while(check[num])
num=rand()%100;
check[num]=true;
returnnum;
InsetLinkNode
LinkNode&
newNode
将PID唯一的进程加入邻接链表中
InsetLinkNode(LinkNode*newNode)
intpriority=newNode->
priority;
if(MyVexNode[priority].firstNode==NULL)
{
MyVexNode[priority].firstNode=newNode;
else
LinkNode*p=MyVexNode[priority].firstNode;
while(p->
next!
p=p->
p->
next=newNode;
Execute
进程调度循环取优先级别最高的第一个进程执行
Execute()
//处理旧的进程(若有)
LinkNode*oldPro=MyMetric.MyVexNode[50].firstNode;
if(oldPro!
MyMetric.MyVexNode[50].firstNode=NULL;
//置空
oldPro->
priority=oldPro->
priority/2;
//先级减半,生命周期减一
oldPro->
life--;
if(oldPro->
life!
=0)//如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入
//就绪队列中;
//将旧的进程插入新优先级的队列中
InsetLinkNode(oldPro);
else
MyMetric.count--;
MyMetric.check[oldPro->
priority]=false;
//撤销PCB
if(MyMetric.count>
0)
//处理新的进程
inti=49;
while(MyMetric.MyVexNode[i].firstNode==NULL)
i--;
LinkNode*p=MyMetric.MyVexNode[i].firstNode;
MyMetric.MyVexNode[i].firstNode=p->
running"
MyMetric.MyVexNode[50].firstNode=p;
MessageBox(NULL,"
所有进程执行完毕!
"
多级反馈队列"
MB_OK);
六、软件测试:
1、执行程序
2、创建进程
3、进程执行
4、执行完毕
七、心得体会:
通过本次实验,我更深入地学习了VisualC++、MFC程序设计。
深入理解了进程调度的机制以及多级反馈队列算法,并用高级语言进行模拟演示。
八、参考文献:
[1]张尧学。
计算机操作系统教程第三版[M].北京:
清华大学出版社,2006.10
[2]杨喜林。
可视化程序设计VisualC++[M].北京:
北京理工大学出版社,2010.2
[3]侯俊杰。
深入浅出MFC[M].台湾:
华中科技大学出版社,2010.2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2100062 黄耿星 多级 反馈 队列 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)