单处理机系统的进程调度
计算机操作系统:处理机调度模拟实验
display2(run);
}
p = ready;
if (p != NULL)
printf("\n ****当前就绪队列中进程的状态如下:\n"); /*显示就绪队列状态*/
while (p != NULL)
{
display2(p);
p = p->next;
}
p = finish;
根据单处理机,多任务的问题特性做好软件实现的需求分析。可根据问题的实际需要,可选择进程数量。
当系统运行时,能直观地、动态地反映当前处理机状态及各进程执行的状况。
实验环境
Windows 7或以上版本+ VS2010或以上版本
实验内容
程序运行一次中,要求三个进程队列,每个优先权依次为1、2、3,即优先权为1的只分配1个时间片,优先权为2的只分配2个时间片,优先权为3的只分配3个时间片;每个进程队列命名、进程命名与进程数自定,轮转打印出各个进程名,程序结束打印退出。
run->state = 'R';
display();
}
//探测到有就绪队列时,选择一个将处理机分配给它
void priority(int T)
{
while (run != NULL)
{
run->rtime = run->rtime + T;
run->syቤተ መጻሕፍቲ ባይዱime = run->sytime - T;
实验完成后请现场演示。
实验步骤描述
1.给一系列进程创建结构体
2.写一个printready函数探测就绪队列是否为空
3.写一个display1函数,用于显示当前进程
进程调度
进程、线程与处理器的调度(1)进程的概念(Dijkstra)进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位。
(2)进程与程序的联系与区别①程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
②程序可以作为一种软件资料长期存在,而进程是有一定生命期的。
程序是永久的,进程是暂时的。
注:程序可看作一个菜谱,而进程则是按照菜谱进行烹调的过程。
③进程和程序组成不同:进程是由程序、数据和进程控制块三部分组成的。
④进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
(3)进程的特征动态性:进程是程序的执行,同时进程有生命周期。
并发性:多个进程可同存于内存中,能在一段时间内同时执行。
独立性:资源分配和调度的基本单位。
制约性:并发进程间存在制约关系,造成程序执行速度不可预测性,必须对进程的并发执行次序、相对执行速度加以协调。
结构特征:进程由程序块、数据块、进程控制块三部分组成。
进程的三种基本状态:(1)运行态(running)当进程得到处理机,其执行程序正在处理机上运行时的状态称为运行状态。
在单CPU系统中,任何时刻最多只有一个进程处于运行状态。
在多CPU系统中,处于运行状态的进程数最多为处理机的数目。
(2)就绪状态(ready)当一个进程已经准备就绪,一旦得到CPU,就可立即运行,这时进程所处的状态称为就绪状态。
系统中有一个就绪进程队列,处于就绪状态进程按某种调度策略存在于该队列中。
(3)等待态(阻塞态)(Wait / Blocked )若一个进程正等待着某一事件发生(如等待输入输出操作的完成)而暂时停止执行的状态称为等待状态。
处于等待状态的进程不具备运行的条件,即使给它CPU,也无法执行。
系统中有几个等待进程队列(按等待的事件组成相应的等待队列)。
单处理机系统的进程调度
单处理机系统的进程调度
编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。
实现具体包括:首先确定进程控制块的内容和组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数,对所做工作进行测试。
这个实验主要有三个问题:如何组织进程、如何创建进程和如何实现处理机调度。
进程控制块结构定义如下:
struct pcb
{
int name; //进程标识符
int status; //进程状态
int ax,bx,cx,dx; //进程现场信息,通用寄存器内容
int pc; //进程现场信息,程序计数器内容
int psw; //进程现场信息,程序状态字寄存器内容
int next; //下一个进程控制块的位置
}
存放进程控制块的区域:
#define n 10 //假定系统允许进程个数为10
struct pcb pcbarea[n]; //模拟进程控制块区域的数组
实验中指向运行进程的进程控制块指针、就绪队列指针和空闲进程控制块队列指针定义如下:
int run; //定义指向正在运行进程的进程控制块的指针struct
{ int head;
int tail
}ready; //定义指向就绪队列的头指针head和尾指针tail int pfree; //定义指向空闲进程控制块队列的指针。
处理机调度的层次
(1)截至时间的保证:所谓的截至时间,是指某认为必须开始执行的最迟时间,或者完成的最迟 时间。
(2)可预测性:例如在多媒体系统中,无论是电影还是电视剧都应该连续播放的ຫໍສະໝຸດ 这就提供了请 求的可预测性。三
个
层
次
处理机调度的层次
单击此处添加正文,文字是您思想的提炼,请尽量言简意赅的阐述观 点。
高级调度(High level Scheduling) 又称长调度或作业调度,它的调度对象时作业,其主要功能室根据某种算法, 决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程,分配必要资 源,并将它们放入就绪队列。高级调度主要用于多道批处理系统,而在分时系统中不 设置高级调度。 低级调度(Low level Scheduling) 又称为进程调度或短程调度,其调度的对象时进程(或内核级的线程)。主要 功能是,根据某种算法,决定就绪队列中的哪个进程获得处理机。 中级调度(Intermediate Scheduling) 又称为内存调度,目的是提高内存利用率和系统吞吐量。为此应把那些战士不 能允许的进程,调至外存等待,此时进程的状态称为就绪驻外存状态。
评价因素 吞吐量 单位时间内CPU完成作业的数量。 CPU利用率 从0%~100%。 周转时间 评价批处理系统的性能指标。 Ti = 作业完成时刻 - 作业提交时刻 确定进程调度原则 在系统角度来说, 公平性:每个进程(不论优先级)都有机会被运行;较大的吞吐量。 用户角度, 及时性:响应速度要快;较短的周转时间:不应当让用户等待时间过长。
2.批处理系统的目标
(1)平均周转时间短。周转时间是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。 (2)系统吞吐量高:吞吐量是指在单位时间内系统所完成的作业数,因而它与批处理作业的平均 长度有关。 (4)处理机利用率高
进程调度
引起进程调度的主要因素有:(1)一个进程运行完毕。
(2)一个正在运行的进程被阻塞。
(3)在抢占式调度中,一个高优先级的进程被创建。
(4)在抢占式调度中,一个高优先级进程由阻塞唤醒。
(5)在轮转式调度中,正垢进程运行完进程调度的概念无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。
另外,系统进程也同样需要使用处理机。
这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
进程有四个基本属性1.多态性从诞生、运行,直至消灭。
2.多个不同的进程可以包括相同的程序3.三种基本状态它们之间可进行转换4.并发性并发执行的进程轮流占用处理器进程的三种基本状态:1.等待态:等待某个事件的完成;2.就绪态:等待系统分配处理器以便运行;3.运行态:占有处理器正在运行。
运行态→等待态往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。
等待态→就绪态则是等待的条件已满足,只需分配到处理器后就能运行。
运行态→就绪态不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。
例如时间片用完,或有更高优先级的进程来抢占处理器等。
就绪态→运行态系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态进程调度的分级高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。
进程调度的方式进程调度有以下两种基本方式:非剥夺方式分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。
第8章 进程调度
Tw(pi) = ∑Ω 。
▪ 显然一个进程的期望等待时间是指一个
进程花在就绪队列中的平均等待服务的 时间。
4
4.0
1
5.0
4
P3
P2
P4
78
12
16
▪平均等待时间 = (0 + 6 + 3 + 7)/4 = 4
强占SJF的实例
▪ 强占SJF调度算法
进程 P1 P2 P3 P4
▪ Gantt 图表如下 :
到达时间 0.0 2.0 4.0 5.0
需要服务时间 7 4 1 4
P1
P2 P3 P2
P4
时间 0 2
FCFS 和SJF例题
[例8.1]: 试分别计算图8.2(a)和(b)所示的就绪队列中 进程的期望周转时间和期望等待时间。 假定就绪
队列中有4个进程,如下图所示:
进程 服务时间
p0
30
p1
10
p2
40
p3
20
▪ 下面分别计算图8.2(a)和(b)中所示的就绪队列中进程的期望
周转时间和期望等待时间。
列,因为它要求进程的抵达速度和CPU 的运行速度一样快,目前系统还不能长 期这样运行。
8.2 非强占方式调度算法
▪ 非强占调度算法是不强迫一个已经分配到CPU的进
程改变就绪状态。
▪ 在非强占调度算法的系统中不存在从CPU直接返回
到就绪队列的路径。见附图1。
返回就绪队列的路径
就绪队列
┉
调度程序
(完整版)操作系统简答题
五问答题1.在单处理机环境下,进程间有哪几种通信方式,是如何实现的?1. 作业调度:从一批后备作业中选择一个或几个作业,给它们分配资源,建立进程,挂入就绪队列。
执行完后,回收资源。
进程调度:从就绪进程队列中根据某个策略选取一个进程,使之占用CPU。
交换调度:按照给定的原则和策略,将外存交换区中的进程调入内存,把内存中的非执行进程交换到外存交换区中。
2.设备管理中的数据传送控制方式有哪几种?分别简述如何实现的。
2. 程序直接控制:由用户进程来直接控制内存或CPU和外设间的信息传送。
中断方式:进程通过CPU发出指令启动外设,该进程阻塞。
当输入完成时,I/O控制器通过中断请求线向CPU发出中断信号,CPU进行中断处理。
DMA方式:在外设和内存之间开辟直接的数据交换通路。
通道控制方式:CPU发出启动指令,指出通道相应的操作和I/O 设备,该指令就可启动通道并使该通道从内存中调出相应的通道指令执行。
3.简述进程的几种状态和引起状态转换的典型原因,以及相关的操作原语。
3. 进程的基本状态有:新、就绪,阻塞,执行、挂起和终止六种。
新到就绪:交换,创建原语就绪到执行:进程调度执行到阻塞:I/O请求,阻塞原语阻塞到就绪:I/O完成,唤醒原语执行到就绪:时间片完阻塞到挂起:挂起原语挂起到就绪:唤醒原语执行到终止:进程执行完毕4.什么是段式存储管理?它从逻辑地址到物理地址是怎么变换的?4.把程序按内容或构成关系分成段,每段有自己的名字。
一个用户作业或进程包含的段对应于一个二维虚拟储存器。
以段为单位分配内存,然后通过地址映射机构把逻辑地址转换成物理地址。
只将那些经常访问的段驻留内存,其他的段放在外存,待需要时自动调入。
地址变换过程:由虚地址中的段号为索引,查段表。
找出该段在内存的起始地址,并将其和段内地址相加,从而得到物理地址。
5.什么是请求页式管理?能满足用户哪些需要?答:请求页式管理的基本原理是将逻辑地址空间分成大小相同的页,将存储地址空间分块,页和块的大小相等,通过页表进行管理。
操作系统中常用的进程调度算法
操作系统中常用的进程调度算法1、先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
2、短作业(进程)优先调度算法短作业(进程)优先调度算法,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
3、时间片轮转法在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小从几ms到几百ms。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。
换言之,系统能在给定的时间内响应所有用户的请求。
4、多级反馈队列调度算法前面介绍的各种用作进程调度的算法都有一定的局限性。
如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。
而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。
进程的调度算法
进程的调度算法调度算法的实质是:根据系统的资源分配策略所规定的资源分配算法。
先介绍⼀下进程调度与作业调度的区别:进程调度是真正让某个就绪状态的进程到处理机上运⾏,⽽作业调度只是使作业具有了竞争处理机的机会。
进程调度(⼜称微观调度、低级调度、短程调度):是按照某种调度算法从就绪状态的进程中选择⼀个进程到处理机上运⾏。
负责进程调度功能的内核程序称为进程调度程序。
作业调度(⼜称⾼级调度、宏观调度、长程调度):是按某种调度算法从后备作业队列中选择作业装⼊内存运⾏;另外当该作业执⾏完毕后,还负责回收系统资源。
完成作业调度功能的程序称为作业调度程序。
下⾯介绍⼏种常见的调度算法:先来先服务(FCFS,first come first served)FCFS调度算法是⼀种最简单的调度算法,该调度算法既可以⽤于作业调度也可以⽤于进程调度。
在作业调度中,算法每次从后备作业队列中选择最先进⼊该队列的⼀个或⼏个作业,将它们调⼊内存,分配必要的资源,创建进程并放⼊就绪队列。
在进程调度中,FCFS调度算法每次从就绪队列中选择最先进⼊该队列的进程,将处理机分配给它,使之投⼊运⾏,直到完成或因某种原因⽽阻塞时才释放处理机。
优点:保证了公平性,规则简单缺点:有利于长进程⽽不利于短进程,有利于CPU 繁忙的进程,⽽不利于I/O 繁忙的进程短作业优先(SJF,Shortest Job First)短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。
短作业优先(SJF)调度算法是从后备队列中选择⼀个或若⼲个估计运⾏时间最短的作业,将它们调⼊内存运⾏。
⽽短进程优先(SPF)调度算法,则是从就绪队列中选择⼀个估计运⾏时间最短的进程,将处理机分配给它,使之⽴即执⾏,直到完成或发⽣某事件⽽阻塞时,才释放处理机。
优点:相⽐FCFS 算法,该算法可改善平均周转时间和平均带权周转时间,缩短进程的等待时间,提⾼系统的吞吐量。
缺点:该算法对长作业不利,SJF调度算法中长作业的周转时间会增加。
进程调度
4.2 调度算法
4.2.2 调度算法
(4) 时间片轮转调度算法 ①算法 在早期的时间片轮转算法中,系统将所有的就绪进程按先 来先服务的原则,排成一个队列,每次调度时把CPU分配给 队首进程,并令其执行一个时间片,当时间片用完时,调度 程序终止当前进程的执行,并将它送到就绪队列的队尾。
4.2 调度算法
4.2 调度算法
4.2.2 调度算法
(3) 优先权调度算法 ①算法 当使用优先权调度算法进行作业调度时,系统将 从后备队列中选择若干个优先权最高的作业调入内存。 当使用优先权调度算法进行进程调度时,系统将CPU 分配给就绪队列中优先权最高的进程。
4.2 调度算法
4.2.2 调度算法
(3) 优先权调度算法 ②算法的类型 非抢占式(nonpreemptive)优先权算法。 进程一但得到处理机,则该进程便一直进行下去 直到完成或由于某事件放弃处理机。
T8=80ms L(a)=100-t8-10=100-80-10=10 L(b)=100-t8-25=100-80-(25-15)=10
4.6 多处理机调度
4.6.1 多处理机系统(MPS)的类型
(1)紧密耦合的多处理器系统和松弛耦合的多处理器系统 (2)对称多处理器系统和非对称多处理器系统
4.6 多处理机调度
最低松弛度优先
T5=45ms L(a)=60-t5-10=60-45-10=5 L(b)=100-t5-25=100-45-25=30 L(a)<L(b) 调度A进程执行10ms
T6=55ms L(a)=80-t6-10=80-55-10=15 L(b)=100-t6-25=100-55-25=20
4.2.1 选择调度方式和算法的若干准则
面向用户的准则 (1) 周转时间短 (2) 响应时间快 (3) 截止时间的保证
操作系统原理-第四章处理机调度知识点及习题
第四章处理机调度与死锁4.1 知识点汇总1、处理机调度级别⑴调度:选出待分派的作业或进程⑵处理机调度:分配处理机⑶三级调度:高级调度(作业调度)、中级调度(内存对换)、低级调度(进程调度)2、作业状态⑴作业状态分为四种:提交、后备、执行和完成。
⑵作业状态变迁图:图4-1 作业状态及变迁3、作业调度和调度的功能⑴. 作业调度的任务后备状态→执行状态执行状态→完成状态⑵作业调度的功能①记录系统中各个作业的情况②按照某种调度算法从后备作业队列中挑选作业③为选中的作业分配内存和外设等资源④为选中的作业建立相应的进程⑤作业结束后进行善后处理工作4、进程调度和调度的功能1). 进程调度:后备状态→执行状态2). 进程调度时机:任务完成后、等待资源时、运行到时了、发现重调标志3). 进程调度的功能:保存现场、挑选进程、恢复现场5、两级调度模型 作业调度和进程调度的区别6、评价调度算法的指标调度性能评价准则:CPU利用率、吞吐量、周转时间、就绪等待时间和响应时间(1)吞吐量:单位时间内CPU完成作业的数量(2)周转时间:1) 周转时间=完成时刻-提交时刻2) 平均周转时间=周转时间/n3) 带权周转时间=周转时间/实际运行时间4) 平均带权周转时间=带权周转时间/n7、作业与进程调度算法(1)先来先服务(FCFS)调度算法的实现思想:按作业(进程)到来的先后次序进行调度,即先来的先得到运行。
用于作业调度:从作业对列(按时间先后为序)中选择队头的一个或几个作业运行。
用于进程调度:从就绪队列中选择一个最先进入该队列的进程投入运行。
例如设有三个作业,编号为1,2,3。
各作业分别对应一个进程。
各作业依次到达,相差一个时间单位。
①图示出采用FCFS方式调度时这三个作业的执行顺序②算出各作业的周转时间和带权周转时间(2)时间片轮转(RR)调度算法的实现思想:系统把所有就绪进程按先进先出的原则排成一个队列。
新来的进程加到就绪队列末尾。
《操作系统原理》进程的创建与管理实验
《操作系统原理》进程的创建与管理实验1.目的要求(1)加深对进程概念的理解,明确进程和程序的区别。
(2)深入了解系统如何组织进程、创建进程。
(3)进一步认识如何实现处理器调度。
2.实验内容编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。
实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试。
3.所需实验设施设备PC、windows操作系统4.教学形式及过程演示、学生独立完成5.设计思路(1)该程序是一个简单的时间片轮转调度算法的实现。
(2)首先定义了一个进程控制块(PCB)的结构体,包含进程的名称、到达时间、需要的运行时间、剩余运行时间和当前状态等信息。
然后定义了一个创建新节点的函数createNode,用于动态分配内存并初始化节点的数据。
接着定义了一个向循环链表中插入新节点的函数insertNodes,根据用户的输入创建新节点并插入到链表末尾。
然后定义了一个打印链表的函数printList,用于输出链表中所有节点的信息。
(3)接下来是冒泡排序函数bubbleSort,按照到达时间对链表中的节点进行排序。
然后定义了一个运行函数run,根据时间片大小依次运行进程,直到所有进程都完成运行。
最后在主函数中读取用户输入的进程数量和时间片大小,创建链表并调用run函数进行进程调度。
(4)整体思路是:先创建一个空链表,然后根据用户输入的进程数量,逐个创建新节点并插入到链表末尾。
然后对链表中的节点按照到达时间进行排序。
接着按照时间片大小依次运行进程,直到所有进程都完成运行。
最后输出链表中所有节点的信息。
6.知识原理操作系统通过进程控制块(PCB)来组织和管理进程。
(1)首先,操作系统会为每个进程创建一个PCB,PCB中包含了进程的重要信息,如进程号、进程状态、程序计数器、寄存器值、内存分配情况、打开文件等。
(2)当一个进程被创建时,操作系统会为其分配一个唯一的进程号,并将进程的相关信息填充到PCB中。
操作系统复习题(2)及答案
一.名词解释抢占式进程调度进程状态系统调用中断响应线程联想存储器死锁通道地址重定位高速缓存可再入程序抖动索引文件作业控制块目录项设备驱动程序虚存逻辑空间物理空间二.填空题1.现代操作系统的两个最基本的特征是(),(),()和()2.操作系统是计算机系统中的一个(),它管理和控制计算机系统中的()3.允许多个用户以交互方式使用计算机的操作系统称为(),允许多个用户将多个作业提交给计算机集中处理的操作系统称为(),计算机系统能及时处理过程控制数据并做出响应的操作系统称为()。
4.用户与操作系统之间的接口主要分为()和()两类。
5.进程控制块的初始化工作包括(),()和()。
6.在操作系统中引入线程概念的主要目的是()。
7.程序并发执行与顺序执行时相比产生了一些新特性,分别是:(),()和()。
8.进程是一个程序对某个数据集的()。
9.如果系统有N个进程,则在等待队列中进程的个数最多可为()个。
10.在操作系统中,不可中断执行的操作称为()。
11.如果信号量的当前值为-4,则表示()。
12.在有M个进程的系统中出现死锁时,死锁进程的个数K应该满足的条件是()。
13.不让死锁发生的策略可以分为静态和动态的两种,死锁避免属于()。
14.若使当前运行进程总是优先级最高的,应选择()进程调度算法。
15.在进程中,访问()的代码称为临界区。
为保证进程()使用临界区,应在进程的临界区前设置(),在临界区后设置()。
16.在采用请求分页式存储管理的系统中,地址变换可能会因为(),(),和()等原因而产生中断。
17.在可变分区存储管理中,分区的保护通常采用()和()两种方式。
18.在分区分配算法中,首次适应算法倾向于优先利用内存中()部分的空闲分区,从而保留了()部分的大空闲区。
19.不让死锁发生的策略可以分为静态和动态的两种,死锁避免属于()。
20.若使当前运行进程总是优先级最高的,应选择()进程调度算法。
21.缓冲区由()和()组成22.进行设备分配时所需的数据表格主要由(),(),()和()等。
进程调度实验报告
操作系统实验 报告实验项目: 进程调度学 院: 计算机学院专 业:班 级:学 号:姓 名:1. 实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理机数时,就必须依照某种策略来决定哪些进程优先占用处理机。
本实验模拟在单处理机情况下的进程调度,加深了解进程调度的工作。
2. 实验内容设计一个按时间片轮转法实现进程调度的程序。
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB 来代表,进程控制块的格式为:其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q 1,Q 2,Q 3,Q 4,Q 5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R ”表示。
当一个进程运行结束后,它的状态为“结束”,用“E ”表示。
(2)每次运行所设计的进程调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到Q 2执行,则有:进程名 指针 要求运行时间 已运行时间 状态标志单元(4)进程调度总是选择标志单元指示的进程运行。
由于本实验是模拟进程调度的功能,所以对被选中的进程并不实际的启动运行,而是执行“已运行时间+1”来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理机运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务二、单处理机系统的进程调度
一、实验目的
1、加深对进程概念的理解,明确进程和程序的区别
2、深入了解系统如何组织进程,创建进程
3、进一步认识如何实现处理机调度。
二、实验内容
从下面三个调度算法中,选择一个调度算法来实现进程调度:
1、先来先服务调度算法
2、优先数调度算法;
3、时间片轮法调度算法
4、多级反馈队列轮转调度算法
三、实验代码
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /* 定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort() /* 建立对进程进行优先级排列函数*/
{
}
void input() /* 建立进程控制块函数*/
{
int i,num;
printf("\n 请输入进程数量:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号No.%d:\n",i);
p=getpch(PCB);
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 调用sort函数*/
}
}
int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
void check() /* 建立进程查看函数 */
{
PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p);
pr=ready;
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n 进程 [%s] 已完成.\n",p->name);
free(p);
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ {
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 调用destroy函数*/
else
{
(p->super)--;
p->state='w';
sort(); /*调用sort函数*/
}
}
void main() /*主函数*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
}
图2-1 最高优先数优先的调度算法运行结果。