C语言模拟进程调度算法

        本程序中主要通过7个子函数来实现多个进程并发执行的模拟,分别是加入准备队列函数sort、输入进程函数input、计算准备队列长度函数space、显示进程函数disp、输出正在运行进程和等待中进程的函数check、进程结束函数destroy和进程运行函数running;可以模拟在单处理器的环境下多个进程实现并发执行的每一个流程部分。

(1)进程运行函数sort:

       首先创建一个insert变量判断是否有插入,如果准备队列为空或者准备队列队首等优先级小于新加入进程p的优先级,则将新加入等进程插入到准备队列队首;而如果准备队列不为空或者准备队列队首等优先级不小于新加入进程p的优先级,那么就需要通过循环来找出对应进程的插入点,将first指针指向准备队列队首,将second指针指向first指针等下一个地址,当second指针等指向不为空(没有循环到最后)时进行循环,每次循环的过程中判断新加入进程p的优先级是否大于循环到的进程的优先级,若新加入进程p的优先级大于循环到的进程的优先级,则将新加入进程p插入到准备队列当中,同时将insert变量置成1,表示已经有插入;而如果新加入进程p的优先级不大于循环到的进程等优先级,则让指针一直后移。如果到最后insert变量一直为0,也就是一直都没有插入(新加入进程p的优先级最小),则将新加入进程p插入到准备队列的尾部,作为优先级最小的进程。

                                                                                图1  sort函数运行流程图

 

(2)输入进程函数input:

首先为新建的进程p分配空间,之后输入进程名、到达时间、服务时间和优先级,并将运行时间片置为0,将进程状态置为‘w’,意思是等待,最后调用上述自定义的sort()函数将进程p加入到准备队列中。

(3)输出正在运行进程和等待中进程的函数check:

主要的作用是输出正在运行的进程和等待中的进程,并为等待用的进程优先级增加2。首先需要定义进程指针pr,并为进程指针pr分配空间,之后调用显示进程函数disp,显示正在运行的进程p。将进程指针pr指向准备队列的队首,并进行循环,如果没有循环到准备队列队尾,调用显示进程函数disp显示正在等待的进程pr,将进程指针pr循环到的正在等待的进程优先级加2,并让pr指针后移,继续循环。

                                                                          图2  check函数运行流程图

 

(4)显示进程函数disp:

       主要用于显示进程的状况,功能很单一,就只是输出进程名、状态、优先级和运行时间片。

(5)计算准备队列长度函数space:

       这个函数的功能比较简单,首先需要定义长度变量l初值为0,并且定义进程指针pr将pr指向准备队列队首,并进行while循环,若没有循环到队尾,则长度自增1,并且让pr指针后移,继续进行循环,最终返回一个准备队列的长度。

(6)进程结束函数destroy:

    首先需要提示进程运行结束,并且释放正在运行的进程指针p所指向的空间。

(7)进程运行函数running:

       这个函数的目的就是对正在运行的进行修改一些属性,使之能够模拟多个进程并发执行的效果。首先需要将正在运行的进程p的运行时间加1,之后进行判断,如果运行的时间片等于所需服务的时间(进程运行结束),则调用进程结束函数释放空间;而如果如果进程未运行结束,则将正在运行的进程优先级减2,将正在运行的进程状态修改为w(等待),最后调用准备队列函数,重新将正在运行的进程插入准备队列中。

                                                                         图3  running函数运行流程图

(8)主函数:

    主函数是整个程序的核心,首先需要输入5个进程,并将其加入到准备队列中,之后通过调用space()函数计算准备队列长度。当准备队列长度不为0且准备队列不为空时,进行循环;在循环中首先需要接收一个字符(接收回车),以示一个时间片。之后将准备运行的进程指针指向准备队列队首,并将准备队列队首位置后移;将即将运行的进程p隔离开,同时修改进程p的状态为r(运行状态),调用check()函数输出正在运行的进程和等待中的进程,并为等待用的进程增加优先级。最后调用进程运行函数运行进程指针p所指向的进程,输出下一步的提示。循环结束之后,代表5个进程都运行结束,输出提示。

                                                                                        图4  主函数运行流程图

 

运行结果:

                                                                                图5  5个进程输入的结果图

       输入5个进程,输入的顺序分别是进程名、到达时间、服务时间和优先级。

 

                                                                           图6  运行第一个时间片的结果图

       可以发现率先运行的是优先级最高的进程PCB2。

                                                                            图7  运行第二个时间片的结果图

       第二个时间片中可以看出原先执行的进程PCB2优先级减2,运行时间加1;同时原先等待的剩余进程优先级加2.在本时间片中执行的是优先级最高的进程PCB1。

 

                                                                          图8  运行最后一个时间片的结果图

        在最后一个时间片中准备队列为空,当执行完进程后,输出process was done 的提示,表示所有进程都已经执行完毕。

 

结果分析:

       程序在执行过程中,需要输入5条进程的信息,分别依次输入进程名、到达时间、服务时间和优先级,由于实现的结果是模拟动态优先权调度算法,而所谓动态优先权调度算法则需要通过创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

       因此在本程序中,在就绪队列中的进程,随其等待时间的增长,其优先权以2为速率提高。若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,这之中也体现了FCFS算法。若所有的就绪进程具有各不相同的优先权初值,那么,对于优先权初值低的进程,在等待了足够的时间后,其优先权便可能升为最高,从而可以获得处理机。另外当采用抢占式优先权调度算法时,再规定当前进程的优先权也以2为速率下降,则可防止一个长作业长期地垄断处理机。

       进程在就绪队列中等待一个时间片之后,优先数增加2,而进程每运行一个时间片,优先数减2,另外在运行过程中,当前进程的运行时间每次加1,当运行的时间片等于所需服务的时间时,进程运行结束。

 

以下为程序运行的初始状态:

进程名

PCB1

PCB2

PCB3

PCB4

PCB5

到达时间

0

2

3

6

9

服务时间

5

3

5

2

2

优先级

2

3

1

2

5

运行时间

0

0

0

0

0

以下为程序运行一个时间片后的状态:

进程名

PCB1

PCB2

PCB3

PCB4

PCB5

到达时间

0

2

3

6

9

服务时间

5

3

5

2

2

优先级

4

5

3

4

3

运行时间

0

0

0

0

1

 

       可以发现在运行一个时间片之后,所有在就绪队列中等待一个时间片的进程,优先数都增加了2,而正在运行的进程每运行一个时间片,优先数减2,另外在运行过程中,当前进程的运行时间每次会加1,如图中PCB5的优先级降低了2,而运行时间从0增加到了1,除了PCB5之外的所有进程优先级都分别增加了2。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
处理器系统进程调度 1.实验目的 加深对进程概念的理解,明确进程程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建; 进程调度。 3.实验内容 编写程序完成处理机系统进程调度要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。 4.提示与讲解 这个实验主要要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统,无论进程控制块信息量多少,信息都可以大致分为以下四类: ① 标识信息 每个进程都要有一个惟一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序,采用编号方式,也就是为每个进程依次分配一个不相同的正整数。 ② 说明信息 用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放位置、进程数据存放位置等等。实验,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。 ③ 现场信息 现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块,当进行进程调度时,从选进程进程控制块读取现场信息进行现场恢复。现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字寄存器等。在实验,可选取几个寄存器作为代表。用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。 ④ 管理信息 管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。实验,仅包括队列指针。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值