logo资料库

处理机调度模拟程序 课程设计详细报告.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
1 设计任务
2 设计的功能目标
3 设计的思想、方法和技术(含数据结构、算法)
4 设计的主要代码及注释
5 结果分析(含实现中出错原因分析)
6 设计小结(即收获和体会)
格式要求: 标题(如[设计任务]等):采用样式库中的标题1(宋体小四加粗); 正文:宋体五号常规,首行缩进2字符,如果其中需要设置多级标题,则各级标题使 用1.1,1.1.1 格式编排序号(序号与内容之间以一个空格分隔),各级标题顶格 编排,字体为宋体小四号; 页面设置:纸型统一使用A4纸,页面上、下、左、右页边距均定义为2厘米; 填加页眉:“操作系统课程设计(居中),学号+姓名(靠右)”;页脚:页码(居中)。 主要内容要求: 1 设计任务 处理机调度模拟程序:选择一个调度算法,实现处理机调度。 2 设计的功能目标 设计目的: 在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是 说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用 某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩 固和加深处理机调度的概念。 设计要求: 1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。 2)可选择进程数量 3)本程序包括三种算法,可用 C 语言实现,执行时在主界面选择算法(可用函数实 现),进入子页面后输入进程数及每个进程的运行时间,每个进程的优先数由随机 函数产生且优先数随等待时间而变化,执行,显示结果。注:可以考虑增加进程 的到达时间,使得算法更接近真实情况。 3 设计的思想、方法和技术(含数据结构、算法)
开始 初 始 化 PCB, 输入进程信息 选 择 调 度 算 法是否为 0 是 否 结束程序 1 2 3 4 先来先服务算 法[模块一] 动态优先级算 法[模块二] 短作业算法[模 块三] 时 间 片 轮 转 法[模块四] 进 程 参 数输出 进 程 参 数输出 进 程 参 数输出 进 程 参 数输出 结束
模块一:先来先服务算法 基本思想: 将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处 理,是一种最普遍和最简单的方法。该算法在一般意义下是公平的。即每个作业或进程都按照它们在队列中等 待时间长短来决定它们是否优先享受服务。不过对于那些执行时间较短的作业或进程来说,如果它们在某些执 行时间很长的作业或进程之后到达,则它们将等待很长时间。 流程图: 开始 初始化参数 按 进 程 创 建 顺 序依次执行 结束 模块二:动态优先级算法 基本思想: 动态法把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过 程,其优先级不断变化。进程的动态优先级一般根据以下原则确定: (1)根据进程占有 CPU 时间的长短来决定。一个进程占有处理机的时间愈长,则在被阻塞之后再次获得调度的 优先级就越低,反之,其获得调度的可能性就会越大。 (2)根据就绪进程等待 CPU 的时间长短来决定。一个就绪进程在就绪队列中等待的时间越长,则它获得调度选 中的优先级就越高。 本程序是按照静态优先级编写的。 流程图: 开始 初始化变量 找优先级最大 的进程执行 进程全部运行完毕? 否 是 结束
模块三:短作业算法 基本思想: 最短作业优先法就是选择那些估计需要执行时间最短的作业投入执行,为它们创建进程和分配资源。采用最 短作业优先的调度算法,可使得系统在同一时间内处理的作业个数最多,从而吞吐量也就大于其他调度方式。 但是,对于一个不断有作业进入的批处理系统来说,最短作业优先法有可能使得那些长作业永远得不到调度执 行的机会。 流程图: 开始 找执行时间最短 的进程投入运行 进 程运 行 完毕? 否 是 结束
模块四:时间片轮转法 基本思想: 轮转法让每个进程在就绪队列中的等待时间与享受服务的时间成比例。将 CPU 的处理时间分成固定大小的 时间片。如果一个进程在被调度选中之后用完了系统规定的时间片,但未完成要求的任务,则它自行释放自己 所占有的 CPU 而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一 个进程或作业。 流程图: 开始 定义 cpu 的时间 初始化变量 根据运行时间及 CPU 时 间 计 算 运行次数 按先来先服务调 度算法运行进程 时 间片 是 否用完? 否 是 结束
4 设计的主要代码及注释 int fcfs() /*先来先服务*/ { float time_temp=0; int i; time_temp=tasks[0].come_ti me;//开始执行时间为第一个 到达时间 for(i=0;itasks[i] .priority) { max_priority=tasks[j].prio rity; i=j; } j++; } /*查找第一个被调 度的进程*/ temp_time=tasks[number_sch edul].run_end_time; /*对第一个被调度的进程求 temp_counter++; 相应的参数*/ number_schedul=i; tasks[number_schedul].orde r=temp_counter; tasks[number_schedul].run_ begin_time=tasks[number_sc hedul].come_time; tasks[number_schedul].run_ end_time=tasks[number_sche dul].run_begin_time+tasks[ number_schedul].run_time; tasks[number_schedul].run_ flag=1; temp_time=tasks[number_sch edul].run_end_time; tasks[number_schedul].orde r=1; temp_counter=1; while (temp_countermax_pri ority) { max_priority=tasks[j].prio rity; number_schedul=j; } } /*查找下一个被调度 } return 0; } int sjf() /*短作业优先*/ { float temp_time=0; int i=0,j; int number_schedul,temp_counte r; float run_time; run_time=tasks[i].run_time ; j=1;//由第一个进程开始循 环比较 //比较进程的执行时间 while (j
tasks[number_schedul].run_ flag=1;//运行过的进程置为1 temp_time=tasks[number_sch edul].run_end_time; tasks[number_schedul].orde r=1; temp_counter=1; while (temp_counter=cputim e) //剩余时间大于时间片 { lefttime[i]-=cputime; runtimeresult[i]+=cput float lefttime[100];//剩 ime; 余时间 starttime[i]=cputime*( float starttime[100];// i)+(j*cputime*counter); 开始时间 float } else runtimeresult[100];//运行 结果 float max_runtime=0; int number; cout<<"please input the if(lefttime[i]0)//剩余时间小于 时间片 { runtimeresult[i]+=left cputime:"<>cputime; cout<
cout<<" "; cout<
分享到:
收藏