操作系统——使用动态优先权的进程调度算法的模拟

本文介绍了如何通过动态优先权算法模拟进程调度。实验目标是加深对进程概念和调度过程的理解,涉及动态优先权算法、进程状态管理和程序设计。文章详细阐述了设计思路,包括进程控制块的定义、优先级变化规则、初始化和调度策略,并提供了程序实现的函数分析和主要代码结构。
摘要由CSDN通过智能技术生成

实验目的:通过动态优先权算法的模拟加深进程概念和进程调度过程的理解,并学习撰写规范的科学研究报告。

设计思路:

1.对N个进程采用动态优先权算法的进程调度;

2.每个用来标识进程的进程控制块PCB用结构描述,包括以下字段:进程标识数ID,进程优先数PRIORITY,进程以占用的CPU时间CPUTIME,进程还需占用的CPU时间ALLTIME,进程状态STATE等。

3.优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1,进程每运行一个时间片优先数减3。

4.设置调度前的初始状态。

5.将每个时间片内的进程情况显示出来。

(二)涉及的内容或知识点

本实验涉及到动态优先权算法,进程调度过程等知识点。

(三)采用的方法和手段

学生查阅资料,设计方案,编写源程序,上机调试,测试,结果分析。在规定的时间内,由学生独立完成实验过程,并对结果进行科学分析,撰写出规范的实验报告。

(四)考察点

对等动态优先权算法,进程调度过程掌握情况;考查学生的写算法和编程能力等;考查学生的分析问题和解决问题的能力;实验报告的撰写能力等。

设计思路:

(1)先对就绪队列,阻塞队列,cpu的进行初始化。

(2)进行进程调度的选择。

       1)cpu,就绪队列和阻塞队列中的进程数不为0。判断cpu是否空闲。

              a.cpu空闲的话,从就绪队列中选取优先级最大的;而如果就绪队列为空,则从阻塞队列中选取第一个进程。选中的进程的cputime设置为0。

              b.cpu上有进程,则更新cpu上进程的状态,打印cpu上进程的id。如果cpu上的进程的alltime已经为0,即进程已经完成了,更新该进程的状态为finish,将cpu清空。如果进程在cpu上的时间达到starttime,将其放到阻塞队列,清空cpu。

       2)更新阻塞队列和就绪队列中的进程中的状态,打印就绪队列和阻塞队列的进程的id。

       3)打印每个进程的状态。

(3)重复上面的步骤,直到没有cpu,就绪队列,阻塞队列中都没有进程了。

 

在实现的程序实现过程中就绪队列和阻塞队列都设置为双向指针,方便查找,取出,插入进程。

就绪队列在插入时,是根据优先级的大小插入到队列中,并且由于每一个时间片后,进程在就绪队列中等待,优先级数值增加相同,所以保证了就绪队列的优先级由头指针开始呈递减状态。因此每次从就绪队列取出优先级最大的进程放到cpu上,都能直接取就绪队列的第一个进程。

阻塞队列在插入时,是根据blocktime的时间的大小来插入到队列中,blocktime的大小是不能发生改变的,所以设置了另外一个变量waittime,记录了进程在阻塞队列中等待的时间。每等待一个时间片,waittime+1,当等待时间到(即waittime > blocktime)的时候,则将该进程插入到就绪队列中。

每个时间片运行后,在更新进程状态时,都将其现在的状态记录到rec中。

 

下面先对本程序中涉及的函数进行简单解释(除了main()函数在程序的最后,其他函数按照出现的先后顺序介绍)。

主函数——main():初始化cpu,就绪队列和阻塞队列。主要工作进行进程的调度,每一个时间片后,调用函数进行cpu,就绪队列,阻塞队列中进程的状态更新,该时间片后,对每个进程状态进行打印。

 

就绪队列的函数分析——ready_push(),ready_pop(),ready_updata(),ready_work()四个函数。

分析:

ready_push()函数,作用:将新的进程按照优先级大小插入就绪队列,保证队列按优先级大小呈递减状态。

ready_pop()函数,作用:将就绪队列中优先级最大的进程弹出队列,由于就绪队列中是按优先级大小排列的,所以也是弹出第一个就绪进程。

ready_updata()函数,作用:每个时间片后,更新就绪队列中进程的优先级。每过一个时间片段后,就绪队列中每个进程的优先级+1。

ready_work()函数,作用:按照优先级打印就绪队列中的进程id,如果就绪队列中没有进程那就打印为NULL。并且记录经过一个时间片后就绪队列中每个进程的状态RECORD[pro->id]。

 

阻塞队列的函数分析——block_push(),block_pop(),block_updata(),block_work()四个函数。

block_push()函数,作用:将新的进程按照blocktime的大小插入阻塞队列中,保证队列按阻塞时间大小呈递增的状态。

block_pop()函数,作用:取出阻塞队列的第一个进程。

block_updata()函数,作用:每个时间片后,更新阻塞队列中进程的等待时间,每过一个时间片,阻塞队列中每个进程的等待时间加一。如果进程的阻塞时间等于等待时间,那么将该进程放到就绪队列中。

block_work()函数,作用:打印阻塞队列中进程的id,如果阻塞队列中没有进程那就打印NULL,并且记录经过一个时间片后,就绪队列中每个进程的状态。

 

关于cpu的函数分析——cpu_work()

cpu_work()函数,作用打印cpu上进程的id,更新cpu上进程的状态,priority-3; alltime-1;cputime+1;并且记录经过一个时间片后,cpu上进程的状态。

 

init()函数,作用:根据给的原始数据对cpu,就绪队列,阻塞队列进行初始化。

print_table()函数,作用:每个时间片后,按照规格打印出每个进程的状态。

 

由于代码是使用纯c语言实现的,而且构造了双向链表故代码长了点。

源代码:

#include <stdio.h>

#include <stdlib.h>

 

#define N 5

 

enum State{Ready,Run,Block,Finish};

 

struct PCB //数据结构

{

       intid;

       intpriority;

       intcputime;

       intalltime;

       intstartblock;//在cpu中能运行的时间

       intblocktime;//阻塞了多久后,进入就绪队列

       intwaittime;//*在阻塞队列中等待的时间

       Statestate;

       PCB*next;

       PCB*pre;

}*ready_pro,*block_pro,*ready_tail,*block_tail;//就绪,阻塞队列,记录其头指针,

int ready_num,block_num;//就绪,运行,阻塞队列中进程的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值