欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    1423.处理机调度模拟程序操作系统课程设计.doc

    • 资源ID:2393067       资源大小:84.50KB        全文页数:22页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

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

    1423.处理机调度模拟程序操作系统课程设计.doc

    课程设计书系别: 计 科 系 专业: 计算机科学与技术 班级: 题目: 处理机调度模拟程序 教师: 姓名: 一 设计题目处理机调度模拟程序选择一个调度算法,实现处理机调度。二、设计要求编写一个进程调度程序,允许多个进程共行的进程调度程序。进程调度算法采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 就绪进程获得 CPU后都只能运行一个时间片,用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止1进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。2 可选择进程数量3 本程序包括三种算法,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。三设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。四设计分析1、实现原理首先,编写一个进程调度类Main_PCB,一个进程信PCB_block可以创建进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 对应成员变量是pcb_Name; pcb_ID;int pcb_Pro; PCB_Begintime(); pcb_Needtime; pcb_Spendtime; pcb_Finishtime;String pcb_Statue; 成员方法是pcb_Work ();可以实例化多个包含相同信息的进程,一个线程类Work允许多个进程共行的进程调度创建各自的模拟任务,由process_Create(int Process_ProcessNum)方法实现创建Process_ProcessNum个进程。接着,编写进程调度算法(1) 最高优先数优先的调度算法HIGH_method()(这里采用把处理机分配给优先数最高的进程);(2) 先来先服务算法FIFS_method()。 以上,两个方法都是Main_PCB的成员方法,由Main_PCB的主调函数main()调用call()方法进行调用。进程的优先数及需要的运行时间这里由由随机数产生。进程的到达时间为创建进程的时间。进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。这里采用线程的睡眠sleep()方法实现,最后通过进程的开始时间、执行时间和结束时间,观察进程的执行过程。2、程序执行过程(1)开始执行Main_PCB主调方法main();(2)调用方法process_Create(ProcessNum)创建ProcessNum个进程调用call(method)方法;(a)如果method =1执行FIFS_method()先来先服务算法,接着执行创建进程的个子作业线程;(b)如果method =2执行HIGH_method()最高优先数优先的调度算法,接着执行创建进程的个子作业线程(3)输出程序执行的开始,和结束时间。开始创建num 个进程依此命名为process0,process1,等执行类Main_PCB的主调研方法main()调用call(method)方法判断method的值Method=1Method=2输出出错提示信息执行FIFS_method()执行HIGH_method()输出结果结束3、实现原理图4、实现类图Main_PCBVariableprocessIDProcessNumTimePcb_QueexcuteQueueprocessName+ main()+ call()+HIGH_method()+FIFS_method()+process_Create()+printSign().PCB_blockpcb_Begintimepcb_Finishtimepcb_IDpcb_Namepcb_Needtimepcb_Needtimepcb_Needtimepcb_Needtime+ pcb_Work()Work+ main()+run()+workMethod()5、实现用到的数据结构根据类图可以分析出所采用的数据结构有:(1) 队列主要完成FIFS_method()算法,进程的先来先服务;Process0Process1.ProcessN(2) 堆栈主要完成方法的调用时,先调用的后执行;main()call()FIFS_method()main()call()FIFS_method()入栈出栈(3) 数组采用链表主要用来记录进程创建时的信息,为以后观察其创建的初值、运行过程和执行结果;采用链表数组的好处是可以实现数组的长度动态变化;Ararry1HeadArarry2HeadlinkDate1Date2DateN五程序代码Main_PCB如下:package PCB_con;import java.lang.*;import java.lang.Object; import java.io.*;import java.util.*;public class Main_PCB public static int variable;public static int processID ;public static int ProcessNum=5;public static Date Time =new Date();public static PCB_block Pcb_Que = new PCB_blockProcessNum;public static int excuteQueue=new intPcb_Que.length;/public static int sort = new intProcessNum;public static String processName = new StringProcessNum;public static intprocessId = new intProcessNum;public static int processPro =new intProcessNum;public static int processBt= new int2ProcessNum;public static int processSpt =new intProcessNum;public static int processNt =new intProcessNum;public static int processFt =new intProcessNum;public static String processSta = new StringProcessNum;public static Work processWk = new WorkProcessNum;/主调方法public static void main(String args)/int ProcessNum=Integer.parseInt(args0);/命令行输入创建进程的个数;/int callMethod=Integer.parseInt(args0);/命令行输入调用的算法 FIFS值为1 或 优先级值为2;printSign();System.out.println("创建的进程数量是:"+ProcessNum);System.out.println();process_Create(ProcessNum);call(1);call(2);/call方法static void call(int callmeth)if (callmeth=1) FIFS_method();else if (callmeth=2) HIGH_method();elseSystem.out.println("没有进程的调度算法被执行!");/最高优先数优先调度public static void HIGH_method()System.out.println();System.out.println("-");System.out.println("-最高优先数算法被调度-");System.out.println("-");System.out.println("公共变量的初值是:"+variable);int sort = new intProcessNum;for(int i=0;i<sort.length;i+)sorti=processProi;for(int i=0;i<sort.length;i+)int temp;for(int j=0;j<sort.length-1;j+)if(sortj<sortj+1)temp=sortj;sortj=sortj+1;sortj+1=temp;System.out.println("优先级排序:") ;for(int i=0;i<sort.length;i+)System.out.println(sorti);System.out.println();System.out.println("进程被执行的顺序为:");for(int i=0;i<sort.length ;i+)int j=0;while(sorti!=processProj )if (j<processPro.length-1 )j+;System.out.println("Step "+i+":执行"+processNamej);int sleeptime =(int)(Math.random()*10000);processWkj.workMethod(j,sleeptime) ;/processWki.run();System.out.println("公共变量的当前值是:"+variable);/先来先服务调度方法public static void FIFS_method()System.out.println();System.out.println("-");System.out.println("-先来先服务算法被调度-");System.out.println("-");System.out.println("进程被执行的顺序为:");for(int i=0; i<excuteQueue.length;i+)int j=0;while(excuteQueuei!=processIdj )if(j<processId.length-1 )j+;System.out.println("Step "+i+":执行"+processNamej);/processWki.run();processWkj.workMethod(j) ;/输出标志static void printSign()System.out.println("*");System.out.println("* Process *");System.out.println("*");System.out.println();/进程创建方法static void process_Create(int Process_ProcessNum)PCB_block Pcb_Que =new PCB_blockProcess_ProcessNum;int proID = new intPcb_Que.length;System.out.println("进程刚被创建是的信息如下:");System.out.println();for(int i=0;i<Pcb_Que.length;i+)PCB_block Process =new PCB_block();processID = i;Process.pcb_Name ="process"+i;Process.pcb_ID =10*i;Process.pcb_Pro =(int) (Math.random()*100) ;Process.pcb_Needtime =(int)( Math.random()*1000);Process.pcb_Spendtime =0;Process.pcb_Begintime.minute = Time.getMinutes(); Process.pcb_Begintime.secend = Time.getSeconds();Process.pcb_Statue ="Wait"class ProMeth extends Workpublic void run()public void workMethod(int id,int sletim)System.out.println();System.out.println("Process"+id+": Start running!");System.out.println();Date date1 = new Date();System.out.println("开始时间:"+(date1.toString().substring( 10,20);/*帮助调试 线程的执行* try * wait();catch(Exception e)System.out.println("Process"+processID+" 有异常:"+e.toString() );*/int sleeptime =sletim;System.out.println("sleep time"+sleeptime);for(int i =0;i<20;i+)variable=variable+i;try sleep(sleeptime);/sleep(sleeptime);catch(Exception e)System.out.println(e.toString() );System.out.println("Process"+id+": Finished!");Date date2 = new Date();System.out.println("结束时间:"+(date2.toString().substring( 10,20);System.out.println("执行后的公共变量是:"+variable);System.out.println(); Process.pcb_Work =new ProMeth();/记录进程的信息到数组 processNamei=Process.pcb_Name; processProi=Process.pcb_Pro;processIdi= Process.pcb_ID;processSpti=Process.pcb_Spendtime;processNti=Process.pcb_Needtime;processStai=Process.pcb_Statue;processWki=Process.pcb_Work;processBt0i=Process.pcb_Begintime.minute;processBt1i=Process.pcb_Begintime.secend;Pcb_Quei = Process;System.out.println(" #Process"+i+"刚创建时的信息PCB#" );System.out.println();System.out.println(" Name:"+Pcb_Quei.pcb_Name);System.out.println(" createTime:"+Time.toString() );System.out.println(" ID:"+Pcb_Quei.pcb_ID);System.out.println(" Needtime:"+Pcb_Quei.pcb_Needtime);System.out.println(" Pro:"+Pcb_Quei.pcb_Pro );System.out.println(" Spendtime:"+Pcb_Quei.pcb_Spendtime );System.out.println(" current status:"+Pcb_Quei.pcb_Statue);System.out.println();proIDi = Pcb_Quei.pcb_ID ;excuteQueue = proID; /被创建进程的存贮数组public static void store_ProcessInfoArray()/进程信息类class PCB_blockString pcb_Name;int pcb_ID;int pcb_Pro;PCB_Begintime pcb_Begintime= new PCB_Begintime();int pcb_Needtime;int pcb_Spendtime;int pcb_Finishtime;String pcb_Statue;Work pcb_Work = new Work();/进程工作的线程class Work extends Threadpublic void run()public static void main(String args)int var=0;Work p= new Work();System.out.println();/p.workMethod();p.workMethod(var);void workMethod()void workMethod(int sletim)try sleep(sletim);catch(Exception e)System.out.println(e.toString() );void workMethod(int id,int sletim)class PCB_Begintimeint minute;int secend;先来先服务调度方法:public static void FIFS_method()System.out.println();System.out.println("-");System.out.println("-先来先服务算法被调度-");System.out.println("-");System.out.println("进程被执行的顺序为:");for(int i=0; i<excuteQueue.length;i+)int j=0;while(excuteQueuei!=processIdj )if(j<processId.length-1 )j+;System.out.println("Step "+i+":执行"+processNamej);/processWki.run();processWkj.workMethod(j) ;/输出标志static void printSign()System.out.println("*");System.out.println("* Process *");System.out.println("*");System.out.println(); Process.pcb_Work =new ProMeth();/记录进程的信息到数组 processNamei=Process.pcb_Name; processProi=Process.pcb_Pro;processIdi= Process.pcb_ID;processSpti=Process.pcb_Spendtime;processNti=Process.pcb_Needtime;processStai=Process.pcb_Statue;processWki=Process.pcb_Work;processBt0i=Process.pcb_Begintime.minute;processBt1i=Process.pcb_Begintime.secend;Pcb_Quei = Process;System.out.println(" #Process"+i+"刚创建时的信息PCB#" );System.out.println();System.out.println(" Name:"+Pcb_Quei.pcb_Name);System.out.println(" createTime:"+Time.toString() );System.out.println(" ID:"+Pcb_Quei.pcb_ID);System.out.println(" Needtime:"+Pcb_Quei.pcb_Needtime);System.out.println(" Pro:"+Pcb_Quei.pcb_Pro );System.out.println(" Spendtime:"+Pcb_Quei.pcb_Spendtime );System.out.println(" current status:"+Pcb_Quei.pcb_Statue);System.out.println();proIDi = Pcb_Quei.pcb_ID ;excuteQueue = proID;/被创建进程的存贮数组public static void store_ProcessInfoArray()/进程信息类class PCB_blockString pcb_Name;int pcb_ID;int pcb_Pro;PCB_Begintime pcb_Begintime= new PCB_Begintime();int pcb_Needtime;int pcb_Spendtime;int pcb_Finishtime;String pcb_Statue;Work pcb_Work = new Work();/进程工作的线程class Work extends Threadpublic void run()public static void main(String args)int var=0;Work p= new Work();System.out.println();/p.workMethod();p.workMethod(var);void workMethod()void workMethod(int sletim)try sleep(sletim);catch(Exception e)System.out.println(e.toString() );void workMethod(int id,int sletim)/时间的分和时类class PCB_Begintimeint minute;int secend;部分程序代码:package PCB_con;import java.lang.*;import java.lang.Object; import java.io.*;import java.util.*;public class Main_PCB public static int variable;public static int processID ;public static int ProcessNum=5;public static Date Time =new Date();public static PCB_block Pcb_Que = new PCB_blockProcessNum;public static int excuteQueue=new intPcb_Que.length;/public static int sort = new intProcessNum;/被创建进程的存贮数组public static String processName = new StringProcessNum;public static intprocessId = new intProcessNum;public static int processPro =new intProcessNum;public static int processBt= new int2ProcessNum;public static int processSpt =new intProcessNum;public static int processNt =new intProcessNum;public static int processFt =new intProcessNum;public static String processSta = new StringProcessNum;public static Work processWk = new WorkProcessNum;/主调方法public static void main(String args)/int ProcessNum=Integer.parseInt(args0);/命令行输入创建进程的个数;/int callMethod=Integer.parseInt(args0);/命令行输入调用的算法 FIFS值为1 或 优先级值为2;printSign();System.out.println("创建的进程数量是:"+ProcessNum);System.out.println();process_Create(ProcessNum);call(1);call(2);/call方法static void call(int callmeth)if (callmeth=1) FIFS_method();else if (callmeth=2) HIGH_method();elseSystem.out.println("没有进程的调度算法被执行!");/最高优先数优先调度public static void HIGH_method()System.out.println();System.out.println("-");System.out.println("-最高优先数算法被调度-");System.out.println("-");System.out.println("公共变量的初值是:"+variable);int sort = new intProcessNum;for(int i=0;i<sort.length;i+)sorti=processProi;for(int i=0;i<sort.length;i+)int temp;for(int j=0;j<sort.length-1;j+)if(sortj<sortj+1)temp=sortj;sortj=sortj+1;sortj+1=temp;System.out.println("优先级排序:") ;for(int i=0;i<sort.length;i+)System.out.println(sorti);System.out.println();System.out.println("进程被执行的顺序为:");for(int i=0;i<sort.length ;i+)int j=0;while(sorti!=processProj )if (j<processPro.length-1 )j+;System.out.println("Step "+i+":执行"+processNamej);int sleeptime =(int)(Math.random()*10000);processWkj.workMethod(j,sleeptime) ;/processWki.run();System.out.println("公共变量的当前值是:"+variable);进程创建方法static void process_Create(int Process_ProcessNum)PCB_block Pcb_Que =new PCB_blockProcess_ProcessNum;int proID = new intPcb_Que.length;System.out.println("进程刚被创建是的信息如下:");System.out.println();for(int i=0;i<Pcb_Que.length;i+)PCB_block Process =new PCB_block();processID = i;Process.pcb_Name ="process"+i;Process.pcb_ID =10*i;Process.pcb_Pro =(int) (Math.random()*100) ;Process.pcb_Needtime =(int)( Math.random()*1000);Process.pcb_Spendtime =0;Process.pcb_Begintime.minute = Time.getMinutes(); Process.

    注意事项

    本文(1423.处理机调度模拟程序操作系统课程设计.doc)为本站会员(仙人指路1688)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开