进程调度_进程调度程序
进程调度由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“进程调度程序”。
操作系统课程设计
进 程 调 度 实 践 报 告
姓名: 董宇超 班级:计算机一班 学号: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.网络资源;