进程调度_进程调度程序

2020-02-27 其他范文 下载本文

进程调度由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“进程调度程序”。

操作系统课程设计

进 程 调 度 实 践 报 告

姓名: 董宇超 班级:计算机一班 学号:0906010124

目录:

 实践内容  实践目的及意义  功能设计及数据结构  调试运行及测设分析  存在的问题及改进设想  实践体会  总结  参考文献

正文:

1.实践内容:

2.3.在多道程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同的进程队列。于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。进程调度的功能就是从就绪队列中挑选一个 进程到处理机上运行。进程调度的算法有多种,常用的有先来先服务算法、时间片轮转算法。

采用先来先服务及时间片轮转算法进行进程调度,编程模拟。实践目的:

·要求设计并实现模拟进程调度的算法:时间片轮转及先来先服务。·理解进程控制块的结构。·理解进程运行的并发性。·掌握进程调度算法。功能设计:

1)数据结构:

cla PCB {

string ProceName;// 进程名字

int Time;// 进程需要时间

int LeftTime;// 进程运行一段时间后还需要的时间

} 2)功能函数:

void Copy(Proce proc1, Proce proc2);// 把proc2赋值给proc1 void sort(Proce pr[], int size);// 此排序后按需要的cpu

时间从小到大排列

void Fcfs(Proce pr[], int num);// 先来先服务算法

void TimeTurn(Proce proce[], int num, int Timepice);// 时

间片轮转算法

源代码:

#include #include using namespace std;cla PCB { public:

};

void Copy(PCB proc1, PCB proc2);// 把proc2赋值给proc1 void sort(PCB pr[], int size);// 此排序后按需要的cpu时间从小到大排列 void Fcfs(PCB pr[], int num);// 先来先服务算法

void TimeTurn(PCB proce[], int num, int Timepice);// 时间片轮转算法

void main(){

int a;cout>a;const int Size =30;PCB

proce[Size];int num;int TimePice;

cout>num;if(a==2){

} for(int i=0;i

} for(int k=0;k

cout>name;cin>> CpuTime;proce[i].ProceName =name;proce[i].Time =CpuTime;cout>TimePice;string ProceName;// 进程名字 int Time;// 进程需要时间

int LeftTime;// 进程运行一段时间后还需要的时间

} {

} else if(a==2)//时间片轮转调度 {

} cout

状态“

num,TimePice);cout

CPU时间 ”

状态“

}

void sort(PCB pr[], int size)// 以进程时间从低到高排序 {// 直接插入排序

} /* 先来先服务算法的实现*/ void Fcfs(PCB proce[], int num){ // proce[] 是输入的进程,num是进程的数目

while(true){

if(num==0){

} if(proce[0].LeftTime==0)//由于第一个进程总是在运行,所以每次都只判断proce[0].LeftTime { cout

} PCB temp;temp = pr[i];int j=i;

while(j>0 && temp.Time

} pr[j] = temp;pr[j] = pr[j-1];j--;proc1.ProceName =proc2.ProceName;proc1.Time =proc2.Time;

}

} cout

} else if(proce[0].LeftTime > 0){

cout

运行“;cout

for(int s=1;s

} cout

等待“

} // while

/* 时间片轮转调度算法实现*/ void TimeTurn(PCB proce[], int num, int Timepice){

while(true){

if(num==0){

} if(proce[0].LeftTime==0)//由于第一个进程总是在运行,所以每次都只判断proce[0].LeftTime {

cout

}

} num--;if(proce[num-1].LeftTime ==0){

} else if(proce[0].LeftTime > 0){

cout

} PCB temp;//中间变量 temp = proce[0];for(int j=0;j

等待”

就绪“

proce[0].LeftTime=proce[0].LeftTime-Timepice;if(proce[0].LeftTime

运行“

for(int s=1;s

cout

} // while

4.调试运行:

运行开始后出现如下界面:

按提示选择1/2;

 先选1,进行FCFS调度:

 若选2,进行时间片轮转调度:

5.存在的问题:

由于初次做操作系统模拟实验,所以程序设计中存在很多问题,例如定义好PCB后,各种指针的使用,使得程序甚是复杂,再加上队列指针,而且指针错误在调试的时候不提示错误,只是编好的程序看似没有错误,却在执行时出现异常而中断,由于使用指针使得程序庞大检查改正困难,无法发现隐藏的错误,只是程序无法进行下去。

最终本程序选择数组保存PCB信息,存储和调用都简单化。

改进之处:学习指针,并且使用三个队列,就绪队列,运行队列,完成队列,使得进程调度模拟更加清晰。

还有一些简单的以解决的问题,不一一列举了。

6.实践心得体会:

通过这次实践学会了不少内容,更深的理解了进程调度的几种算法,而且学 会了系统的编写程序,而不是只编写几个功能函数。在编程过程中,需要 查阅各种资料,并且学习前人的编写方法,找出优劣,然后形成自己的思想,最终完成程序的编写。

通过模拟进程调度的两种算法,懂得了各种算法在不同情况下的作用。选择 一个好的调度算法可以是计算机在执行庞大的作业时井井有条,并且使用时 间很短。

在模拟过程中出现过好多问题,有的解决了,有的还未解决,不管如何都是 一种收获,编写功能函数时总会出现参数调用错误的情况,通过分析解决了。在指针指向的问题上,觉得很复杂,最终没有解决。

7.总结:

为期一周的操作系统实践课结束了,编写了包含有两种调度算法的进程 调度模拟程序,两种程序各有优劣,FCFS调度算法是按照进程进入系统的时 间先后被CPU选择创建的,这种算法易于实现,但效率不高,只顾及到进程 的等候时间,没考虑要求服务的时间长短,相比SJF算法不利于较短的作业。本程序的另一种调度算法是RR算法,它在调度是是为每个进程分配时间片,当时间片用完时,进程便排到队尾以便下次分配,这种调度策略可以防止那 些很少使用设备的进程长时间占用处理器,导致要使用设备的那些进程没机 会启动设备。

在编写程序的同时,还学习了进程调度的其他算法,明白了它们各自的优劣,懂得了计算机在调度进程时的取舍。

8.参考文献:

1.操作系统教程(第4版)…………孙钟秀 主编 高等教育出版社;

2.算法与数据结构-C语言描述(第2版)……张乃孝 主编 高等教育出版社; 3.网络资源;

《进程调度.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
进程调度
点击下载文档
相关专题 进程调度程序 进程 进程调度程序 进程
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文