进程调度实验报告.docx
《进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度实验报告.docx(6页珍藏版)》请在冰豆网上搜索。
进程调度实验报告
进程调度实验报告
篇一:
实验一、进程调度实验报告
广东技术师范学院实验报告
计算机科学学计算机科学与
学院:
专业:
班级:
成绩:
院技术(师范)
姓名:
学号:
组别:
组员:
实验地点:
实验名称:
实验一、进程调度实验
一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解
二、实验类别
综合性实验。
综合高级语言编程、进程调度模型、进程调度算法及数据结构等多方面的知识
三、实验内容和步骤
1.编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。
例如:
在进程获得一次CPU
后就将其优先数减少1。
或者,进程等待的时间超过某一时限时增加其优先数的值,等等
该题根据老师给的代码用VisualC++运行,结果以及分析如下:
实验日期:
指导教师签名:
结果分析:
根据上述输入的三个进程的信息可以得到:
优先级最高的是进程cc最先调度进程cc的状态为运行态,需要执行的时间为10当前就绪队列状态为:
进程aa先级比较高,处于就绪队列前面,而进程bb先级是三者中最低的,所以处于就绪队列的最后。
而此时这两个进程的状态都为就绪态。
结果分析:
当进程cc了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程aa
按照这种方式一直运行下去:
直到:
结果分析:
当进程bb的CPU占用时间等于它需要的执行时间时,进程bb度完成。
则这时进程调度中还有两个进程:
进程aa进程
cc
结果分析:
当调度进程中只剩下进程aa程cc这时根据进程优先级的大小,进程aa入运行态。
当进程aa调度时,进程调度程序中直剩下进程cc这时进程cc进入运行态,而当前就绪队列将为空。
直到:
结果分析:
当进程i的CPU占用时间等于所需要的执行时间时,进程cc调度完成,则这时进程调度中已经没有需要调度的进程了,则整个进程调度完成。
2、编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。
简单轮转法的基本思想是:
所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。
如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。
直至所有的进程运行完毕。
将老师给的源程序修改成简单的时间片轮转法流程图如下:
篇二:
进程调度算法实验报告
操作系统实验报告
(二)
实验题目:
进程调度算法
实验环境:
C++
实验目的:
编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不
同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较
各种算法的性能优劣。
实验内容:
编程实现如下算法:
1.先来先服务算法;
2.短进程优先算法;
3.时间片轮转调度算法。
设计分析:
程序流程图:
1.先来先服务算法
2.短进程优先算法
3.时间片轮转调度算法
实验代码:
1.先来先服务算法
#include
#definen20
typedefstruct
{
intid;//进程名
intatime;//进程到达时间
intruntime;//进程运行时间
}fcs;
voidmain()
{
intamount,i,j,diao,huan;
fcsf[n];
cout cin>>amount;
for(i=0;i {
cout>f[i].id;
cin>>f[i].atime;
cin>>f[i].runtime;
}
for(i=0;i {//如果两个进程同时到达,按在屏幕先输入的先运行for(j=0;j {if(f[j].atime>f[j+1].atime)
{diao=f[j].atime;
f[j].atime=f[j+1].atime;
f[j+1].atime=diao;
huan=f[j].id;
f[j].id=f[j+1].id;
f[j+1].id=huan;
}
}
}
for(i=0;i {
cout f[i+1].atime=f[i].atime+f[i].runtime;
}
}
2.短进程优先算法
#include
#definen5
#definenum5
#definemax65535
typedefstructpro
{intPRO_ID;
intarrive_time;
intsum_time;intflag;
}Pro;//整数排序
intbubble(inttemp[])
{
inti,j,tem=0;
for(i=1;i }
//进程排序
Probubble(Prop[])
{
inti,j;Protemp={0};Pros[num];for(i=0;itemp[j+1])}if(lastX==1)break;{tem=temp[j];temp[j]=temp[j+1];temp[j+1]=tem;lastX=0;}
{s[i]=p[i];
}for(i=1;is[j+1].sum_time){temp=s[j];s[j]=s[j+1];s[j+1]=temp;lastX=0;}
returns[0];
}
voidSPF(intp)
{
if(n>0){inti,j,k,l,tc=0;Proseq[n];Protemp_seq[n];printf("短进程优先调度算法SPF\n");printf("请依次输入5个进程的进程号、到达时间和执行时间\n");printf("成员变量用逗号隔开;进程间用回车隔开\n");for(i=0;i //flag表示对应i的pro的队列情况
//-1表示未进入过队列,0表示在队列中,1表示被清除了
for(i=0;i for(i=0;i for(j=0;j篇三:
进程调度实验报告
一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容和要求
编写并调试一个模拟的进程调度程序,采用“简单时间片轮转法”调度算法对五个进程进行调度。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、到达时间、需要运行时间、已运行时间、进程状态等等。
进程的到达时间及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)两种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用运行时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它插入就绪队列队尾。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实验主要仪器设备和材料
硬件环境:
IBM-PC或兼容机软件环境:
C语言编程环境四、实验原理及设计方案
1、进程调度算法:
采用多级反馈队列调度算法。
其基本思想是:
当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
2、实验步骤:
(1)按先来先服务算法将进程排成就绪队列。
(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。
(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。
(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。
(5)重复步骤
(2)、(3)、(4),直到就绪队列为空。
五、流程图
六、结果过程及截图初始化队列
输入所有进程后的进程信息如下:
按Y键继续运行进程:
按Y键继续运行进程:
运行若干次后的状态:
添加新的进程:
七、所遇困难的解决以及心得体会
在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fend用来表明新插入的队列的位置。
虽然实验原理很简单,但是在编写代码的过程中遇到了不少的问题,在两个小时之内已经完成的大体代码的编写,但是之中存在不少的问题,导致了用了差不多四个小时的时间去调试才把它弄好,这主要归咎于在开始设计代码的不太合理,在后期使得代码结构有些混乱,使得调试更加的麻烦,以及对编程的不熟悉。
通过这个实验不仅使我对进程的调度算法有了更深的认识,使得理论知识得到的实践,也使我的编程能力得到了进一步提高。
八、源代码
#include#include#include
#definegetpch(type)(type*)malloc(sizeof(type))#defineNULL0
#defineTIME2//时间片长度
typedefstructpcb{//进程管理块charname[10];//进程名字