进程调度算法模拟实现与性能分析

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

科技情报开发与经济SCI-TECHINFORMATIONDEVELOPMENT&ECONOMY2007年第17卷第1期
进程调度的核心问题就是采用什么样的算法把处理机分配给进程,好的算法将提高资源利用率,减少处理机的空闲时间,避免有些作业长期得不到响应的情况发生等,从而设计出受欢迎的操作系统。

1进程调度算法
1.1进程的概念
进程是程序的一次执行过程,是可并发执行的程序在一个数据集合上的运行过程。

进程是计算机系统中分配资源的基本单位,也是能够独立运行的基本单位,对操作系统的研究,可以从进程观点出发,进程是操作系统(OS)中极为重要的概念。

进程有3个基本状态:就绪态、运行态和阻塞态。

进程在运行期间,不断地从一个状态转换到另一个状态,它可以多次处于就绪态和运行态,也可以多次处于阻塞态。

为描述进程的运行变化过程,采用一个与进程联系的进程控制块PCB(ProcessControlBlock),它使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程,OS是根据PCB来对并发执行的进程进行管理和控制的。

1.2各种算法思想简介
在多道程序系统中,用户进程数往往多于处理机数,这将使它们相互争夺处理机。

此时,系统进程同样也需使用处理机,这样就需按一定的算法,动态地把处理机分配给就绪队列中的某一进程,使之执行。

进程调度算法有很多种,现将各种算法思想介绍如下,其后附有该算法的C语言模拟程序的核心部分。

算法数据结构及操作:将输入的N个进程的PCB信息保存到一个数组中,用PCB链表的插入和删除动态地模拟进程调度过程,t时刻有新进程到达则插入进程链表,当前进程执行完毕则从进程链表中删除。

1.2.1先来先服务算法
算法思想:按照进程开始的先后次序调度进程,排队等待时间最长的进程被优先调度。

用结构体模拟进程控制块如下:
typedefstructPCB

charname;//进程名
charstate;//进程状态
intarr_time;//到达时间
intfin_time;//完成时间
intrest_time;//剩余时间
intCPU_time;//服务时间
intrun_time;//已运行时间
intTr;//周转时间
floatTw;//带权周转时间
structPCB*next;
intindex;//对应的process[]的下标
}PCB
程序模拟核心部分:
N:进程总数t:计时,初值为0
intt=0,n=N,i,k=1,j=0;
PCB*head,*tail,*q;
head=creatnode(0);//创建新进程
tail=head;
while(n>0)

process[j].state=‘R’;//进程处于运行态
t+=head->CPU_time;
process[j].run_time=process[j].CPU_time;
process[j].state=‘F’;
process[j].fin_time=t;
j++;
for(i=k;i<N;i++)

if(t>=process[i].arr_time)

//将已到达的进程插入进程链表中
q=creatnode(i);
tail->next=q;tail=q;

elsebreak;

k=i;
q=head;//从进程链表中删除已执行完的进程
head=head->next;
free(q);n--;

1.2.2时间片轮转算法
算法思想:沿着进程队列将各进程执行规定一个时间片,时间片到或进程执行完毕就停止,删除执行完的进程,新到进程入队列尾,循环以上操作直至所有进程都执行完毕。

程序模拟核心部分如下:N:进程总数t:计时,初值为0
intt1,t=0,n=N,i=1,j;
PCB*head,*p,*q,*pre_p,*tail;
head=creatnode(0);
tail=head;
p=pre_p=head;
while(n>0)

if(p==NULL)p=head;
j=p->index;
process[j].state=‘R’;
if(n==1)//只剩一个进程未运行完{
文章编号:1005-6033(2007)01-0227-04收稿日期:2006-08-10进程调度算法模拟实现与性能分析
郜瑜
(中国人民大学信息学院,北京,100872)
摘要:介绍了几种典型的进程调度算法,并用C语言程序模拟了各个进程调度算法
的执行情况,最后通过一组实验数据对各种进程调度算法的性能进行了比较。

关键词:进程调度算法;程序设计;模拟实现;处理机
中图分类号:TP316文献标识码:A
227
process[j].state=‘F’;
process[j].run_time=process[j].CPU_time;
t+=process[j].rest_time;
free(p);n--;

else

for(t1=1;i<N&&t1<=T&&t1<=process[j].rest_time;t1++)

if(t+t1>=process[i].arr_time)

q=creatnode(i);
tail->next=q;tail=q;
i++;


if(T<process[j].rest_time)

process[j].state=‘W’;
process[j].run_time+=T;
process[j].rest_time-=T;
pre_p=p;p=p->next;
t+=T;

else

process[j].state=‘F’;
process[j].run_time=process[j].CPU_time;
t+=process[j].rest_time;
process[j].fin_time=t;
if(p==head){head=p->next;free(p);p=pre_p=head;}
else

pre_p->next=p->next;free(p);
p=pre_p->next;

n--;



1.2.3最短进程算法
算法思想:它按照进程要求运行的时间来调度,运行时间短的进程优先调度。

程序模拟核心部分如下:
intt1,j,t=0,i=1,n=N;//N:进程总数t:计时,初值为0
PCB*head,*p,*q,*pre_p;
head=creatnode(0);
while(n>0)

j=head->index;
process[j].state=‘R’;
for(t1=1;i<N&&t1<=process[j].CPU_time;t1++)

if(t+t1>=process[i].arr_time)

//新到进程按服务时间升序入链
q=creatnode(i);
if(head->next!=NULL)

pre_p=head;
for(p=head->next;p!=NULL;p=p->next)

if(q->CPU_time<p->CPU_time)

q->next=p;pre_p->next=q;
break;}
pre_p=p;

If(p==NULL)pre_p->next=q;

elsehead->next=q;
i++;


process[j].state=‘F’;
process[j].run_time=process[j].CPU_time;
t+=process[j].CPU_time;
process[j].fin_time=t;
p=head;
head=head->next;
free(p);
n--;

1.2.4最短剩余时间算法
算法思想:某时刻,从进程队列中选择剩余时间最短的进程运行,在此期间若新到进程的剩余时间比当前进程短,则转向执行新到进程,否则继续执行直至完毕。

程序模拟核心部分如下:
intt1,t=0,n=N,i=1,tag=0;//N:进程总数t:计时,初值为0
PCB*head,*q,*p,*pre_p,*pre,*min,*tail;
head=creatnode(0);
tail=head;
while(n>0)

min=head;pre_p=head;
if(head->next!=NULL)

//在已到进程中查找剩余时间最短的进程
for(p=head->next;p!=NULL;p=p->next)

if(min->rest_time>p->rest_time)
{min=p;pre=pre_p;}
pre_p=p;


loop:process[min->index].state=‘R’;
for(t1=1;i<N&&t1<=process[min->index].rest_time;t1++)

(min->rest_time)--;
if(t+t1>=process[i].arr_time)

q=creatnode(i);
tail->next=q;p=tail;tail=q;
i++;
if(q->rest_time<min->rest_time)

tag=1;break;

228


if(tag==1)//新到进程比正在运行的进程的剩余时间少,执行新到进程

t+=t1;
process[min->index].run_time+=t1;
process[min->index].rest_time-=t1;
process[min->index].state=‘W’;
tag=0;
min=q;pre=p;
gotoloop;

else

t+=process[min->index].rest_time;
process[min->index].fin_time=t;
process[min->index].state=‘F’;
process[min->index].run_time=process[min->index].CPU_time;
n--;
if(min==head)head=head->next;
else{pre->next=min->next;free(min);}


1.2.5最高响应比算法
算法思想:综合了FIFO和SPN两者,既考虑进程等待时间,又考虑进程执行时间,求两者时间之比(即响应比),高者优先。

它在进行调度时,需要首先计算每个进程的响应比。

程序模拟核心部分如下:intt1,j,i=1,w,s,t=0,n=N;//N:进程总数t:计时,初值为0
floatm,tag;
PCB*head,*q,*tail,*max,*pre,*p;
head=creatnode(0);
tail=head;
while(n>0)

pre=max=head;
if(head->next!=NULL)//在已到进程中查找相应比最高的进程

w=t-head->arr_time;
s=head->CPU_time;
tag=(float)(w+s)/s;
q=head;
for(p=head->next;p!=NULL;p=p->next)

w=t-p->arr_time;s=p->CPU_time;
m=(float)(w+s)/s;
if(tag<m){pre=q;max=p;tag=m;}
q=p;


j=max->index;
process[j].state=‘R’;
for(t1=1;i<N&&t1<=process[j].rest_time;t1++)

if(t+t1>=process[i].arr_time)

q=creatnode(i);tail->next=q;tail=q;
i++;


t+=process[j].rest_time;
process[j].state=‘F’;
process[j].fin_time=t;
process[j].run_time=process[j].CPU_time;
if(max==head){head=max->next;free(max);}
else{pre->next=max->next;free(max);}
n--;

2基于上述算法的实验数据分析
2.1实验数据
由以上程序,针对不同的调度算法我们给出了相同的实验数据,以测试它们的参数变化,从而从不同方面对各调度算法进行性能评价。

实验队列为:A,B,C,D,E;到达时间分别为:0,2,4,6,8。

具体实验结果如下,其中Tr为周转时间,Tw为带权周转时间。

先来先服务算法,时间片轮转算法,最短进程算法,最短剩余时间算法,最高响应比算法实验数据分别见表1、表2、表3、表4、表5。

表1先来先服务算法实验数据
Name





CPU_time





Finish_time


13
18
20
Tr



12
12
Tw
1.000000
1.166667
2.250000
2.400000
6.000000
表2时间片轮转算法实验数据
Name





CPU_time





Finish_time

19
11
18
17
Tr

17

12

Tw
1.000000
2.833333
1.750000
2.400000
4.500000
表3最短进程算法实验数据
Name





CPU_time





Finish_time


15
20
11
Tr


11
14

Tw
1.000000
1.166667
2.750000
2.800000
1.500000
表4最短剩余时间算法实验数据
Name





CPU_time





Finish_time

15

20
10
Tr

13

14

Tw
1.000000
1.166667
1.000000
2.800000
1.000000
表5最高响应比算法实验数据
Name





CPU_time





Finish_time


13
20
15
Tr



14

Tw
1.000000
1.166667
2.250000
2.800000
3.500000
229
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
科技情报开发与经济
SCI-TECHINFORMATIONDEVELOPMENT&ECONOMY2007年第17卷第1期
表6
各种算法的比较
算法先来先服务时间片轮转最短进程最短剩余时间最高响应比
平均周转时间
8.609.607.607.208.00
平均带权周转时间
2.562.501.841.592.14
TheImplementationofandPerformanceAnalysisontheSimulation
oftheProcessSchedulingAlgorithm
GAOYu
ABSTRACT:Thispaperintroducesseveraltypicalprocessschedulingalgorithms,andsimulatestheimplementingsituationofeachprocessschedulingalgorithmbyusingC-language,andcomparestheperformanceofeachprocessschedulingalgorithmthroughasetofexperimentaldata.
KEYWORDS:processschedulingalgorithm;programdesign;simulatedimplementation;processor
Dialog联机系统是进行国外查新必备的数据库系统。

笔者多年来一直通过使用Dialoglink2.4平台进行Dialog联机系统的检索,Dialoglink2.4检索软件功能强大,响应速度快,可以在数分钟之内完成一个查新课题的检索。

现将其安装和使用技巧介绍如下。

1Dialoglink2.4的安装
输入Dialog公司主页的网址(http://wwwdialog.com),进入Dialog公司主页。

在主页的右上框“SUPPORT”中,点击“ProductDownloads”,然后点击下页中的Dialoglink2.4and3.0,进入下页第二条的“ReqistrationForm”,进行注册登记。

填完后点“Submit”提交,再点击下页中部的“AcceptDialoglinkLicenseAgreement”,在下页的下部可找到“DialogLinkVersion2.4”,就可点击安装了。

安装Dialoglink2.4很简单,按操作提示进行便可完成。

2Dialoglink2.4的设置
2.1
服务设置
(1)运行Dialoglink2.4,选择Configuration配置项下的ServiceSetup。

文章编号:1005-6033(2007)01-0230-03
收稿日期:2006-08-16
Dialoglink2.4的运用和检索技巧


(贵州省科技情报研究所,贵州贵阳,550004)

要:介绍了检索软件Dialoglink2.4的特点、安装、设置和运用方法,并通过查新实
例展示了降低联机检索费用的几种技巧。

关键词:Dialoglink2.4;联机检索;数据库中图分类号:G354.2
文献标识码:A
由以上实验数据可见,针对相同的进程个数,并且在到达的时刻相同的情况下,不同的调度算法所使用的平均周转时间不同
(见表6)。

先来先服务调度算法有利于长进程,而不利于短进程。

一个执行时间非常短的进程,也不得不排队等待,直到轮到自己运行;时间片轮转调度算法比较死板,必须要预先给每一个来到的进程分配时间片,占用
CPU处理时间,不适于实时控制要求较高的情况;最短进程调度算法有利于短进程,且在大多数进程都是短进程的情况下具有较大的合理性,但它又忽略了进程等待时间的长短,不利于长进程,可能会使一个运行时间较长的进程长期得不到调度;最短剩余时间调度算法,表格数据说明其具有最优的平均周转时间;最高响应比调度算法虽然是一种较好的折中,但增加了系统的开销,因为每次都要计算响应比。

2.2实例分析
(1)UnixSVR3和UnixBSD4.3的进程调度。

这些系统的主要设计目
标是提供交互式的分时操作环境,因此调度算法在保证低优先级的后台作业不饿死的前提下,尽可能向交互式用户提供快速的响应。

传统Unix的进
程调度采用多级反馈队列,对于每一个优先级队列采用时间片调度策略。

(2)WindowsNT的设计目标有两个,一是向单个用户提供交互式的计算环境;二是支持各种服务器(server)程序。

WindowsNT的调度是基于内核级线程的,它支持抢占式调度,包括多个优先数层次,在某些层次线程的优先数是固定的,在另一些层次线程的优先数将根据执行的情况动态调整。

它的调度策略是一个多级反馈队列,每一个优先数都对应于一个就绪队列,而每一个进程队列中的进程按照时间片方式调度。

3结语
不同的进程调度算法有着不同的优点和不足,面向需求才能说哪个
合适哪个不合适,它们本质上没有好坏之分,只是代表着各自更加关注的方面。

因此,已经成熟适用的操作系统由需求驱动,分别采用了不同的进程调度算法,甚至针对不同的应用,它们使用的调度策略也不是固定不变的。

参考文献
[1]汤子瀛,哲凤屏,汤小丹.计算机操作系统[M].西安:西安电子科技大学出版社,1996.
[2]
谭浩强.C语言程序设计[M].北京:清华大学出版社,1995.
(责任编辑:邱娅男)
───────────────
第一作者简介:郜
瑜,女,1986年6月生,现为中国人民大学信息
学院在读本科生,北京市,100872.
230。

相关文档
最新文档