进程调度
2017-11-19 23:39 沈橙Anei 阅读(270) 评论(0) 编辑 收藏 举报进程调度
一,设计目的:
进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本设计模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。
二,设计内容:
设计程序模拟单处理机系统中的进程调度算法,在短作业优先调度算法、时间片轮转调度、最高优先级优先算法三种算法中选择两种实现。
每个进程由一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3中状态之一。
三、开发环境
windows环境,VC6.0平台。
四,分析设计
<一>实验原理
(1)最高优先级优先算法思想
将进程按照优先级由高到低排序
就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也即进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列以及各个进程的PCB,以便进行检查。
重复以上过程,直到所有进程都完成为止。
(2)时间片轮转调度
系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片.时间片的大小从几ms到几百ms.当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片.这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间.
<二>程序结构
(1)最高优先级优先
1.先按照优先级排序
for(i=0;i<n-1;i++) //按照优先级排序
{
for(j=n-2;j>=i;j--)
{
if(pcb[j+1].priority>pcb[j].priority)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
2.按照排序运行时间片
3.判断程序是否完成
if((pcb[0].needtime-pcb[0].usedtime)>pTime) //判断进程剩余的运行时间是否大于时间片
{
pcb[0].usedtime+=pTime;
pcb[0].priority--;
pcb[0].state='W';
}
else //已完成的进程
{
pcb[0].usedtime=pcb[0].needtime;
pcb[0].priority=-1;
pcb[0].state='F';
4.完成退出
(2)时间片轮转调度
1按照先来先服务原则排序
struct pro* creatList() //创建链表,按照进程的到达时间排列,记录所有进程的信息
void insert(struct pro *head,struct pro *s) //插入节点
{
struct pro *p=searchByAT(head,s->arriveTime);
s->next=p->next;
p->next=s;
2.按照先来先服务原则排序好队列之后按照输入的时间片运行。
3.进程运行完成退出就绪队列
<三>程序流程图:
(1)最高优先级优先
(2)时间片轮转调度
五.结果分析
(1)最高优先级优先
1.输入四个进程后按照优先级排序:2 1 3 4
2.按照时间片运行,每次运行后进程优先级减一。
3.每当进程运行完进程状态显示为F。