《进程调度算法实验报告.doc》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验报告 实验一:进程调度算法 一、实验目的 1(利用高级语言实现三种不同及进程调度算法: 短作业优先算法、时间片轮转调度算法和优先级调度算法。 2(通过实验理解有关进程控制块,进程队列等的概念。 二、实验原理 各调度算法思想: 1. 先来先服务算法(FCFS): 按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。 2. 时间片轮转算法: 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进
2、程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。 3. 优先权调度算法; 在创建进程时就确定优先权,确定之后在整个程序运行期间不再改变,根据优先级排列,系统会把CPU分配给优先权最高的进程。 三、 实验步骤、数据记录及处理 1、 算法流程 抽象数据类型的定义:PCB块结构体类型 struct PCB int name; int arrivetime; /到达时间 int servicetime; /服务时间 /int starttimemax; /开始时间 int finishtime; /完成/ 结束时间 int turntime; /周转时间 int average
3、_turntime; /带权周转时间 int sign; /标志进程是否完成 int remain_time; /剩余时间 int priority; /优先级 pcbmax; 主程序的流程以及各程序模块之间的层次(调用)关系: 主程序中从键盘得到进程的数量,创建PCB,调用layout()函数显示选择界面。 Layout()函数中选择相应的算法并调用相关函数如:FCFS()、time_segment();、Priority(),这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。 程序流程图: 2、运行结果分析: 先来先服务算法: 时间片轮转算法: 优先级算法: 西安
4、工业大学实验报告 四、总结与体会 经过此次实验,我觉得具体写代码就是对解题步骤的一个细化,也发现了已往课程中学习的不足,以便日后改正。 附录:源代码 #include #include #define max 50 struct PCB int name; int arrivetime; /到达时间 int servicetime; /服务时间 /int starttimemax; /开始时间 int finishtime; /完成/结束时间 int turntime; /周转时间 int average_turntime; /带权周转时间 int sign; /标志进程是否完成 int re
5、main_time; /剩余时间 int priority; /优先级 pcbmax; void init(int n) /初始化 for(int i=0;in;i+) pcbi.arrivetime=0; pcbi.servicetime=0; /pcbi.starttime=0; pcbi.finishtime=0; pcbi.turntime=0; pcbi.average_turntime=0; pcbi.remain_time=0; pcbi.sign=0; pcbi.priority=0; void creat(int n) /创建PCB int i; for(i=1;i=pcb0
6、.arrivetime) pcb0.finishtime=pcb0.servicetime+starttime; else pcb0.finishtime=pcb0.finishtime+pcb0.servicetime; for(int i=1;ipcbi.arrivetime) pcbi.finishtime=pcbi-1.finishtime+pcbi.servicetime; else pcbi.finishtime=pcbi.arrivetime+pcbi.servicetime; pcbi.turntime=pcbi.finishtime-pcbi.arrivetime; pcbi
7、.average_turntime=pcbi.turntime/pcbi.servicetime; void print_FCFS(int n) /printf(进程名,到达时间t服务时间t完成时间t周转时间t周转时间:,%st%dt%dt%dt%dt%dt); printf(进程名 到达时间 服务时间 完成时间 周转时间 带权周转时间:n); for(int i=0;in;i+) printf(%d ,%d ,%d ,%d ,%d ,%d ,pcbi.name ,pcbi.arrivetime ,pcbi.servicetime ,pcbi.finishtime ,pcbi.turntime
8、 ,pcbi.average_turntime); printf(n); void time_segment(int n) /时间片轮转 int i,j; int T; /时间片 int flag=1; /就绪队列中是否还有进程 /int time=pcb0.arrivetime; /当前的时间 int time=0; int sum=0; /已经完成的进程数 /按各进程的arrivetime进行升序排列 for(i=1;i=n;i+) for(j=i+1;j=n;j+) if(pcbj.arrivetimepcbi.arrivetime) pcb0=pcbj; pcbj=pcbi; pcbi
9、=pcb0; /printf(输出排序结果:n); /for(i=1;i=n;i+) /检查排序是否正确 /printf(%dt,pcbi.name); printf(输入时间片:n); scanf(%d,&T); /printf(n运行的进程名 开始运行时间 运行时间 剩余服务时间 结束时间n); while(sumn) flag=0; /当前就绪队列中没有进程 for(i=1;i T) flag=1; time=time+T; pcbi.remain_time=pcbi.remain_time-T; /printf(%10d%16d%12d%12d%12dn,pcbi.name,time-
10、T,T,pcbi.remain_time,time); /没有完成的进程需要的时间小于或等于一个时间片 else if(pcbi.remain_time = T) flag=1; /加入就绪队列 time=time+pcbi.remain_time; pcbi.finishtime=time; pcbi.sign=1; /printf(%10d%16d%12d%12d%12dn,pcbi.name,time-pcbi.remain_time,pcbi.servicetime,0,time); pcbi.remain_time=0; if(pcbi.sign=1) sum+; /for if(f
11、lag=0&sumn) / 还有没执行的进程,且没进入就就绪队列 for(i=1;i=n;i+) if(pcbi.sign=0) time=pcbi.arrivetime;break; /while void print_time(int n) for(int i=0;in;i+) printf(n进程名 服务时间 完成时间n); printf(%6d%10d%10d,pcbi+1.name,pcbi.servicetime,pcbi.finishtime); printf(n); void Priority(int n) int i,j; int time = pcb1.arrivetime
12、; /按各进程的arrivetime进行升序排列,最早到达的进程先执行 for(i=1;i=n;i+) for(j=i+1;j=n;j+) if(pcbj.arrivetime pcbi.arrivetime) pcb0=pcbj; pcbj=pcbi; pcbi=pcb0; /printf(输出排序结果:n); /for(i=1;i=n;i+) /检查排序是否正确 /printf(%dt,pcbi.name); printf(n进程名 服务时间 优先级 完成时间n); /先到达的进程第一个执行 if(i=1) pcbi.finishtime=pcbi.arrivetime + pcbi.se
13、rvicetime; time =pcbi.arrivetime + pcbi.servicetime; printf(%6d%10d%10d%10d,pcbi.name,pcbi.servicetime,pcbi.priority,pcbi.finishtime); printf(n); /测试第一个进程输出正确 /* printf(输出第一个程序的:n); printf(名称 到达时间 完成时间n); printf(%4d%8d%8d,pcbi.name,pcbi.arrivetime,pcbi.finishtime); printf(n); */ i+; /按各进程的priority进行
14、降序排列,优先级最高的进程先执行 for(i=2;i=n;i+) for(j=i+1;j pcbi.priority) pcb0=pcbj; pcbj=pcbi; pcbi=pcb0; for(i=2;i=n;i+) time = time + pcbi.servicetime; pcbi.finishtime = time; printf(%6d%10d%10d%10d,pcbi.name,pcbi.servicetime,pcbi.priority,pcbi.finishtime); printf(n); /for /void void layout(int n) int ch=0; pr
15、intf(tt*调度算法*n); printf(tt1.先来先服务n); printf(tt2.时间片轮转n); printf(tt3.优先级n); printf( 选择算法:n); scanf(%10d,&ch); switch(ch) case 1: FCFS(n); print_FCFS(n); break; case 2: time_segment(n); print_time(n); break; case 3: Priority(n); break; default:printf(enter error data!n); /P:int类型的变量,case后面不要加 int main() int n; printf(输入进程的个数n); scanf(%d,&n); init(n); creat(n); layout(n); /FCFS(n); /print_FCFS(n); /time_segment(n); /print_time(n); /Priority(n); return 0;
限制150内