动态优先权进程调度算法的模拟说课讲解Word文档格式.docx
- 文档编号:15696067
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:11
- 大小:89.03KB
动态优先权进程调度算法的模拟说课讲解Word文档格式.docx
《动态优先权进程调度算法的模拟说课讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《动态优先权进程调度算法的模拟说课讲解Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
本实验的目的就是用在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。
已知时间片轮转算法,可以根据时间片轮转的思路加以修改就行了。
时间轮转调度算法与动态优先权的区别就是时间片轮转是在FIFO进程调度的基础上,队列中的进程按照进入的顺序,每个进程每次都执行一个时间片;
如果运行完就把该进程释放掉,如果在一个时间片内未结束就插到队列尾部。
而动态优先权进程调度算法就是按照优先权的大小运行进程,如果一个时间片内未运行完,则将优先权数减3后再插入到队列中(不是队尾而是队列中的适当位置,该位置前面的节点的优先级数大于该节点的优先级数,后面的节点的count值小于该节点的count值)。
四、实验要求:
(1)在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。
为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程情况显示出来;
(2)进程控制块是进程存在的唯一标志,因此,在模拟算法中每一个进程用一个进程控制块PCB来代表,PCB用一结构体表示。
包括以下字段:
●进程标识数id,或者进程的名称name;
●进程优先数priority,并规定优先数越大的进程,其优先权越高;
●进程需要运行的CPU时间ntime;
●进程的运行时间rtime;
●进程状态state;
●队列指针next,用来将PCB排成队列。
(3)进程在运行过程中其状态将在就绪、执行、阻塞(可选)、完成几种状态之间转换,同时进程可能处于不同的队列中,如就绪队列、阻塞队列(可选)。
在两种调度算法中,考虑分别可以选择什么样的队列及如何实现进程的入队、出队操作;
(4)为了便于处理,优先权调度每次也仅让进程执行一个时间片,若在一个时间片内未运行结束,调整进程优先级将其插入就绪队列,进行新一轮调度;
(5)优先数改变原则:
●进程每运行若一个时间单位,优先数减3;
●进程在就绪队列中呆一个时间片,优先数增加1。
(仅供参考,合理即可)
(6)优先权调度中,对于遇到优先权一致的情况,可采用FCFS策略解决;
(7)由于是模拟进程调度,所以,对被选中的进程并不实际启动运行,而是修改进程控制块的相关信息来模拟进程的一次运行;
(8)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照格式如下:
idcputimeneedtimepriority(count)state
00248ready
(9)sort函数执行流程
五、实验步骤(包括主要步骤、代码分析等)
#include"
stdio.h"
#include<
stdlib.h>
#definegetpch(type)(type*)malloc(sizeof(type))
structpcb{//定义进程控制块
charname[10];
//进程的名字
charstate;
//进程的状态
intcount;
//进程优先级
intntime;
//进程运行需要的CPU时间
intrtime;
//进程已运行的时间
structpcb*link;
//连接pcb的指针
}*ready=NULL,*tail=NULL,*p;
//就绪队列指针,队尾指针
typedefstructpcbPCB;
intslice=1;
PCB*readyMaxProcess;
intreadyQueNum=0;
//就绪队列的进程数量
sort()//将进程插入到就绪指针
{
PCB*q;
if(ready==NULL)//队列为空,将p插入到队列中
{
ready=p;
tail=p;
}
else//若就绪队列不为空,将p插入到队列
if(p->
count>
ready->
count)//p指针所指节点的count值头的大于队列节点的count值,将p指针所指节点插入到对头
{p->
link=ready;
}
else
{boolm=false;
q=ready;
//q2=q1->
link;
while(m==false)
{
if(tail->
=p->
count)//若p的count值小于队尾指针所指节点的的count值的话,将p插到队尾
{
tail->
link=p;
tail=p;
p->
link=NULL;
m=true;
}
else
if(q->
count&
&
p->
q->
link->
count)//若p的count值大于队尾指针所指节点的的count值的话,将p所指节点插入到队列中指定位置
//必须满足插入位置的前一个节点的count值大于p->
count,并且满足插入位置的后一个节点的count值小于p->
count
{
link=q->
q->
m=true;
}
else
q=q->
//q2=q2->
}
}
input()
{
inti,num;
printf("
\n请输入进程个数:
"
);
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
printf("
\n进程号No.%d:
\n"
i);
p=getpch(PCB);
\n请输入进程名:
scanf("
%s"
p->
name);
\n请输入进程优先权数:
count);
\n请输入进程运行时间:
ntime);
p->
rtime=0;
state='
w'
;
sort();
//将进程p插入就绪队列ready中
\n请输入时间片大小:
slice);
//获得就绪队列中进程的个数
intspace()
PCB*pr=ready;
while(pr!
=NULL)
readyQueNum++;
pr=pr->
return(readyQueNum);
//显示进程
disp(PCB*pr)
\nqname\tstate\tcount\tndtime\truntime\n"
|%s\t"
pr->
|%c\t"
state);
|%d\t"
rtime);
//显示当前运行进程和就绪队列中进程的信息
check()
PCB*pr;
\n****当前正在运行的进程是:
readyMaxProcess->
disp(readyMaxProcess);
pr=ready;
\n****当前就绪队列状态为:
pr->
count++;
disp(pr);
//撤销进程
destroy()
\n进程[%s]已完成.\n"
free(readyMaxProcess);
//readyQueNum--;
//使当前进程运行一个时间片,若结束则撤销,否则插入就绪队列队尾
running()
inttempt=0;
tempt=readyMaxProcess->
ntime-readyMaxProcess->
rtime;
if(tempt>
slice)
readyMaxProcess->
rtime+=slice;
else
rtime+=tempt;
check();
if(readyMaxProcess->
rtime==readyMaxProcess->
ntime)
destroy();
else
{readyMaxProcess->
count=readyMaxProcess->
count-3;
p=readyMaxProcess;
//再将队头节点readyMaxProcess插入到队列时,现将赋给另一个指针p
main()
intlen,h=0;
input();
//输入进程并形成就绪队列
len=space();
//获得就绪队列中进程的个数
while((len!
=0)&
(ready!
=NULL))//若就绪队列不为空
{len=space();
h++;
\nTheexecutenumber:
%d\n"
h);
readyMaxProcess=ready;
//将指向队优先级最大的节点的指针指向队头节点
ready=ready->
//改变对头指针
//将优先级最大的进程从队列中分裂出来
R'
running();
\n\n所有进程已经完成.\n"
}
进程名/进程属性
运行所需时间ntime
进程的优先权数
进程a
10
8
进程b
9
5
进程c
6
六、实验结果
七、结果分析与总结
这个实验最主要就是理解动态优先权数调度算法的原理,利用c语言程序完成该过程的模拟。
在编写该程序的时候采用了很多方法(如双向
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 优先权 进程 调度 算法 模拟 讲解