动态优先权算法

合集下载

操作系统原理第四章 处理机调度习题

操作系统原理第四章  处理机调度习题

第四章处理机调度4.3 习题4.3.1 选择最合适的答案1.某系统采用了银行家算法,则下列叙述正确的是()。

A.系统处于不安全状态时一定会发生死锁B.系统处于不安全状态时可能会发生死锁C.系统处于安全状态时可能会发生死锁D.系统处于安全状态时一定会发生死锁2.银行家算法中的数据结构包括有可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need,下列选项正确的是()。

A.Max[i,j]=Allocation[i,j]+Need[i,j]B.Need[i,j]= Allocation[i,j]+ Max[i,j]C.Max[i,j]= Available[i,j]+Need[i,j]D.Need[i,j]= Available[i,j]+ Max[i,j]3.下列进程调度算法中,()可能会出现进程长期得不到调度的情况。

A.非抢占式静态优先权法B.抢占式静态优先权法C.时间片轮转调度算法D.非抢占式动态优先权法4.在下列选项中,属于预防死锁的方法是()。

A.剥夺资源法B.资源分配图简化法C.资源随意分配D.银行家算法5.在下列选项中,属于检测死锁的方法是()。

A.银行家算法B.消进程法C.资源静态分配法D.资源分配图简化法6.在下列选项中,属于解除死锁的方法是()。

A.剥夺资源法 B.资源分配图简化法C.银行家算法 D.资源静态分配法7.为了照顾紧迫型作业,应采用()。

A.先来服务调度算法B.短作业优先调度算法C.时间片轮转调度算法D.优先权调度算法8.在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则此时的优先权调度算法实际上和()相同。

A.先来先服务调度算法B.短作业优先调度算法C.时间片轮转调度算法D.长作业优先调度算法9.作业从后备作业到被调度程序选中的时间称为()。

A.周转时间B.响应时间C.等待调度时间D.运行时间10.资源静态分配法可以预防死锁的发生,它们使死锁四个条件中的()不成立。

逄 第四章处理机调度习题课

逄 第四章处理机调度习题课

进入时间 离开时间 周转时间 执行时间 带权 周转时间
1 2 3 4 5
0 0 0 0 0
10 11 13 14 19
10 11 13 14 19
13.4
10 1 2 1 5
1 11 6.5 14 3.8
7.26
0 J1 J2 J3 J4 J5
2
4
6
8
10 12 14 16 18 20 T
RR
0 J1 J2 J3 J4 J5
解: 先调度作业1 1)先调度作业1。 周转时间为T1=Tw1+Tr1=0+2.0=2.0 周转时间为T1=Tw1+Tr1=0+2.0=2.0 带权周转时间为W1=2.0/2.0=1 带权周转时间为W1=2.0/2.0=1 在作业1运行的完成时刻10:00分别计算作业2 10:00分别计算作业 2)在作业1运行的完成时刻10:00分别计算作业2、3、4的响 应比R 应比R 作业2等待时间10:00 8:50=1时10分=1.17小时 10:00小时, ①作业2等待时间10:00-8:50=1时10分=1.17小时, R=1+1.17/0.5=3.34 作业3等待时间10:00 9:00=1时=1.0小时 10:00小时, ②作业3等待时间10:00-9:00=1时=1.0小时, R=1+1.0/0.1=11.0 ③作业4等待时间10:00-9:50=10分=0.17小时, 作业4等待时间10:00-9:50=10分=0.17小时, 10:00 小时 R=1+0.17/0.2=1.85 故应调度作业3,周转时间T3=1.0+0.1=1.1小时, 3,周转时间T3=1.0+0.1=1.1小时 故应调度作业3,周转时间T3=1.0+0.1=1.1小时,带权周转时间 W3=1.1/0.1=11.0

课程设计的目的和意义

课程设计的目的和意义

一.课程设计的目的和意义目的:1. 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容。

2. 通过调试典型例题或习题积累调试程序的经验。

3. 通过完成辅导教材中的编程题,逐渐培养学生的编程能力,用计算机解决实际问题的能力。

意义:1. 有助于加深我们对操作系统这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度。

通过课程设计,我们可以真正理解其内涵。

2. 有利于我们逻辑思维的锻炼,程序设计能直接有效地训练学生的创新思维、培养分析问题、解决问题能力。

即使是一个简单的程序,依然需要学生有条不理的构思。

3. 有利于培养严谨认真的学习态度,在程序设计过程里,当我们输入程序代码的时候,如果不够认真或细心,那么可能就导致语法错误,从而无法得出运行结果。

那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。

二进程调度算法模拟1 . 设计目的通过动态优先权算法的模拟加深进程概念和进程调度过程的理解。

2 . 设计要求写出带有完整标注的程序代码(可以用Java或C/C++实现,要求每个语句都要有标注)。

3 . 使用动态优先权的进程调度算法的模拟3.1算法思路分析动态优先权是指在创建进程时所赋予的优先权,可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能.若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,此即FCFS算法.因此,通过c程序模拟动态优先权程序调度算法,主要思路和方法就是,通过结构体模拟计算机的控制模块,构造一个PCB结构体即进程控制块结构体,用来记录当前进程的的相关状态信息,包括进程标识符、处理机状态、进程调度信息、进程控制信息。

并通过C语言模拟计算机的动态优先调度算法,对构建的PCB进程进行模拟调度和运行,从而实现用计算机对进程的调度过程进行过程模拟。

操作系统常用调度算法

操作系统常用调度算法

操作系统常⽤调度算法在操作系统中存在多种调度算法,其中有的调度算法适⽤于作业调度,有的调度算法适⽤于进程调度,有的调度算法两者都适⽤。

下⾯介绍⼏种常⽤的调度算法。

先来先服务(FCFS)调度算法FCFS调度算法是⼀种最简单的调度算法,该调度算法既可以⽤于作业调度也可以⽤于进程调度。

在作业调度中,算法每次从后备作业队列中选择最先进⼊该队列的⼀个或⼏个作业,将它们调⼊内存,分配必要的资源,创建进程并放⼊就绪队列。

在进程调度中,FCFS调度算法每次从就绪队列中选择最先进⼊该队列的进程,将处理机分配给它,使之投⼊运⾏,直到完成或因某种原因⽽阻塞时才释放处理机。

下⾯通过⼀个实例来说明FCFS调度算法的性能。

假设系统中有4个作业,它们的提交时间分别是8、8.4、8.8、9,运⾏时间依次是2、1、0.5、0.2,系统⾤⽤FCFS调度算法,这组作业的平均等待时间、平均周转时间和平均带权周转时间见表2-3。

表2-3 FCFS调度算法的性能作业号提交时间运⾏时间开始时间等待时间完成时间周转时间带权周转时间18280102128.4110 1.611 2.6 2.638.80.511 2.211.5 2.7 5.4490.211.5 2.511.7 2.713.5平均等待时间 t = (0+1.6+2.2+2.5)/4=1.575平均周转时间 T = (2+2.6+2.7+2.7)/4=2.5平均带权周转时间 W = (1+2.6+5.牡13.5)/4=5.625FCFS调度算法属于不可剥夺算法。

从表⾯上看,它对所有作业都是公平的,但若⼀个长作业先到达系统,就会使后⾯许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。

但它常被结合在其他调度策略中使⽤。

例如,在使⽤优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。

FCFS调度算法的特点是算法简单,但效率低;对长作业⽐较有利,但对短作业不利(相对SJF和⾼响应⽐);有利于CPU繁忙型作业,⽽不利于I/O繁忙型作业。

调度算法OS

调度算法OS

调度算法OS调度算法(OS)2011-04-05 20:59处理机调度的分级高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。

1.进程调度算法(处理器管理)A).先来先服务和短作业(进程)优先调度算法B).高优先权优先调度算法C).基于时间片的轮转调度算法2.作业调度算法2)短作业优先法SJF、3)最高响应比优先法HRN、4定时轮转法和优先数法3.移臂(磁盘)调度算法(设备管理根本目的在于有效利用磁盘,保证磁盘的快速访问)1)先来先服务算法;(根据访问者提出访问请求的先后次序来决定执行次序。

)2)最短寻找时间优先调度算法;(从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。

)3)电梯4)单向扫描4.页式调度算法(存储器管理)1先进先出调度算法2最近最少调度算法3最近最不常用调度算法/////////////////////////////调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

进程调度算法(处理器管理)一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。

由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

2.短作业(进程)优先调度算法短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。

操作系统专升本考试练习题及答案222

操作系统专升本考试练习题及答案222

操作系统专升本考试练习题及答案2提示:答案和解析请见试卷尾1.[单选题]按( )分类可将设备分为块设备和字符设备。

A)从属关系B)操作特性C)共享属性D)信息交换单位2.[单选题]操作系统有其作为软件的外在特性和内在特性。

外在性指是一种软件,具有软件的使用方式。

内在性指操作系统具有一般软件的结构特征,由于它不是一般应用软件,其结构有其独特的形式。

这是研究操作系统基于()的观点。

A)软件B)资源管理C)进程D)虚拟3.[单选题]在进程转换时,下列______转换是不可能发生的。

A)就绪态→执行态B)执行态→就绪态C)执行态→阻塞态D)阻塞态→执行态4.[单选题]用户归还文件的使用权可以调用的文件操作是( )。

A)建立B)打开C)关闭D)删除5.[单选题]当操作员接通计算机电源时,计算机系统立即自动执行( )A)中断服务程序B)用户程序C)引导程序D)接口程序6.[单选题]分配到必要的资源并获得处理机时的进程状态是( )。

A)就绪状态B)执行状态C)阻塞状态7.[单选题]操作系统的设备管理应具有的功能不包括A)缓冲管理B)设备关联性C)设备分配D)设备处理8.[单选题]下列关于进程和程序的比较,说法正确的是A)进程总是对应至少一个特定的程序,执行程序的代码B)进程是永久的,程序是暂时存在的C)程序和进程的存在实体相同D)进程是静态的,程序是动态的9.[单选题]最坏适应算法是按()的顺序形成空闲链A)空闲区起始地址递增B)空闲区起始地址递减C)空闲区大小递增D)空闲区大小递减10.[单选题]为了进行进程协调,进程之间应当具有一定的联系,这种联系通常采用进程间交换数据的方式进行,这种方式通常称为()。

A)进程互斥B)进程同步C)进程通信D)进程制约11.[单选题]中央处理器与外围设备的工作方式是 ( )A)串行B)并行C)并发D)异步12.[单选题]临界区是指( )。

A)并发进程中用于实现进程互斥的程序段B)并发程序中用于实现进程同步的程序段C)并发程序中用于实现进程通信的程序段D)并发程序中与共享变量有关的程序段13.[单选题]处理器有32位地址,则它的虚拟地址空间为( )字节。

嵌入式操作系统_第3章 处理机调度


短作业优先调度算法的特点
算法调度性能较好,
例如上例中,
先来先服务
短作业优先
平均周转时间
2.8
2.45
平均带权周转时间
5.25
3.85
但对长作业不利,未考虑作业的紧迫程度, 运行时间为估计。
调度算法
先来先服务调度算法 短作业(进程)优先调度算法 时间片轮转调度算法 优先权调度算法 最高响应比优先调度算法 多级队列调度算法
抢占方式
抢占方式:又称剥夺方式、可剥夺方式。这 种调度方式是指允许调度程序根据某种原则 去停止正在执行的进程,将已分配给该进程 的处理机重新分配给其他进程。
高级调度主要用于多道批处理系统中,在分 时和实时系统中不设高级调度。
2.中级调度
中级调度又称内存调度,其功能是将内存中 暂时不用的信息移到外存,以腾出空间给内 存中的进程使用,或将需要的信息从外存读 入内存。
引入中程调度的目的是提高内存利用率和系 统吞吐量。
中级调度的运行频率介于两者之间。
事 件 出 现
时间片完 就绪 队列 阻塞队列
进程调度
进程完成 CP U
等待事件
3.2.2 选择调度算法的准则
由于操作系统的类型及目标不同,因此选择 的调度算法也不同。
选择调度算法有以下准则:
面向系统的准则 面向用户的准则
面向用户的准则
周转时间短:指从作业提交到作业完成的时 间间隔。
微机不太重要。
周转时间
作业的周转时间是指从作业提交到作业完 成之间的时间间隔。
平均周转时间是指多个作业的周转时间的 平均值。n个作业的平均周转时间:
T =(T1+T2+ … +Tn)/n(Ti为作业i 的周转时间)

调度


周转时间: 周转时间:从作业提交给系统开始 到作业完成为止的这段时间。 ,到作业完成为止的这段时间。 平均周转时间: 平均周转时间: T = 1 ∑ T
i
n i =1
i
面向系统的准则
系统吞吐量高; 系统吞吐量高; 1 n Ti 平均带权周转时间: 平均带权周转时间:W = ∑ 处理机利用率好; 处理机利用率好; n i =1 TSi 各类资源的平衡利用。 各类资源的平衡利用。
Unix中的进程调度(System V) Unix中的进程调度( V) 中的进程调度
进程优先数的计算
优先数 = 最近使用 CPU 的时间 2 + 基本用户优先数
其中,基本用户优先数即 结构中的偏移值nice,可由用 其中,基本用户优先数即proc结构中的偏移值 结构中的偏移值 , 户将它设置成0~40中的任一个数。一旦设定后, 用户仅能使其 中的任一个数。一旦设定后, 户将它设置成 中的任一个数 值增加, 特权用户才有权减小nice的值。 而最近使用 的值。 值增加, 特权用户才有权减小 的值 而最近使用CPU的时 的时 则是指当前占有处理机的进程本次使用CPU的时间 。 内核 的时间。 间 , 则是指当前占有处理机的进程本次使用 的时间 每隔16.667 ms,便对该时间做加 操作,这样,占有 操作, 每隔 ,便对该时间做加1操作 这样,占有CPU的进程 的进程 其优先数将会随着它占有CPU时间的增加而加大 , 相应地 , 其 时间的增加而加大, 相应地, 其优先数将会随着它占有 时间的增加而加大 优先级便随之降低。 优先级便随之降低。
调度队列模型
1、仅有进程调度的调度队列模型
时间片完 进程调度 CPU 进程完成
交互用户 事 件 出 现

第四版-计算机操作系统--期末考试复习题

一、选择题1。

与计算机硬件关系最密切的软件是()。

A.编译程序B.数据库管理系统C。

游戏程序 D。

OS2. 现代OS具有并发性和共享性,是()的引入导致的。

A.单道程序B. 磁盘 C。

对象 D.多道程序3. 操作系统的主要功能有( ).A.进程管理、存储器管理、设备管理、处理机管理B.虚拟存储管理、处理机管理、进程调度、文件系统C.处理机管理、存储器管理、设备管理、文件系统D.进程管理、中断管理、设备管理、文件系统4。

要求在规定的时间内对外界的请求必须给予及时响应的OS是()。

A.多用户分时系统 B。

实时系统C.批处理系统时间 D。

网络操作系统5。

操作系统是对( )进行管理的软件。

A。

硬件 B.软件C。

计算机资源 D.应用程序6。

()对多用户分时系统最重要。

A。

实时性 B.交互性C。

共享性 D.运行效率7.( )对多道批处理系统最重要。

A。

实时性 B.交互性C。

共享性 D.运行效率8。

( )对实时系统最重要.A.及时性B.交互性C.共享性 D。

运行效率9。

( )操作系统允许在一台主机上同时连接多台终端,多个用户可以通过各自的终端同时交互地使用计算机。

A.网络B.分布式C.分时D.实时10. 如果分时操作系统的时间片一定,那么(),则响应时间越长.A.用户数越少B.用户数越多C。

内存越小 D。

内存越大11。

下面6个系统中,必须是实时操作系统的有()个。

·航空订票系统·过程控制系统·机器口语翻译系统·计算机辅助系统·办公自动化系统·计算机激光照排系统A.1B.2C.3 D。

412。

下面对OS不正确的描述是()。

A。

OS是系统资源管理程序 B。

OS是为用户提供服务的程序C。

OS是其它软件的支撑软件 D.OS是系统态程序的集合13 当前运行的进程(),将引发系统进行进程调度.A。

执行了一条转移指令B。

要求增加主存空间,经系统调用银行家算法进行测算认为是安全的C.执行了一条I/O指令D.执行程序期间发生了I/O完成中断14 分时系统中的当前运行进程连续获得了两个时间片,原因可能是().A.该进程的优先级最高B.就绪队列为空C.该进程最早进入就绪队列D.该进程是一个短进程15 进程调度又称为低级调度,其主要功能是( ).A.选择一个作业调入内存B。

计算机操作系统(第四版)课后习题答案第三章

第三章处理机调度与死锁1,高级调度与低级调度的主要任务是什么?为什么要引入中级调度?【解】(1)高级调度主要任务是用于决定把外存上处于后备队列中的那些作业调入内存,并为它们创建进程,分配必要的资源,然后再将新创建的进程排在就绪队列上,准备执行。

(2)低级调度主要任务是决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。

(3)引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。

为此,应使那些暂时不能运行的进程不再占用宝贵的内存空间,而将它们调至外存上去等待,称此时的进程状态为就绪驻外存状态或挂起状态。

当这些进程重又具备运行条件,且内存又稍有空闲时,由中级调度决定,将外存上的那些重又具备运行条件的就绪进程重新调入内存,并修改其状态为就绪状态,挂在就绪队列上,等待进程调度。

3、何谓作业、作业步和作业流?【解】作业包含通常的程序和数据,还配有作业说明书。

系统根据该说明书对程序的运行进行控制。

批处理系统中是以作业为基本单位从外存调入内存。

作业步是指每个作业运行期间都必须经过若干个相对独立相互关联的顺序加工的步骤。

作业流是指若干个作业进入系统后依次存放在外存上形成的输入作业流;在操作系统的控制下,逐个作业进程处理,于是形成了处理作业流。

4、在什么情冴下需要使用作业控制块JCB?其中包含了哪些内容?【解】每当作业进入系统时,系统便为每个作业建立一个作业控制块JCB,根据作业类型将它插入到相应的后备队列中。

JCB 包含的内容通常有:1) 作业标识2)用户名称3)用户账户4)作业类型(CPU 繁忙型、I/O芳名型、批量型、终端型)5)作业状态6)调度信息(优先级、作业已运行)7)资源要求8)进入系统时间9) 开始处理时间10) 作业完成时间11) 作业退出时间12) 资源使用情况等5.在作业调度中应如何确定接纳多少个作业和接纳哪些作业?【解】作业调度每次接纳进入内存的作业数,取决于多道程序度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1使用动态优先权的进程调度算法的模拟 1实验目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。 2实验内容 (1)实现对N个进程采用动态优先权优先算法的进程调度。 (2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段: 进程标识数 ID。 进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高。 进程已占用的CPU时间CPUTIME。 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: 进程在就绪队列中停留一个时间片,优先数加1。 进程每运行一个时间片,优先数减3。 (4)假设在调度前,系统中有5个进程,它们的初始状态如下: ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 CPUTIME 0 0 0 0 0 ALLTIME 3 3 6 3 4 STARTBLOCK 2 -1 -1 -1 -1 BLOCKTIME 3 0 0 0 0 STATE ready ready ready ready ready (5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下: RUNNING PROG:i READY-QUEUE:->id1->id2 BLOCK-QUEUE:->id3->id4 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = ID 0 1 2 3 4 PRIORITY P0 P1 P2 P3 P4 CUPTIME C0 C1 C2 C3 C4 ALLTIME A0 A1 A2 A3 A4 STARTBLOCK T0 T1 T2 T3 T4 BLOCKTIME B0 B1 B2 B3 B4 STATE S0 S1 S2 S3 S4 代码部分 #include #include #include #include using namespace std; //初始化程序所用数剧 #define N 5 int id[N]={0,1,2,3,4}; int priority[N]={9,38,30,29,0}; int cputime[N]={0}; int alltime[N]={3,3,6,3,4}; int startblock[N]={2,-1,-1,-1,-1}; int blocktime[N]={3,0,0,0,0}; enum State {Ready,Run,Block,Finish}; //模拟时间片结构体 struct PCB { int id; int priority; int cputime; int alltime; int startblock; int blocktime; enum State state; PCB *next; }; PCB readyHead; //就绪队列的队头,不存放数据 PCB blockHead; //阻塞队列的队头,不存放数据 PCB *ppro[N]={NULL}; //指向所以结构体对象的指针,用于显示processPrintf()函数

int cpu(); //各个函数声明 int cpuRun(PCB *cpuNow); void readyQueIn(PCB *pro); int readyQueNum(); PCB* readyQueOut(); void blockQueIn(PCB *pro); int blockQueNum(); PCB* blockQueOut(); void updateQue(); void quePrintf(); void processPrintf();

void initial() //初始化函数,将初始化数组值赋给队列 { PCB *pro=NULL; for(int i=0;i{ pro=(PCB *)malloc(sizeof(PCB));

pro->id=id[i]; pro->priority=priority[i]; pro->cputime=cputime[i]; pro->alltime=alltime[i]; pro->startblock=startblock[i]; pro->blocktime=blocktime[i]; pro->state=Ready; pro->next=NULL; readyQueIn(pro); ppro[i]=pro; } }

int main() { readyHead.next=NULL; blockHead.next=NULL; initial(); cpu(); }

int cpu() //cpu模拟进程调度 { int cpuBusy=0; int timeSice=0; PCB *cpuNow=NULL;

while(1) { timeSice++; if(cpuBusy==0) //上个cpu进程阻塞或执行完毕,则cpuBusy=0 { if(readyQueNum()>0) { cpuNow=readyQueOut(); } else if(blockQueNum()>0) { cpuNow=blockQueOut(); } else { printf("\n进程运行结束!"); processPrintf(); break; } } if(cpuBusy==1) //cpu中有进程,则需要抢占cpu { if(readyHead.next!=NULL) { if(readyHead.next->priority>cpuNow->priority) { if(cpuNow->blocktime>0) { blockQueIn(cpuNow); } else { readyQueIn(cpuNow); } cpuNow=readyQueOut(); } } } cpuNow->state=Run; printf("第%d个时间片",timeSice); printf("\n当前CPU正在运行:id%d",cpuNow->id); quePrintf(); processPrintf(); printf("\n\n");

cpuBusy=cpuRun(cpuNow); updateQue(); } return 0; }

int cpuRun(PCB *cpuNow) //模拟cpu执行进程时的处理动作 { cpuNow->priority-=3; cpuNow->alltime--; if(cpuNow->startblock>0) //startblock>0时,执行一个时间片减1,为0时阻塞 { cpuNow->startblock--; if(cpuNow->startblock==0) { cpuNow->state=Block; cpuNow->blocktime++; blockQueIn(cpuNow); return 0; } } if(cpuNow->alltime==0) //进程还需要的时间,为0时代表进程执行完毕 { cpuNow->cputime=0; cpuNow->state=Finish; return 0; } cpuNow->cputime++; //进程已经占用的cpu时间 for(int i=0;i{ if(cpuNow!=ppro[i]) { ppro[i]->cputime=0; } } cpuNow->state=Ready; return 1; }

void readyQueIn(PCB *pro) //进程入就绪队列,并按priority排序 { PCB *pQue=readyHead.next; if(pQue==NULL) //队列为空时插入 { readyHead.next=pro; } else if(pQue->next==NULL) //队列有1元素个时插入 { if(pro->priority>=pQue->priority) { readyHead.next=pro; pro->next=pQue; } else { pQue->next=pro; } } else //队列有多个元素时插入排序 { while(1) { if(pro->priority>=pQue->priority) {

相关文档
最新文档