操作系统进程调度算法的模拟Word格式文档下载.doc

上传人:b****1 文档编号:13168693 上传时间:2022-10-07 格式:DOC 页数:11 大小:281.50KB
下载 相关 举报
操作系统进程调度算法的模拟Word格式文档下载.doc_第1页
第1页 / 共11页
操作系统进程调度算法的模拟Word格式文档下载.doc_第2页
第2页 / 共11页
操作系统进程调度算法的模拟Word格式文档下载.doc_第3页
第3页 / 共11页
操作系统进程调度算法的模拟Word格式文档下载.doc_第4页
第4页 / 共11页
操作系统进程调度算法的模拟Word格式文档下载.doc_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

操作系统进程调度算法的模拟Word格式文档下载.doc

《操作系统进程调度算法的模拟Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《操作系统进程调度算法的模拟Word格式文档下载.doc(11页珍藏版)》请在冰豆网上搜索。

操作系统进程调度算法的模拟Word格式文档下载.doc

B

2

6

C

4

D

5

E

8

(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段(用不到的字段可以不定义)。

²

进程标识数ID。

进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

进程已占用CPU时间CPUTIME。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。

进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:

进程在就绪队列中呆一个时间片,优先数增加1。

进程每运行一个时间片,优先数减3。

(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

(5)分析程序运行的结果,谈一下自己的认识。

四、实验结果及分析

(1)实验关键代码

①模拟PCB数据结构定义:

///枚举进程的状态:

新建、就绪、执行、阻塞、终止

enumSTATE_PROCESS{New,Ready,Run,Block,Finish};

typedefenumSTATE_PROCESSSTATE;

///建立PCB结构体

structPCB_NODE{

intid;

///进程标识数

intpriority;

///进程优先数

intarriveTime;

///进程到达时间

intcpuTime;

///进程已占用CPU时间

intallTime;

///进程还需占用CPU时间

intblockTime;

///进程已阻塞时间

STATEstate;

///进程状态

structPCB_NODE*prev;

///PCB前指针

structPCB_NODE*next;

///PCB后指针

};

typedefstructPCB_NODEPCB;

②模拟进程队列操作函数定义:

///进程入列

voidqueuePush(PCB*process,PCB*queueHead)

///进程出列

voidqueuePop(PCB*process,PCB*queueHead)

///查看队列中进程信息

voidqueueWalk(PCB*queueHead)

③模拟就绪队列操作函数定义:

///进程插入到就绪队列

voidreadyQueuePush(PCB*process)

///优先数最大的进程出列

PCB*readyQueuePop()

///每个时间片更新就绪队列中的进程信息

voidreadyQueueUpdate(inttimeSlice,PCB*pcb)

///返回就绪队列最大优先数的值

intreadyMaxPriority()

///查看就绪队列中的进程信息

voidreadyQueueWalk()

④模拟阻塞队列操作函数定义:

///进程插入到阻塞队列

voidblockQueuePush(PCB*process)

PCB*blockQueuePop()

///每个时间片更新阻塞队列中进程的信息

voidblockQueueUpdate()

///查看阻塞队列中的进程信息

voidblockQueueWalk()

⑤模拟动态优先权进程调度函数定义:

///初始化进程PCB数据,返回PCB头指针

PCB*initData()

///模拟CPU执行1个时间片的操作

voidcpuWord(PCB*cpuProcess)

⑥主函数关键代码:

inttimeSlice=0;

///模拟CPU时间片

intcpuBusy=0;

///模拟CPU状态

PCB*cpuProcess=NULL;

///当前CPU执行的进程

PCB*pHead,*pro;

///进程PCB头指针

pHead=initData();

///初始化进程PCB,返回进程头指针

pro=pHead+1;

///pro指向PCB中第一个进程

readyQueueUpdate(timeSlice,pro);

///根据进程到达时间将新建进程加入绪队列

///模拟动态优先权进程调度

while(true){

if(readyQueueNum==0&

&

blockQueueNum==0&

cpuBusy==0){

printf("

就绪队列、阻塞队列和CPU当前无进程运行,退出\n"

);

break;

}///endif

if(cpuBusy==0){///CPU空闲,选择一个进程进入CPU

if(readyQueueNum>

0){

///选择就绪队列优先级最高的进程作为CPU运行进程

cpuProcess=readyQueuePop();

}else{

///就绪队列中没有进程,改为选择阻塞队列优先级最高的进程

cpuProcess=blockQueuePop();

}

cpuProcess->

cpuTime=0;

///设置当前运行进程占用CPU时间

state=Run;

///设置当前运行进程的状态

cpuBusy=1;

///设置CPU当前状态为忙

}///endif

timeSlice++;

///当前时间片加1

printf("

\n第%d个时间片后:

\n"

timeSlice);

cpuWord(cpuProcess);

///模拟CPU执行1个时间片的操作

if(cpuProcess->

allTime==0){///若当前执行进程还需CPU时间片为0

state=Finish;

///设置当前进程状态为终止

free(cpuProcess);

///释放该进程的PCB内存空间

cpuBusy=0;

///CPU状态设置为空闲

///更新就绪队列和阻塞队列中的进程信息

blockQueueUpdate();

readyQueueUpdate(timeSlice,pro);

///查看就绪队列和阻塞队列的进程信息

readyQueueWalk();

blockQueueWalk();

if(cpuBusy==1&

readyQueueNum>

0&

cpuProcess->

priority<

readyMaxPriority()){

blockQueuePush(cpuProcess);

///需抢占CPU,当前执行的进程调入阻塞队列

cpuProcess=readyQueuePop();

///从就绪队列中选择优先级最高的进程运行

}

printf("

\n模拟进程动态优先权调度算法结束.\n"

return0;

(2)动态优先权调度算法流程图

(2)实验结果

①第1个时间片后:

②第2个时间片后:

③第3个时间片后:

④第4个时间片后:

⑤第5个时间片后:

⑥第6个时间片后:

⑦第7个时间片后:

⑧第8个时间片后:

⑨第9个时间片后:

⑩第10个时间片后:

⑪第11个时间片后:

⑫第12个时间片后:

⑬第13个时间片后:

⑭第14个时间片后:

⑮第15个时间片后:

⑯第16个时间片后:

⑰第17个时间片后:

⑱第18个时间片后:

⑲第19个时间片后:

⑳第20个时间片后:

(3)实验结果分析

①调度算法开始之前进程PCB信息为:

②调度算法结束之后进程PCB信息为:

③调度算法分析:

进程ID

到达时间

结束

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

当前位置:首页 > 初中教育 > 中考

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

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