当前位置:文档之家› 基于时间片轮转法的处理机调度算法

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

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

课程设计

课程设计名称:处理机调度——时间片轮转法

专业班级:计科20090班

学生姓名:刘帅阳

学号: 200948140323

指导教师:于俊伟

课程设计时间:2011-06-15——2011-06-17

计算机科学专业课程设计任务书

学生姓名刘帅阳专业班级计科0903 学号200948140323 题目处理机调度程序——时间片轮转法

课题性质其它课题来源自拟课题

指导教师于俊伟同组姓名无

主要内容选择一个调度算法,实现处理机调度。

1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。2)可选择进程数量

3)本程序包括三种算法,用C 语言实现,执行时在主界面选择算法(可用函数实现),

进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显

示结果。

任务要求设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。

参考文献任满杰等《操作系统原理实用教程》电子工业出版社 2006

汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社 2001

张尧学史美林《计算机操作系统教程》实验指导清华大学出版社 2000 罗宇等《操作系统课程设计》机械工业出版社2005

审查意见指导教师签字:

教研室主任签字: 2011年06月20日

1 需求分析

该处理机调度设计采用的是时间片轮转法。

进入界面后,系统会提示用户输入进程数量,然后选择时间片的大小。然后依次输入每个进程的名字和要求运行的时间。都输入完成以后,这时候进程控制块队列已经建立完毕,开始运行,每次运行一步,电脑将会将该时刻所有进程控制块的运行状态显示给用户。包括进程名、要求运行时间、已经运行时间、还需要运行时间、状态等信息。当每个进程运行一个时间片之后将它从该队列中移除,添加到就绪队列队尾中以便使每个进程可以循环执行。当要求运行时间和已运行时间相等时,说明该进程运行结束,将该进程撤出该队列并且不再添加到就绪队列中。直到就绪队列中没有就绪进程为止

2 概要设计

typedef struct node

{

char pname[10]; //进程名

int rtime; //已运行时间

int sytime; //剩余时间

int ntime; //要求服务时间

char state; //状态

struct node *next;

}PCB;

定义一个结构体,结构体中包括进程名、已运行时间、剩余时间、要求服务时间、状态。用于下面的程序设计。

void create()

创建函数,定义pcb类型的指针,用于创建队列时使用。利用for循环依次输入每个进程的名字和要求服务时间。

void display()

显示函数用于控制显示当前进程的运行状态,利用if while循环来控制程序的运行。

void display1()

建立进程显示函数,用于显示当前进程

void display2(PCB *q)

轮转法的输出,用于显示就绪进程信息

void insert(PCB *q)

插入进程,用于将一个时间片运行结束的进程插入到就绪进程的队尾

void main()

主函数,在此函数下调用各个函数的合法运行

void printready()

如果没有就绪队列,则显示运行完毕。

void priority(int T)

如果有进程就绪的话,将处理机分配给该进程让它执行,使用if else 控制程序的具体执行。

3 运行环境

VC++6.0

4 开发工具和编程语言

VC++6.0开发环境 C语言编程

5 详细设计

定义结构体

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

typedef struct node

{

char pname[10]; //进程名

int rtime; //已运行时间

int sytime; //剩余时间

int ntime; //要求服务时间

char state; //状态

struct node *next;

}PCB

PCB *finish,*ready,*run;

int N;

探测就绪队列是否为空

void printready()

{

if(ready==NULL)

printf("\n就绪队列为空!\n");

}

建立进程显示函数,用于显示当前进程;

void display1() /*建立进程显示函数,用于显示当前进程*/

{

printf("\n进程名已运行时间剩余时间要求服务时间状态\n");

}

显示进程信息

void display2(PCB *q) /*轮转法的输出*/

{

printf("%3s%10d%12d%10d%10c\n",q->pname,q->rtime,q->sytime,q->ntime ,q->state);

}

总的显示函数,在此框架下调用其它子显示函数

void display()

{

PCB *p;

if(run!=NULL)

{

printf("\n*-----------------------------------------------------------*");

printf("\n **** 当前正在运行的进程是%s,它的状态如下:\n",run->pname); /*显示当前运行进程*/

display1();

display2(run);

}

p=ready;

if(p!=NULL)

printf("\n ****当前就绪队列中进程的状态如下:\n"); /*显示就绪队列状态*/

while(p!=NULL)

{

display2(p);

p=p->next;

}

p=finish;

printready();

}

插入函数

void insert(PCB *q)

{

PCB *p1,*s,*r;

s=q;

p1=ready;

r=p1;

while(p1!=NULL)

{

r=p1;

p1=p1->next;

}

if(r!=p1)

{

r->next=s;

s->next=p1;

}

else

{

s->next=p1;

ready=s;

}

}

创建函数用于创建队列

void create()

{

PCB *p;

int i,time;

ready=NULL;

finish=NULL;

run=NULL;

for(i=1;i<=N;i++)

{

p=new PCB;

printf("\n请逐个输入第%d的进程名及进程要求运行的时间:",i); scanf("%s",p->pname);

scanf("%d",&time);

p->rtime=0;

p->sytime=time;

p->ntime=time;

p->state='w';

if(ready!=NULL)

insert(p);

else

{

p->next=ready;

ready=p;

}

}

printready();

printf("\n开始运行............");

run=ready;

ready=ready->next;

run->state='R';

display();

}

探测到有就绪队列时,选择一个将处理机分配给它

void priority(int T)

{

while(run!=NULL)

{

run->rtime=run->rtime+T;

run->sytime=run->sytime-T;

if(run->sytime<=0)

{

run->sytime=0;

run->next=finish;

finish=run;

printf("\n 进程 [%s] 已完成.\n",run->pname);

run=NULL;

if(ready!=NULL)

{

run=ready;

run->state='R';

ready=ready->next;

}

}

else

if(ready!=NULL)

{

run->state='W';

insert(run);

run=ready;

run->state='R';

ready=ready->next;

}

display();

}

}

主函数

void main()

{

int T;

printf("*----------------------------------------------------------*\n");

printf("|*******************时间片轮转调度算法模拟*****************|\n");

printf("*----------------------------------------------------------*\n

");

printf("\n请输入进程的个数:");

scanf("%d",&N);

printf("\n请输入轮转时间片周期T:");

scanf("%d",&T);

create();

printf("\n............................>>>>>>河南工业大学信息学院刘帅阳 :");

priority(T);

printf("\n 进程已经完成.\n");

printf("\n............................>>>>>>河南工业大学信息学院刘帅阳 :");

}

6 调试分析

typedef struct node

{

char pname[10]; //进程名

int rtime; //已运行时间

int sytime; //剩余时间

int ntime; //要求服务时间

char state; //状态

struct node *next;

}PCB;

定义一个结构体,结构体中包括进程名、已运行时间、剩余时间、要求服务时间、状态。里面的信息有点少,可以考虑添加一些信息,或者使用其他的方法实现该部分

void create()

创建函数,定义pcb类型的指针,用于创建队列时使用。利用for循环依次输入每个进程的名字和要求服务时间。考虑一下使用do while循环是否可以?有没有更好的算法?

void display()

显示函数用于控制显示当前进程的运行状态,可以使用其他循环控制方式,可以不要子显示函数,直接在该函数里面趋势线显示当前进程信息和就绪进程信息。void insert(PCB *q)

插入进程,用于将一个时间片运行结束的进程插入到就绪进程的队尾

void main()

主函数,在此函数下调用各个函数的合法运行

void printready()

如果没有就绪队列,则显示运行完毕。

void priority

如果有进程就绪的话,将处理机分配给该进程让它执行,使用if else 控制程序的具体执行。

7 测试结果

选择进程个数:3

选择时间片大小:1

进程名要求运行时间进程1: pcb0 2

进程2: pcb1 1

进程3: pcb2 3

参考文献:

C程序设计(第三版)谭浩强清华大学出版社数据结构(C语言板)严蔚敏清华大学出版社计算机操作系统教程实验指导张尧学史美林清华大学出版社操作系统原理实用教程任满杰等电子工业出版社操作系统程序设计罗宇等机械工业出版社计算机操作系统汤子瀛西安电大出版社

心得体会

程序应该更加短小精悍,应该懂得甚至是精通使用各种语言来编写同样的程序,使程序使用的内存最小,运行时间最少,各种开销最少。并且,程序也更加应该注重实用性,不应该仅仅把它作为一个作业来完成,而是把它作为一个将要推广的项目来制作。

有人说过,企业就是我的儿子。这句话就是说他真心的去关注爱护他的企业了,所以我也要说,把你自己的成果当成你自己的儿子一样去看待,这样你必定会制作出来完美的程序

在这个程序中,这只不过是一个简单的小模拟程序,并没有太大的难度。在这门专业之外,更应该去发掘、去探索更美妙的东西。

程序里面显示的信息还不是很多,要是可以看到他的实际运行效果就更好了,用程序代码做一个动态的东西,能够更加逼真的去向大家演示单处理机在使用时间片轮转法时的运行模拟过程。

以后我会更加努力,努力去学习其他的专业知识,为以后找个好工作有个好出路而努力。

模拟一种处理机调度算法讲解

课程设计报告 设计名称:模拟实现一种处理机调度算法 学生姓名: xxx 专业:计算机科学与技术 班别: xxxxxxxx 学号: xxxxxx 指导老师: xxxxx 日期: 2014 年 6 月 20 日

初始条件: 1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.模拟进程调度,能够处理以下的情形: ⑴能够选择不同的调度算法(要求中给出的调度算法); ⑵能够输入进程的基本信息,如进程名、优先级、到达 时间和运行时间等; ⑶根据选择的调度算法显示进程调度队列; ⑷根据选择的调度算法计算平均周转时间和平均带权周 转时间。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出 色; ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中 的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方 法); 进程调度模拟设计——先来先服务、优先级法1、背景: 当计算机系统是多道程序设计系统时,通常会有多个进程或线程同时竞争CPU。只要有两个或更多的进程处于就绪状态,这种情形就会发生。如果只有一个CPU可用,那么就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法成为调度算法。 进程调度的核心问题是采用什么样的算法把处理机分配给进程,好的算法将提高资源利用率,减少处理机的空闲时间,避免有些作业长期得不到相应的情况发生等,从而设计出受欢迎的操作系统。较常见的几种进程调度算法有:先来先服务调度算法;短作业优先调度算法;时间片轮转调度算法;优先级调度算法;高响应比优先算法和多级反馈队列调度算法等。 2.1设计目的 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机

短作业优先调度和时间片轮转调度算法

短作业优先调度和时间 片轮转调度算法 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

电子科技大学 实验报告 学生姓名:胡钟文学号:指导教师:罗惠琼 一、实验室名称:主楼A2-412 二、实验项目名称:进程调度算法的设计 三、实验原理: 短作业(进程)优先调度算法:短作业调度算法是从后备队列中选择一个或者若干个估计运行时间最短的作业,将他们调入内存运行。而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或者发生某事件而被阻塞放弃处理机时再重新调度。 时间片轮转法:系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的队尾;然后,再把处理机分配给就绪队列中的新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一个给定的时间内均能获得一时间片的处理机执行时间。 四、实验目的: 通过对进程调度算法的设计,深入理解进程调度的原理 五、实验内容: 1.编写程序实现SJ(P)F算法

2.编写程序实现RR算法 六、实验器材(设备、元器件): 装有VC++的PC机一台 七、实验步骤: 1.打开VC,设计编写程序的源代码 2.编译运行程序的源代码 3.分析检验程序的结果是否正确 4.总结实验结果及结论 短进程优先调度源代码: #include "" struct sjf{ char name[10]; float arrivetime; float servicetime; float starttime; float finishtime; float zztime; float dqzztime; }; sjf a[100]; void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) {int k; printf("run order:"); printf("%s",p[0].name); for(k=1;k%s",p[k].name);

操作系统实验一处理机调度算法的实现

实验报告 学院(系)名称:计算机与通信工程学院 姓名学号专业计算机科学与技术班级2009级3班实验项目实验一:处理机调度算法的实现 课程名称操作系统课程代码0668036 实验时间2011 年11月17日第3、4节 2011 年11月21日第7、8节 2011 年11月24日第3、4节 实验地点软件实验室7-216 批改意见成绩 教师签字: 实验内容: 1.设定系统中有五个进程,每一个进程用一个进程控制块表示。 2.输入每个进程的“优先数”和“要求运行时间”。 3.为了调度方便,将五个进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程,用指针指出队列的连接情况。 4.处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。 5.若某进程运行时间为零,则将其状态置为“结束”,且退出队列。 6.运行所设计程序,显示或打印逐次被选中进程的进程名,以及进程控制块的动态变化过程。 实验要求: 1.详细描述实验设计思想、程序结构及各模块设计思路; 2.详细描述程序所用数据结构及算法; 3.明确给出测试用例和实验结果; 4.为增加程序可读性,在程序中进行适当注释说明; 5.认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 6.实验报告撰写要求结构清晰、描述准确逻辑性强; 7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 程序运行代码如下: #include #include #include struct PCB{//定义进程控制块PCB,包括进程的名字,优先运行数,运行时间char name[20]; int pri; int time; struct PCB * next; }*k; struct LinkQueue{//链式队列节点类型定义 PCB * front; PCB * rear; }; LinkQueue InitQueue(){//链式队列初始化 LinkQueue Q; PCB * p; p=(PCB*)malloc(sizeof(PCB));//申请头结点存储空间 if(p){ Q.front=Q.rear=p; Q.front->next=NULL;//头结点指针域置空 return Q; }else{ printf("初始化队列失败,程序运行终止!\n");//初始化失败 exit(0); } } LinkQueue sort(LinkQueue Q,PCB * p){//定义将进程按给定的优先数从大到小连成就绪队列的函数 PCB *temp1; PCB *temp2; if(Q.rear==Q.front){ Q.front->next=p; Q.rear=p; }else{ temp1=Q.front; temp2=temp1->next; while(temp2->pri>=p->pri && temp2->next!=NULL){ temp1=temp2; temp2=temp1->next; }if(temp2->next==NULL && temp2->pri>=p->pri){ temp2->next=p; Q.rear=p;

操作系统处理器调度算法C++程序

一、先来先服务算法 1.程序简介 先来先服务算法按照作业进入系统后备作业队列的先后次序挑选作业,先进入系统的作业将优先被挑选进入主存,创建用户进程,分配所需资源,然后,移入就绪队列.这是一种非剥夺式调度算法,易于实现,但效率不高.只顾及作业的等候时间,未考虑作业要求服务时间的长短,不利于短作业而优待长作业,不利于I/O繁忙型作业而有利于CPU繁忙型作业.有时为了等待场作业执行结束,短作业的周转时间和带全周转时间将变得很大,从而若干作业的平均周转时间和平均带权周转时间也变得很大。 2.分析 1.先定义一个数组代表各作业运行的时间,再定义一个数组代表各作业到达系统的时间,注意到达系统的时间以第一个作业为0基础(注意:若各程序都同时到达系统,则到达系统时间都为0)。 2.输入作业数。 3.然后运用循环结构累积作业周转时间和带权周转时间。 4.最后,作业周转时间和带权周转时间分别除以作业数即可得到平均作业周转时间和平均带权周转时间。 3.详细设计 源程序如下: #include #include using namespace std; int main() { int n,a[100],b[100]; double s[100],m[100],T=0,W=0; cout<<"请输入作业数:"<>n; cout<<"请分别输入各作业到达系统的时间:"<>b[i]; } cout<<"请分别输入各作业所运行的时间:"<>a[i];s[0]=0; s[i+1]=s[i]+a[i]; m[i+1]=(s[i+1]-b[i])/a[i]; T=T+s[i+1]-b[i]; W=W+m[i+1]; }

时间片轮转调度算法资料

《操作系统》课程实验报告实验名称:时间片轮转调度算法 班级:**************** 学号:************* 姓名:************** 指导老师:*************** 成绩:

一、实验目的: 1、测试数据可以随即输入或从文件中读入。 2、必须要考虑到进程的到达时间 3、最终能够计算每一个进程的周转时间的带权周转时间。 4、时间片大小可以不为1,但至少实现时间片大小为1的RR调度。 二、实验内容: 模拟实现时间片轮转调度算法,具体如下: 设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W——等待,R ——运行,F——完成),进程间的链接指针 进程初始化:由用户输入进程名、服务时间进行初始化,同时,初始化进程的状态为W。 显示函数:在进程调度前、调度中和调度后进行显示。 排序函数:对就绪状态的进程按照进入就绪队列的时间排序,新到达的进行应优先于刚刚执行过的进程进入就绪队列的队尾。 调度函数:每次从就绪队列队首调度优一个进程执行,状态变化。并在执行一个时间片后化,服务时间变化,状态变化。当服务时间为0时,状态 变为F。 删除函数:撤销状态为F的进行。 三、实验代码 #include #include #include typedefstruct PCB2 { char name[10];//进程名 int runtime;//要求运行时间 intfrist;//定义优先数 char zhuangtai; //定义状态,R为就绪,F为完成 }; structshijian {//定义时间片的结构体 char name; //定义进程名 intdaodatime;// 到达时间 intfuwutime; //服务时间 intshengyutime;//剩余时间 char *state;//所处状态 structshijian *next; }; structshijian *time() { inta,i;

处理器调度(设计一个按时间片轮转法实现处理器调度的程序)

实验一处理器调度 一、实验容 选择一个调度算法,实现处理器调度。 二、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。 三、实验题目 设计一个按时间片轮转法实现处理器调度的程序。 [提示]: (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的 格式为: 其中,Q1,Q2,Q3,Q4,Q5。 指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址最后一个进程的指针指出第一个进程的进程控制块首地址。 要求运行时间——假设进程需要运行的单位时间数。 已运行时间——假设进程已经运行的单位时间数,初始值为“0”。 状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。 当一个进程运行结束后,它的状态为“结束”,用“E”表示。 (2) 每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。 (3) 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有: 标志单元 K1 K2 K 3 K4 K5

(4)处理器调度总是选择标志单元指示的进程运行。由于本实习是模拟处理器调度的 功能,所以,对被选中的进程并不实际的启动运行,而是执行: 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请同学注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已 经运行满一个时间片。 (5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一 个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间 已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前 面一个进程的指针位置。 (6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有 的进程都成为“结束”状态。 (7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及 运行一次后进程队列的变化。 (8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示 或打印逐次被选中的进程名以及进程控制块的动态变化过程。 四. 所用数据结构及符号说明 typedef struct PNode//PCB { struct PNode *next; //定义指向下一个节点的指针 char name[10]; //定义进程名,并分配空间 int All_time; //定义总运行时间 int Runed_Time; //定义已运行时间 char state; //定义进程状态Ready/End } *Proc; //指向该PCB的指针 int ProcNum; //总进程数

操作系统时间片轮转法调度

时间片轮转法模拟进程调度 一、基本原理 在时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,中断请求,将该程序送往就绪队列的队尾,并把处理机分配给新的队首进程,同时让它也执行一个时间片。这样就保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。 二、设计思路 首先,创建进程3-5,置低优先级,并依次插入低优先级队列,每次调度时,把处理器分配给队首进程,并给其一个随机数作为时间片的大小,当随机数小于300时令其等待,插入等待队列。当随机数大于300时,进程执行,并令其执行五个时间片。时间片耗尽时由一个计时器发出时钟中断请求,该进程转为低优先级就绪状态,插入到低优先级就绪队列的队尾,并将处理器分配给下一个进程。当高优先级队列和低优先级队列都为空时,则循环执行进程唤醒,执行等待队列里的进程。 三、运行结果(不唯一) 在运行结果中,按进程插入就绪队列的先后顺序进行调度,进程3先运行,其时间片耗尽后让其插入低优先级就绪队列的队尾,然后进程4开始运行,时间片耗尽后进程5开始运行,在进程5运行完第四个时间片后,分配给它的第五个时间片大小小于300,所以进程5

等待,插入等待队列。继续调度进程3,直到就绪队列里的进程都由于时间片大小小于300被插入等待队列后,开始唤醒进程5,并将其插入高优先级就绪队列,分配两个时间片,如此循环。

三、源代码: #include #include #include /*********************以下是全局数据结构和变量***********************/ /*PCB 结构*/ struct PCB{ int pname; int pri; int runtime; int waittime; struct PCB *next; }pcb[7]; /* 运行指针*/ struct PCB *running; /*高优先级就绪队列头指针*/ struct PCB *Hready; /*低优先级队列头指针*/ struct PCB *Lready; /*等待队列头指针*/ struct PCB*wait; int A=0; /**************************以下是函数说明****************************/ /*利用循环实现延迟*/ void delay(); /*模拟进程3-9*/ void proc(struct PCB *running); /*将node插入到head所指示的队列的尾部*/ void InsertIntoQueueTail(struct PCB **head,struct PCB *node); /*进程调度函数*/

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

第四章处理机调度 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.在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则

处理器调度习题教学内容

处理器调度习题

处理器调度 选择题 ?当CPU执行操作系统代码时,则处理机处于( )。 ?A.执行态 B.目态 C.管态 D.就绪态 ?( )是机器指令的扩充,是硬件的首次延伸,是加在硬件上的第一层软件。 ?A.系统调用 B.操作系统 C.内核 D.特权指令 ?操作系统提供给程序员的接口是( )。 ?A.进程 B.系统调用 C.库函数 D.B和C ?用户程序向系统提出使用外设的请求方式是( )。 ?A.作业申请 B.原语 C.系统调用 D.I/O指令 ?当作业正常完成进入完成状态时,操作系统( )。 ?A.将输出该作业的结果并删除内存中的作业 ?B.将收回该作业的所占资源并输出结果 ?C.将收回该作业的所占资源及输出结果,并删除该作业 ?D.将收回该作业的所占资源及输出结果,并将它的控制块从当前的队列中删除 ?下列选项是关于作业和进程关系的描述,其中哪一个是不正确的( )。 ?A.作业的概念主要用在批处理系统中,而进程的概念则用在几乎所有的OS中。 ?B.作业是比进程低一级的概念。 ?C.一个作业至少由一个进程组成。 ?D.作业是用户向计算机提交任务的实体,而进程是完成用户任务的执行实体以及向系统申请分配资源的基本单位。 ?作业从后备作业到被调度程序选中的时间称为( )。 ?周转时间B.响应时间C.等待调度时间D.运行时间 ?设有三个作业J1,J2,J3,它们同时到达,运行时间分别为T1,T2,T3,且T1≤T2≤T3,若它们在一台处理机上按单道运行,采用短作业优先算法,则平均周转时间为( )。 ?A.T1+T2+T3 B.1/3(T1+T2+T3) ?C.T1+2/3T2+1/3T3 D.T1+1/3T2+2/3T3 ?从作业提交给系统到作业完成的时间间隔称为作业的( )。 ?A.中断时间 B.等待时间 C.周转时间 D.响应时间 ?设有四个作业同时到达,每个作业执行时间均为2 h,它们在一台处理机上按单道方式运行,则平均周转时间为( )。 ?A.1 h B.5 h C.2.5 h D.8 h ?FCFS调度算法有利于( )。 ?A.长作业和CPU繁忙型作业 B.长作业和I/O繁忙型作业 ?C.短作业和CPU繁忙型作业 D.短作业和I/O繁忙型作业 ?下列哪种说法不是SJ(P)F调度算法的缺点( )。 ?A.对于长作业(进程)不利 ?B.未考虑作业(进程)的紧迫程度 ?C.不能有效降低作业(进程)的平均等待时间 ?D.由于根据的是用户提供的估计执行时间,因此不一定真正做到短而优先。 ?选择排队进程中等待时间最长的进程被优先调度,该调度算法是( )。 ?A.先来先服务调度算法B.短进程优先调度算法 ?C.优先权调度算法D.高响应比优先调度算法 ?在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则此时的优先权调度算法实际上和( )相同。 ?A.先来先服务调度算法B.短进程优先调度算法

时间片轮转调度算法

#include #include #include #include /*进程控制块数据结构*/ typedef struct node { char name[10];/*进程名*/ int prio; /*进程优先级*/ int round; /*循环轮转法进程每次轮转的时间片*/ int cputime; /*进程累计消耗的CUP时间*/ int needtime; /*进程到完成还需要的CUP时间*/ int count; /*循环轮转法一个时间片内进程运行时间*/ char state; /*进程的状态:'R':运行,'W':等待,'F':结束*/ struct node *next;/*指向下一个进程的链指针*/ }PCB; PCB *finish,*ready,*tail,*run;/*指向三个队列的队首的指针, finish为完成队列头指针, ready为就绪队列头指针, tail为就绪队列的队尾指针, run为当前运行进程头指针*/ int N;/*定义进程的数目*/ void firstin(void); //调度就绪队列的第一个进程投入运行; void print1(char a); //打印表头行信息 void print2(char chose,PCB *p); //打印每一行的状态信息 void print(char chose); //打印每执行一次算法后所有的进程的状态信息 void insert_prio(PCB *q); //在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中; void prior_init(char chose); //进程优先级法初始化将进程按优先级插入到就绪队列里 void priority(char chose); //进程优先级算法总函数 void insert_rr(PCB *q); //在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾; void roundrun_init(char chose); //循环轮转法初始化将就绪队列保存为FIFO队列 void roundrun(char chose); //循环轮转法总算法 void main()//主函数 {

实验一___处理器调度(设计一个按时间片轮转法实现处理器调度的程序)

实验一处理器调度 一、实验内容 选择一个调度算法,实现处理器调度。 二、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。 三、实验题目 第二题:设计一个按时间片轮转法实现处理器调度的程序。 [提示]: (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的 格式为: 其中,Q1,Q2,Q3,Q4,Q5。 指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址最后一个进程的指针指出第一个进程的进程控制块首地址。 要求运行时间——假设进程需要运行的单位时间数。 已运行时间——假设进程已经运行的单位时间数,初始值为“0”。 状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。 当一个进程运行结束后,它的状态为“结束”,用“E”表示。 (2) 每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。 (3) 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有: 标志单元 K1 K2 K 3 K4 K5 (4)处理器调度总是选择标志单元指示的进程运行。由于本实习是模拟处理器调度的 功能,所以,对被选中的进程并不实际的启动运行,而是执行: 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请同学注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已

操作系统-课程设计报告-处理机调度程序

: 操作系统 课程设计报告 @ 学校:广州大学 学院:计算机科学与教育软件学院 班级:计算机127班 课题:处理机调度程序 任课老师:陶文正、陈文彬 姓名:黄俊鹏 { 学号:11

班内序号:27 成绩: 日期:2015年1月6日 一、设计目的 在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。 二、设计要求 1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。2)可选择进程数量 3)本程序包括三种算法,用C语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。 三、设计思路及算法思想 1.· 2.界面菜单选项 一级菜单提供2个选项: ①自动生成进程数量 ②手动输入所需进程数量 一级菜单选择完毕后进入二级菜单: ①重新生成进程 ②时间片轮转法 《 ③短作业优先算法 ④动态优先级算法 ⑤退出程序 3.调度算法

程序所用PCB结构体 ! 需要用到的进程结构体如上图所示 1)时间片轮转法 主要是设置一个当前时间变量,curTime和时间片roundTime。 遍历进程组的时候,每运行一个进程,就把curTime += roundTime。进程已运行时间加roundTime 2)短作业优先算法 遍历进程组,找到未运行完成并且运行时间最短的进程,让它一次运行完成,如此往复,直到所有进程都运行完成为止。 3)— 4)动态优先级算法 做法跟短作业优先算法类似,此处主要是比较进程的优先数,优先级高者,先执行。直到全部执行完毕。当一个进程运行完毕后,适当增减其余进程的优先数,以达到动态调成优先级的效果。 4.程序流程图

时间片轮转进程调度模拟算法的实现

武汉理工大学华夏学院课程设计报告书 课程名称:操作系统原理 题目:时间片轮转进程调度模拟算法的实现系名:信息工程系 专业班级:计算机1132班 姓名:李杰 学号: 10210413209 指导教师: 司晓梅 2015年 6 月 26日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:操作系统原理课程设计指导教师:司晓梅 班级名称:计算机1131-2 开课系、教研室:自动化与计算机 一、课程设计目的与任务 操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练, 加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、 Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题 和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。 学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。 二、课程设计的内容与基本要求 1、课程设计题目 时间片轮转进程调度模拟算法的实现 2、课程设计内容 用c/c++语言实现时间片轮转的进程调度模拟算法。要求: 1.至少要有5个以上进程 2.进程被调度占有CPU后,打印出该进程正在运行的相关信息 提示: 时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。在使用完一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。 1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加1就可以了。 2)为进程设计出PCB结构。PCB结构所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息等。 3、设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)

采用时间片轮转算法调度程序

采用时间片轮转算法调度程序 学号: 姓名: 专业: 指导教师: 日期: 目录 一、需求分析 (3)

1、设计要求: (3) 2、解决方案: (3) 二、课程设计简介 (4) 1、课程设计题目 (4) 2、课程设计目的 (4) 3、课程设计内容 (4) 4、时间安排 (4) 三、概要设计 (4) 1、基本原理 (4) 2、算法思想设计 (5) 3、数据结构及模块说明: (5) 四、主要函数及其说明 (6) 五、调试分析 (7) 1、调试过程及步骤 (7) 2、结果分析(以三个进程数为例) (8) 六、总结及参考文献 (9) 1、总结: (9) 2、参考文献 (9) 附录:程序源代码 (9)

一、需求分析 1、设计要求: 在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。为了使系统中各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。要求用时间片轮转算法模拟单处理机调度,以巩固和加深处理机调度的概念。 2、解决方案: (1)、假设系统有5个进程,每个进程用一个进程控制块PCB来表示。PCB包括:进程名、链接指针、到达时间、估计运行时间和进程状态。其中,进程名即进程标识。链接指针指出下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。估计运行时间:可由设计者任意指定一个时间值。到达时间:进程创建时的系统时间或由用户指定,调度时,总是选择到达时间最早的进程。进程状态:为简单起见,假定进程有三种状态,就绪、等待和完成,并假定进程一创建就处于就绪状态,用R表示,当一个进程运行结束时,就将其置成完成状态,用F表示。当一个进程未运行完成并且时间片不足时,就将其置成等待状态,用W表示。 (2)、为每个进程任意确定一个要求运行时间和到达时间。 (3)、按照进程到达的先后顺序排成一个循环队列。再设一队首指针指向第一个到达进程的首址。 (4)、执行处理机调度时,开始选择队首的第一个进程运行。另外再设一个当前运行进程的指针,指向当前正运行进程。 (5)、由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行: a)、估计运行时间减时间片长度; b)、输出当前运行进程的名字。用这两个操作来模拟进程的一次运行(即一个时间片)。 (6)、进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成状态F,并退出循环队列插入完成队列。 (7)、若就绪队列不空,则重复上述(5)和(6)步骤直到所有进程都运行完为止。 (8)、在所有设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

时间片轮转调度算法实验报告

xx大学操作系统实验报告 姓名:学号:班级: 实验日期: 实验名称:时间片轮转RR进程调度算法 实验二时间片轮转RR进程调度算法 1.实验目的:通过这次实验,理解时间片轮转RR进程调度算法的运行原理,进一步 掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。 2.需求分析 (1) 输入的形式和输入值的范围; 输入:进程个数n 范围:0

(4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。正确输入: 错误输入:

2、概要设计 所有抽象数据类型的定义: static int MaxNum=100 int ArrivalTime //到达时间 int ServiceTime //服务时间 int FinishedTime //结束时间 int WholeTime //周转时间 double WeightWholeTime //带权周转时间double AverageWT //平均周转时间double AverageWWT //平均带权周转时间主程序的流程: 变量初始化

时间片轮转算法和优先级调度算法 C语言模拟实现

一、目得与要求?进程调度就是处理机管理得核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会与了解优先数算法与时间片轮转算法得具体实施办法。 二、实验内容 1、设计进程控制块PCB得结构,通常应包括如下信息: 进程名、进程优先数(或轮转时间片数)、进程已占用得CPU时间、进程到完成还需要得时间、进程得状态、当前队列指针等。 2、编写两种调度算法程序: 优先数调度算法程序?循环轮转调度算法程序 3、按要求输出结果。?三、提示与说明 分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)与完成状态(FINISH),并假定初始状态为就绪状态。?(一)进程控制块结构如下:?NAME——进程标示符PRIO/ROUND——进程优先数/进程每次轮转得时间片数(设为常数2)? CPUTIME——进程累计占用CPU得时间片数? NEEDTIME——进程到完成还需要得时间片数 STATE——进程状态?NEXT——链指针?注: 1、为了便于处理,程序中进程得得运行时间以时间片为单位进行计算; 2、各进程得优先数或轮转时间片数,以及进程运行时间片数得初值,均由用户在程序运行时给定。?(二)进程得就绪态与等待态均为链表结构,共有四个指针如下:? RUN——当前运行进程指针 READY——就需队列头指针 TAIL——就需队列尾指针 FINISH——完成队列头指针 1、在优先数算法中,进程优先数得初值设为: (三)程序说明? 50-NEEDTIME?每执行一次,优先数减1,CPU时间片数加1,进程还需要得时间片数减1。 在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CP

按优先数调度算法实现处理机调度C++程序代码

#include using namespace std; struct PCB { char Name; //进程名 float Time; //要求运行时间 int Level; //优先数 bool state; //状态,1表就绪 PCB *next; //指针 }; void Init(PCB *head) { int num; PCB *s,*p; cout<<"请输入进程数"; cin>>num; for(int i=0;i >s->Name>>s->Time>>s->Level; if(s->Time>0) { s->state =1; while(p->next) { if(s->Level >p->next->Level )break; p=p->next ; } s->next=p->next; p->next=s; } else { s->state =0; cout<<"此进程要求运行时间时间不符合要求,不添加入进程列表"; } } } int Run(PCB *head) {

PCB *cur,*p; p=head; cur=p->next; p->next =cur->next; cur->Level--; cur->Time--; cout<<"此次执行的进程信息(执行后):进程名"; cout<Name<<"剩余时间"<Time<<"优先数"<Level; if(cur->Time<=0) { cout<<"状态为完成态"<next) { if(cur->Level >p->next->Level )break; p=p->next ; } cur->next=p->next; p->next=cur; } cout<<"此次执行后的进程列表序列为:"; p=head; while(p->next) { cout<next->Name<<" "; p=p->next ; } cout<

基于时间片轮转法调度算法模拟

操作系统课程设计报告课程设计题目:基于时间片轮转法调度算法模拟 姓名: 学号: 专业:计算机科学与技术 班级: 指导教师:小辉 2013 年1月11日

目录 一.课程设计目的与内容 (1) 二.任务分析 (2) 三.概要分析 (3) 四.详细设计 (4) 五.运行结果 (6) 六.总结 (7) 七.附录 (8) 八.评分表 (11)

一.课程设计目的与内容 1.课程设计目的 (1)在单处理器情况下按时间片轮转算法实现处理器调度,输出运行动态变化过程。 (2)通过算法的实现加深了解处理器调度的工作。 2.课程设计内容 输入实现处理器调度的几个进程信息,任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示逐次被选中进程的进程名以及进程控制块的动态变化过程。 二、任务分析 时间片轮转的主要思想就是按顺序为每一个进程一次只分配一个时间片的时间。算法要完成的功能就是将各个进程按照时间片轮转运行的动态过程显示出来。时间片轮转算法的主要实现过程是首先为每一个进程创建一个进程控制块,定义数据结构,说明进程控制块所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息。实现的过程即运用指针指向某一个进程,判断当前的进程是否是就绪状态“r”,如果是,则为该进程分配一个时间片,同时,已运行时间加一且要求运行的时间减一,如此循环执行,当某一个进程的所需要运行的时间减少至0时,则将该进程的状态设置为“e”。然后,将指针指向下一个未运行完成的进程,重复判断,直至所有的进程都运行结束。

三、概要设计 (1)所用数据结构及符号说明 #include"stdio.h" #include"conio.h" #include"malloc.h" #include"string.h" #define NULL 0 typedef struct PCB{ char name[10]; //进程名 struct PCB *next; //链指针 int need_time; //要求运行时间 int worked_time; //已运行时间 char condition; //进程状态,只有“就绪”和“结束”两种状态int flag; //进程结束标志 }PCB; PCB *front,*rear; int N; //N为进程数

相关主题
文本预览
相关文档 最新文档