进程调度文档格式.docx

上传人:b****3 文档编号:7721423 上传时间:2023-05-09 格式:DOCX 页数:17 大小:202.17KB
下载 相关 举报
进程调度文档格式.docx_第1页
第1页 / 共17页
进程调度文档格式.docx_第2页
第2页 / 共17页
进程调度文档格式.docx_第3页
第3页 / 共17页
进程调度文档格式.docx_第4页
第4页 / 共17页
进程调度文档格式.docx_第5页
第5页 / 共17页
进程调度文档格式.docx_第6页
第6页 / 共17页
进程调度文档格式.docx_第7页
第7页 / 共17页
进程调度文档格式.docx_第8页
第8页 / 共17页
进程调度文档格式.docx_第9页
第9页 / 共17页
进程调度文档格式.docx_第10页
第10页 / 共17页
进程调度文档格式.docx_第11页
第11页 / 共17页
进程调度文档格式.docx_第12页
第12页 / 共17页
进程调度文档格式.docx_第13页
第13页 / 共17页
进程调度文档格式.docx_第14页
第14页 / 共17页
进程调度文档格式.docx_第15页
第15页 / 共17页
进程调度文档格式.docx_第16页
第16页 / 共17页
进程调度文档格式.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

进程调度文档格式.docx

《进程调度文档格式.docx》由会员分享,可在线阅读,更多相关《进程调度文档格式.docx(17页珍藏版)》请在冰点文库上搜索。

进程调度文档格式.docx

●总结

●参考文献

正文:

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.网络资源;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2