进程调度文档格式.docx
《进程调度文档格式.docx》由会员分享,可在线阅读,更多相关《进程调度文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
●总结
●参考文献
正文:
1.实践内容:
在多道程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。
这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。
一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同的进程队列。
于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。
进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。
进程调度的算法有多种,常用的有先来先服务算法、时间片轮转算法。
采用先来先服务及时间片轮转算法进行进程调度,编程模拟。
2.实践目的:
·
要求设计并实现模拟进程调度的算法:
时间片轮转及先来先服务。
理解进程控制块的结构。
理解进程运行的并发性。
掌握进程调度算法。
3.功能设计:
1)数据结构:
classPCB
{
stringProcessName;
//进程名字
intTime;
//进程需要时间
intLeftTime;
//进程运行一段时间后还需要的时间
}
2)功能函数:
voidCopy(Processproc1,Processproc2);
//把proc2赋值给proc1
voidsort(Processpr[],intsize);
//此排序后按需要的cpu时间从小到大排列
voidFcfs(Processpr[],intnum);
//先来先服务算法
voidTimeTurn(Processprocess[],intnum,intTimepice);
//时间片轮转算法
源代码:
#include<
iostream>
string>
usingnamespacestd;
classPCB
{
public:
stringProcessName;
intTime;
intLeftTime;
};
voidCopy(PCBproc1,PCBproc2);
voidsort(PCBpr[],intsize);
//此排序后按需要的cpu时间从小到大排列
voidFcfs(PCBpr[],intnum);
voidTimeTurn(PCBprocess[],intnum,intTimepice);
//时间片轮转算法
voidmain()
{
inta;
cout<
<
endl;
"
选择调度算法:
1:
FCFS2:
时间片轮换"
cin>
>
a;
constintSize=30;
PCBprocess[Size];
intnum;
intTimePice;
输入进程个数:
num;
if(a==2)
cout<
输入此进程时间片大小:
"
cin>
TimePice;
for(inti=0;
i<
num;
i++)//输入进程信息
{
stringname;
intCpuTime;
输入第"
i+1<
个进程的名字、cpu时间:
name;
CpuTime;
process[i].ProcessName=name;
process[i].Time=CpuTime;
for(intk=0;
k<
k++)
process[k].LeftTime=process[k].Time;
//对进程剩余时间初始化
if(a==1)//FCFS调度
进程名"
CPU时间"
状态"
Fcfs(process,num);
elseif(a==2)//时间片轮转调度
剩余时间"
TimeTurn(process,num,TimePice);
}
voidCopy(PCBproc1,PCBproc2)
proc1.ProcessName=proc2.ProcessName;
proc1.Time=proc2.Time;
voidsort(PCBpr[],intsize)//以进程时间从低到高排序
{//直接插入排序
for(inti=1;
i<
size;
i++)
PCBtemp;
temp=pr[i];
intj=i;
while(j>
0&
&
temp.Time<
pr[j-1].Time)
{
pr[j]=pr[j-1];
j--;
}
pr[j]=temp;
}
/*先来先服务算法的实现*/
voidFcfs(PCBprocess[],intnum)
{//process[]是输入的进程,num是进程的数目
while(true)
if(num==0)
cout<
所有进程都已经执行完毕!
exit
(1);
if(process[0].LeftTime==0)//由于第一个进程总是在运行,所以每次都只判断process[0].LeftTime
进程"
process[0].ProcessName<
已经执行完毕!
for(inti=0;
process[i]=process[i+1];
num--;
elseif(process[num-1].LeftTime==0)
process[num-1].ProcessName<
elseif(process[0].LeftTime>
0)
//输出正在运行的进程
process[0].LeftTime=0;
process[0].ProcessName<
process[0].Time<
运行"
;
for(ints=1;
s<
s++)
{
cout<
process[s].ProcessName<
process[s].Time;
等待"
;
}
}//else
system("
pause"
);
}//while
/*时间片轮转调度算法实现*/
voidTimeTurn(PCBprocess[],intnum,intTimepice)
if(process[num-1].LeftTime==0)
<
process[num-1].ProcessName<
process[0].LeftTime=process[0].LeftTime-Timepice;
if(process[0].LeftTime<
=0)//当剩余时间小于零时,做零处理
process[0].LeftTime=0;
process[0].LeftTime;
process[s].LeftTime;
if(s==1)
cout<
就绪"
else
PCBtemp;
//中间变量
temp=process[0];
for(intj=0;
j<
j++)
process[j]=process[j+1];
process[num-1]=temp;
}//else
4.调试运行:
运行开始后出现如下界面:
按提示选择1/2;
●先选1,进行FCFS调度:
●若选2,进行时间片轮转调度:
5.存在的问题:
由于初次做操作系统模拟实验,所以程序设计中存在很多问题,例如定义好PCB后,各种指针的使用,使得程序甚是复杂,再加上队列指针,而且指针错误在调试的时候不提示错误,只是编好的程序看似没有错误,却在执行时出现异常而中断,由于使用指针使得程序庞大检查改正困难,无法发现隐藏的错误,只是程序无法进行下去。
最终本程序选择数组保存PCB信息,存储和调用都简单化。
改进之处:
学习指针,并且使用三个队列,就绪队列,运行队列,完成队列,使得进程调度模拟更加清晰。
还有一些简单的以解决的问题,不一一列举了。
6.实践心得体会:
通过这次实践学会了不少内容,更深的理解了进程调度的几种算法,而且学会了系统的编写程序,而不是只编写几个功能函数。
在编程过程中,需要查阅各种资料,并且学习前人的编写方法,找出优劣,然后形成自己的思想,最终完成程序的编写。
通过模拟进程调度的两种算法,懂得了各种算法在不同情况下的作用。
选择一个好的调度算法可以是计算机在执行庞大的作业时井井有条,并且使用时间很短。
在模拟过程中出现过好多问题,有的解决了,有的还未解决,不管如何都是一种收获,编写功能函数时总会出现参数调用错误的情况,通过分析解决了。
在指针指向的问题上,觉得很复杂,最终没有解决。
7.总结:
为期一周的操作系统实践课结束了,编写了包含有两种调度算法的进程调度模拟程序,两种程序各有优劣,FCFS调度算法是按照进程进入系统的时间先后被CPU选择创建的,这种算法易于实现,但效率不高,只顾及到进程的等候时间,没考虑要求服务的时间长短,相比SJF算法不利于较短的作业。
本程序的另一种调度算法是RR算法,它在调度是是为每个进程分配时间片,当时间片用完时,进程便排到队尾以便下次分配,这种调度策略可以防止那些很少使用设备的进程长时间占用处理器,导致要使用设备的那些进程没机会启动设备。
在编写程序的同时,还学习了进程调度的其他算法,明白了它们各自的优劣,懂得了计算机在调度进程时的取舍。
8.参考文献:
1.操作系统教程(第4版)…………孙钟秀主编高等教育出版社;
2.算法与数据结构-C语言描述(第2版)……张乃孝主编高等教育出版社;
3.网络资源;