处理机调度

编辑:平息网互动百科 时间:2020-07-07 22:58:15
编辑 锁定
在多道程序设计系统中,内存中有多道程序运行,他们相互争夺处理机这一重要的资源。处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
中文名
处理机调度
释    义
照算法选择进程并将处理机分配
目    的
实现进程并发地执行
功    能
记住进程的状态等
性能准则
不同的调度算法
因    素
CPU利用率等

处理机调度功能

一般情况下,当占用处理机的进程因为某种请求得不到满足而不得不放弃CPU进入等待状态时,或者当时间片到,系统不得不将CPU分配给就绪队列中另一进程的时候,都要引起处理机调度。除此之外,进程正常结束、中断处理等也可能引起处理机的调度。因此,处理机调度是操作系统核心的重要组成部分,它的主要功能如下:
(1)记住进程的状态,如进程名称、指令计数器、程序状态寄存器以及所有通用寄存器等现场信息,将这些信息记录在相应的进程控制块中。
(2)根据一定的算法,决定哪个进程能获得处理机,以及占用多长时间。
(3)收回处理机,即正在执行的进程因为时间片用完或因为某种原因不能再执行的时候,保存该进程的现场,并收回处理机。
处理机调度的功能中,很重要的一项就是根据一定算法,从就绪队列中选出一个进程占用CPU运行。可见,算法是处理机调度的关键。

处理机调度性能准则

处理机调度,有许多不问的调度算法,不同的调度算法具有不同的特性。因此,在介绍算法之前,先介绍衡量一个算法的基本准则。
衡量和比较调度算法性能优劣主要有一下几个因素:
(1)CPU利用率。CPU是计算机系统中最重要的资源,所以应尽可能使CPU保持忙,使这一资源利用率最高。
(2)吞吐量。CPU运行时表示系统正处于工作状态,工作量的大小是以每单位时间所完成的作业数目来描述的,这就叫吞吐量
(3)周转时间。指从作业提交到作业完成所经过的时间,包括作业等待,在就绪队列中排队,在处理机上运行以及进行输入/输出操作所花时间的总和。
(4)等待时间。处理机调度算法实际上并不影响作业执行或输入/输出操作的时间,只影响作业在就绪队列中等待所花的时间。因此,衡量一个调度算法优劣常常简单的考察等待时间。
(5)响应时间。指从作业提交到系统作出响应所经过的时间。在交互式系统中,作业的周转时间并不一定是最好的衡量准则,因此,常常使用另一种度量准则,即响应时间。从用户观点看,响应时间应该快一点好,但这常常要牺牲系统资源利用率为代价。

处理机调度调度算法

处理机调度先来先服务调度算法(FCFS)

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机

处理机调度短作业优先调度算法

短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

处理机调度优先权调度算法

为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。此算法常被用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可用于实时系统中。当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。
(1)非抢占式优先权算法
在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。
(2) 抢占式优先权调度算法
在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。

处理机调度基于时间片的轮转调度算法

在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片。时间片的大小从几ms 到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。[1] 

处理机调度算法的实现

[2]  程序设计思路:
自定义结构体PCB表(进程名name,进程优先数priority,进程执行时间time)以及进程就绪队列Queue_Process(data[MAXSIZE]数组存放PCB,front,rear队首队尾指针),通过每次对进程就绪队列进行进程优先数从大到小排序来确定进程执行的选择,并且是采用动态优先数调度算法(每次优先数减1,执行时间减1),每次输出进程执行情况时只需要将队首PCB调出执行,其他进程都处于动态就绪状态,等进程执行结束后重新对进程就绪队列排序。
[2]  程序中,采用结构体、队列等数据结构,其中对队列每次排序是采用冒泡排序算法实现。
#include<iostream>
#include<string>

usingnamespacestd;

#defineMAXSIZE10

structPCB
{
intname;//进程名
intpriority;//进程优先数
inttime;//进程执行时间
};

structQueue_Process
{
PCBdata[MAXSIZE];//PCB队列
intfront;//队首
intrear;//队尾
};

voidInitQueue(Queue_Process*Q)
{
Q->front=Q->rear=0;
}

boolIsQueueEmpty(Queue_ProcessQ)//队空判断函数
{
return(Q.front==Q.rear)?true:false;
}

boolIsQueueFull(Queue_ProcessQ)//队满判断函数
{
return(Q.front==(Q.rear+1)%MAXSIZE)?true:false;
}

voidEnQueue(Queue_Process*Q,PCBx)//入队函数
{
if(IsQueueFull(*Q))//判断队列是否为满
{
cout<<"队满,入队操作失败!"<<endl;
exit(0);
}
//队列非满,将PCB入队,将其中信息填入
Q->data[Q->rear].name=x.name;
Q->data[Q->rear].priority=x.priority;
Q->data[Q->rear].time=x.time;
Q->rear=(Q->rear+1)%MAXSIZE;//队列队尾指针后移
}

voidDeleQueue(Queue_Process*Q)
{
if(IsQueueEmpty(*Q))//判断队列是否为空
{
cout<<"队空,出队操作失败!"<<endl;
exit(0);
}
Q->front=(Q->front+1)%MAXSIZE;//将队列首指针后移
}

voidSortPCB(PCB*pcb,intn)//PCB优先数大小从大到小排列函数
{
PCBtemp;
boolexchange=true;//交换标志
for(inti=n-1;i>0&&exchange;i--)//冒泡排序算法排序
{
exchange=false;
for(intj=0;j<i;j++)
{
if(pcb[j].priority<pcb[j+1].priority)//交换PCB中的数据
{

temp.name=pcb[j].name;
temp.priority=pcb[j].priority;
temp.time=pcb[j].time;
pcb[j].name=pcb[j+1].name;
pcb[j].priority=pcb[j+1].priority;
pcb[j].time=pcb[j+1].time;
pcb[j+1].name=
temp.name;
pcb[j+1].priority=temp.priority;
pcb[j+1].time=temp.time;
exchange=true;
}
}
}
}

voidInput(PCB*pcb,intn)//进程信息输入函数
{
cout<<"请输入每个进程的优先数和执行时间:"<<endl;
intp,t;
for(inti=0;i<n;i++)//输入每个进程的优先数和执行时间
{
cin>>p>>t;
pcb[i].name=i;
pcb[i].priority=p;
pcb[i].time=t;
}
}

voidDisplay(Queue_Process*queue)//输出每个时刻的进程运行情况函数
{
cout<<"进程名\t"<<"优先数\t"<<"执行时间\t"<<"进程状态"<<endl;
do
{
if(queue->data[queue->front].time>1)
{
cout<<""<<queue->data[queue->front].name<<"\t"<<""<<queue->data[queue->front].priority<<"\t\t"<<""<<queue->data[queue->front].time<<"\t\t"<<"执行中..."<<endl;
queue->data[queue->front].priority-=1;
queue->data[queue->front].time-=1;
for(inti=1;i<queue->rear-queue->front;i++)
cout<<""<<queue->data[queue->front+i].name<<"\t"<<""<<queue->data[queue->front+i].priority<<"\t\t"<<""<<queue->data[queue->front+i].time<<"\t\t"<<"等待中..."<<endl;
cout<<endl<<endl;
}
else
{
cout<<""<<queue->data[queue->front].name<<"\t"<<""<<queue->data[queue->front].priority<<"\t\t"<<""<<queue->data[queue->front].time<<"\t\t"<<"执行中..."<<endl;
for(inti=1;i<queue->rear-queue->front;i++)
cout<<""<<queue->data[queue->front+i].name<<"\t"<<""<<queue->data[queue->front+i].priority<<"\t\t"<<""<<queue->data[queue->front+i].time<<"\t\t"<<"等待中..."<<endl;
cout<<"进程"<<queue->data[queue->front].name<<"执行完毕!"<<endl<<endl<<endl;
DeleQueue(queue);
}
SortPCB(queue->data,queue->rear-queue->front);//对队列中的优先数进程重新排序
}while(!IsQueueEmpty(*queue));
}

voidmain()
{
PCBprocess[MAXSIZE-1];//进程数组
Queue_Processqueue;//进程队列
intnum;//要输入的进程数
cout<<"请输入进程同步数num:"<<endl;
cin>>num;

InitQueue(&queue);//初始化队列
Input(process,num);
for(inti=0;i<num;i++)//通过循环使每个进程入队
{
EnQueue(&queue,process[i]);
}
SortPCB(queue.data,queue.rear-queue.front);//对进程按优先数从大到小排列

cout<<endl<<"\t\t进程执行情况:"<<endl;
Display(&queue);//进程运行函数
}

参考资料
  • 1.    汤小丹 梁红兵 哲凤屏 汤子瀛 .《计算机操作系统》(第三版):西安电子科技大学出版社,2007
  • 2.    处理机调度算法的实现  .百度文库[引用日期2013-12-25]
词条标签:
中国电子学会 通信技术 软件 计算机学 操作系统