欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    优先级法多级反馈轮转法进程调度模拟设计.docx

    • 资源ID:30033430       资源大小:193.53KB        全文页数:37页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    优先级法多级反馈轮转法进程调度模拟设计.docx

    1、优先级法多级反馈轮转法进程调度模拟设计学 号: 课 程 设 计题 目进程调度模拟设计优先级法、多级反馈轮转法学 院计算机学院专 业班 级姓 名指导教师吴利军2013年1月15日课程设计任务书学生姓名: 指导教师: 吴利军 工作单位: 计算机科学与技术学院 题 目: 进程调度模拟设计优先级法、多级反馈轮转法 初始条件:1预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1模拟进程调度,能够处理以下的情形: 能够选择不同的调度算法(要求

    2、中给出的调度算法); 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等; 根据选择的调度算法显示进程调度队列; 根据选择的调度算法计算平均周转时间和平均带权周转时间。2设计报告内容应说明: 需求分析; 功能设计(数据结构及模块说明); 开发平台及源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:)你认为你完成的设计哪些地方做得比较好或比较出色;)什么地方做得不太好,以后如何改正;)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:

    3、完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日进程调度模拟设计优先级法、多级轮转反馈法1设计目的与功能1.1设计目的了解进程调度中的相关知识,能够使用其中的方法来进行进程调度模拟设计。本次课程设计的重点是多级轮转反馈法和优先级法的使用,要求熟练掌握并运用他们,并能够运用一种高级语言来完成这个程序。1.2设计功能模拟进程调度,能够处理以下的情形: 能够选择不同的调度算法(要求中给出的调度算法); 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等; 根据选择的调度算

    4、法显示进程调度队列; 根据选择的调度算法计算平均周转时间和平均带权周转时间。2.需求分析,数据结构或模块说明(功能与框图)2.1需求分析无论是在批处理系统、分时系统还是实时系统,用户进程数一般都多于处理机数,这将导致用户进程互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按照一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。进程调度的主要任务是按照某种策略和方法选取一个处于就绪状态的进程占用处理机。这次课程设计所要求使用的方法是时间片轮转和优先级法,并且能够选择不同的算法。而时间片轮转法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成

    5、比例。时间片轮转法的基本概念是将CPU的处理时间分成固定大小的时间片。如果一个进程选中之后用完了系统规定的时间片,但未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程或作业。优先级法是系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。优先级高的作业或进程优先调度。根据所需求,这个进程调度的实现过程如下图所示:2.2数据结构和模块说明主要数据结构:struct PCB char nameNAME_LEN; int priority; /优先级 int arrive_time;

    6、 / 到达时间,即创建时间 int run_time; / 需要的时间片数 int finish_time; / 完成时间 int sleep_time; / 用于模拟进程的阻塞耗时 int switch_time; / 切换队列的时间(SRR专用) int used_run_time; / 已经用过的时间片数 short use_slices; / 每次占用CPU将消耗的时间片数不同队列中的进程的值不一样(RRMF专用) struct PCB *next;程序中主要函数char get_command(); / 显示主菜单并接受用户令void add_process(); / 添加一个PCB

    7、结构进入预先准备队列void start_scheduling(); / 演示进程调度队列,SRR版void start_scheduling_rrmf(); / RRMF版void calculate_time_costs(); / 计算并显示平均周转时间,平均带权周转时间void switch_algorithm(); / 切换调度算法(线性优先级法,多级反馈轮转法)void view_list(struct PCB *list); /查看队列中内容void help_menu(); / 显示帮助菜单void restart(); / 释放资源,重新开始void man_auto(); /

    8、 手动自动切换void append(struct PCB *head, struct PCB *node); / 添加于所指队列的队尾void show_process(struct PCB *node); / 显示一个PCB的内容void time_slice(); / 一个时间片void proc_run(); / 进程执行void proc_run_rrmf(); / RRMF版void proc_switch(); / 进程切换void proc_switch_rrmf(); / RRMF版void try_wakeup_procs(); / 遍历等待队列,减少sleep_time,

    9、唤醒sleep_time降至进程3.源程序的主要部分本次程序主要由三个部分组成:main函数部分,该部分主要包含main函数;LRU算法部分,该部分主要包含LRU函数、setm(int m,int n)函数和mini(int *b)函数;OPT算法部分,该部分主要包含OPT函数和getOpt(int inPage)函数。3.1 main函数部分3.1.1main函数代码:int main(int argc, char *argv) char command; srand( (unsigned)time(NULL) ); restart(); while(command = get_comman

    10、d() != 0); 3.2 进程调度方法部分3.2.1.多级轮转反馈函数代码:/进程执行(RRMF算法)void proc_run_rrmf() short slices_out = 0; try_wakeup_procs(); printf( ); if(running = NULL) printf(没?有D进?程到?达?!n); return; printf(进程正在运行 :, running-name); running-used_run_time +; running-next = NULL; show_process(running); printf(n); if(running-

    11、used_run_time = running-run_time) running-finish_time = sys_clock; running-use_slices = (QUEUE_NUM+1) - running-priority; append(&finished_list, &running); slices_out = 1; else if( (rand() % 100 + 1) sleep_time = (rand()%5+1); running-use_slices = (QUEUE_NUM+1) - running-priority; append(&waiting_li

    12、st, &running); slices_out = 1; else running-use_slices -; if(0 = running-use_slices) slices_out = 1; if(running-priority PRIORITY4) running-priority -; running-use_slices = (QUEUE_NUM+1) - running-priority; append(&ready_listQUEUE_NUM-running-priority, &running); if(slices_out) running = NULL; 3.2.2

    13、.优先级法函数代码void proc_run() try_wakeup_procs(); printf( ); if(running = NULL) printf(没有进程抵达n); return; printf( 进程正在运行 :, running-name); running-used_run_time +; running-next = NULL; show_process(running); printf(n); if(running-used_run_time = running-run_time) running-finish_time = sys_clock; append(&f

    14、inished_list, &running); else if( (rand() % 100 + 1) sleep_time = (rand()%5+1); append(&waiting_list, &running); else append(&serving_ready_list, &running); running = NULL;4.测试用例,运行结果与运行情况分析4.1测试用例运行界面 4.2运行结果用多级轮转反馈法进行进程调度的结果如下图所示:用优先级法进行进程调度所得到的结果如下图所示:5.自我评价与总结5.1本次课程设计做得比较好地方 本次课程设计条理清楚,能够运用两种不同

    15、的方法来进行进程调度。在进程调度函数的实现时运用的结构体来实现各个的功能。5.2什么地方做得不太好,以后如何改正 实验中一些不太好的部分就是本次实验虽然完成了老师所要求的任务,但是程序设计的界面还不是很优秀,用户体验不是很好。以后需要在这方面改进,一个好的程序不仅要有高效率,易读性,我认为还需要较好的用户体验,以后我要在这方面多加改进。5.3从本设计得到的收获通过这次课程设计,我对操作系统有了更进一层的理解,同时对以前学的c程序设计语言也有了更深的理解。在本次实验中我遇到了很多困难,本次实验中的程序编写花了很久。在这次课程设计中,我自己先熟悉各种知识,然后查找相关资料来实现一些所需要的功能,尤

    16、其是在那两个方法时所要运用到的一些知识。 我觉得在以后的学习过程中还应该多做这样的设计,它可以让我们把所学的理论用于实践,一方面可以检验并巩固我们所学的内容,另一方面可以让我们在实践中感到所学知识的实用性,从而提高我们的学习兴趣。6.参考文献1 张绕学,计算机操作系统教程,清华大学出版社,2005年6月2 周湘贞,操作系统原理与实践教程清华大学出版社,2006年10月3 严蔚敏,数据结构(C语言版)清华大学出版社,2004年11月4 闵联营,c+程序设计教程武汉理工大学出版社,2005年7月附:源代码Common.h#ifndef _COMMON_H_#define _COMMON_H_#de

    17、fine NAME_LEN 20#define INC_FACTOR 2/ 模拟时间片的延时#define DELAY_COUNTER 10000/ RRMF 所需常量#define QUEUE_NUM 4 /就绪队列的条数#define PRIORITY1 4#define PRIORITY2 3#define PRIORITY3 2#define PRIORITY4 1#define USE_SLICES1 1#define USE_SLICES2 2#define USE_SLICES3 3#define USE_SLICES4 4/*全局数据结构和变量*/ 进程控制块 PCB 结构 s

    18、truct PCB char nameNAME_LEN; int priority; /优先级 int arrive_time; / 到达时间,即创建时间 int run_time; / 需要的时间片数 int finish_time; / 完成时间 int sleep_time; / 用于模拟进程的阻塞耗时 int switch_time; / 切换队列的时间 (SRR专用) int used_run_time; / 已经用过的时间片数 short use_slices; / 每次占用CPU将消耗的时间片数,不同队列中的进程的值不一样 (RRMF专用) struct PCB *next;in

    19、t sys_clock = 0; / 模拟系统时钟int add_idx = 0; / 第几轮添加进程int pre_list_size = 0;short algorithm = 0; / 调度算法标记, 0-SRR 1-RRMF 默认为0char algo_name5 = SSR;short manual = 0; / 手动,自动标记,0-手动 1-自动 默认为0char oper_name10 = Manual;int newly_factor = INC_FACTOR; / 新创建进程优先级增长速率int serving_factor = INC_FACTOR / 2; / 享受服务进

    20、程优先级增长速率struct PCB *pre_list; / 预先准备的队列,用于模拟进程的不同时刻到达调度队列struct PCB *running; / 指向正在运行进程struct PCB *serving_ready_list; / 享受服务进程队列struct PCB *newly_ready_list; / 新创建进程队列struct PCB *waiting_list; / 等待队列struct PCB *finished_list = NULL; / 完成队列/ RRMF 的多级队列/ ready_list0 优先级 PRIORITY1,占时间片 USE_SLICES1/ r

    21、eady_list1 优先级 PRIORITY2,占时间片 USE_SLICES2/ ready_list2 优先级 PRIORITY3,占时间片 USE_SLICES3/ ready_list3 优先级 PRIORITY4,占时间片 USE_SLICES4/ .struct PCB *ready_listQUEUE_NUM;/*函数说明*/char get_command(); / 显示主菜单,并接受用户命令void add_process(); / 添加一个PCB结构进入pre_list(预先准备队列)void start_scheduling(); / 演示进程调度队列,SRR版void

    22、 start_scheduling_rrmf(); / RRMF版void calculate_time_costs(); / 计算并显示平均周转时间,平均带权周转时间void switch_algorithm(); / 切换调度算法(线性优先级法,多级反馈轮转法)void view_list(struct PCB *list); / 查看队列中内容void help_menu(); / 显示帮助菜单void restart(); / 释放资源,重新开始void man_auto(); / 手动/自动 切换void append(struct PCB *head, struct PCB *no

    23、de); / 添加node于head所指队列的队尾void show_process(struct PCB *node); / 显示一个PCB的内容void time_slice(); / 一个时间片void proc_run(); / 进程执行void proc_run_rrmf(); / RRMF版void proc_switch(); / 进程切换void proc_switch_rrmf(); / RRMF版void try_wakeup_procs(); / 遍历等待队列,减少sleep_time,唤醒sleep_time降至0的进程#endif /_COMMON_H_Main.c#

    24、include #include #include #include #include #include common.hint main(int argc, char *argv) char command; srand( (unsigned)time(NULL) ); restart(); while(command = get_command() != 0);/接收用户选择并转入相应的操作char get_command() char c; printf(n%d 个进程正在进行中, %s, %s,如果遇到问题,请按6查询n请选择将要进行的操作:n,pre_list_size,algo_n

    25、ame,oper_name); c = _getch(); switch(c) case 1:add_process();break; case 2:switch_algorithm();break; case 3: if(algorithm = 0) start_scheduling(); else start_scheduling_rrmf(); break; case 4:calculate_time_costs();break; case 5:view_list(pre_list);break; case 6:help_menu();break; case 7:restart();br

    26、eak; case 8:man_auto();break; return c;/ 手动/自动 切换void man_auto() if(manual = 0) printf(切换为 自动模式n); strcpy(oper_name, Automatic); manual = 1; else printf(切换为 手动模式n); strcpy(oper_name, Manual); manual = 0; /显示帮助菜单void help_menu() printf( = Process Scheduler Simulator =n 1.添加进程n 2.改变调度算法(目前算法为: %s)n 3.

    27、开始调度n 4.计算平均周转时间、平均带权周转时间n 5.查看就绪进程列表n 6.帮助 n 7.重启n 8.手动、自动切换(目前模式为: %s)n 0.退出n,algo_name,oper_name );/ 添加node于head所指队列的队尾void append(struct PCB *head, struct PCB *node) struct PCB *p; /(*node)-next=NULL; if(*head=NULL) *head=*node; return; else p=*head; while(p-next!=NULL) p=p-next; p-next=*node; /

    28、添加进程void add_process() int counterpart, i; struct PCB *tmp; struct PCB *p = malloc( sizeof(struct PCB) ); printf(请输入进程名称:); scanf(%s, p-name); if(algorithm = 0) / SRR线性优先级调度 p-priority = 0; /优先级为0,表明使用SRR else / RRMF多级反馈轮转法 p-priority = PRIORITY1; p-use_slices = USE_SLICES1; / RRMF专用,表示占用的时间片 p-arrive_time = 2 * add_idx + rand() % 1; p-used_run_time = 0; p-sleep_time = -1; p-finish_time = -1; p-ne


    注意事项

    本文(优先级法多级反馈轮转法进程调度模拟设计.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开