处理机调度模拟程序-----操作系统课程设计_第1页
处理机调度模拟程序-----操作系统课程设计_第2页
处理机调度模拟程序-----操作系统课程设计_第3页
处理机调度模拟程序-----操作系统课程设计_第4页
处理机调度模拟程序-----操作系统课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计书系别: 计科系专业: 计算机科学与技术班级: 题目:处理机调度模拟程序教师: 姓名: 一 设计题目处理机调度模拟程序选择一个调度算法,实现处理机调度。二、设计要求编写一个进程调度程序,允许多个进程共行的进程调度程序。进程调度算法采用最高优先数优先的调度算法(即把处理机分配 给优先数最高的进程)和先来先服务算法。每个进程有一个进程 控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用 CPU 时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。进程的运行时间以时间片为单位进行

2、计算。每个进程的状态可以是就绪W(Wait)、运行 R(Run)、或完成 F(Finish)三种状态之一。就绪进程获得 CPU 后都只能运行一个时间片,用已占用 CPU 时间加 1 来表示。如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用 CPU 时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减 1(即降低一级), 然后把它插入就绪队列等待 CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止1进程调度算法包括:时间片轮

3、转法,短作业优先算法, 动态优先级算法。2可选择进程数量3本程序包括三种算法,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。三设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进21程可能有若干个。也就是说能运行的进程数大于处理机个数。为 了使系统中的进程能有条不紊地工作,必须选用某种调度策略, 选择一进程占用处理机。要求学生设计一个模拟处理机调度算法, 以巩固和加深处理机调度的概念。四设计分析1、实现原理首先,编写一个进程调度类 Main_PCB,一个进程信PCB_block 可以创建进程控制块(PCB)表示。进程

4、控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用 CPU 时间、进程状态等等。对应成员变量是 pcb_Name;pcb_ID;intpcb_Pro;PCB_Begintime();pcb_Needtime; pcb_Spendtime; pcb_Finishtime;String pcb_Statue; 成 员 方法是 pcb_Work();可以实例化多个包含相同信息的进程,一个线程类 Work 允许多个进程共行的进程调度创建各自的模拟任务, 由 process_Create(intProcess_ProcessNum)方法实现创建Process_ProcessNum 个进

5、程。接着,编写进程调度算法(1) 最高优先数优先的调度算法 HIGH_method()(这里采用把处理机分配给优先数最高的进程);(2) 先来先服务算法 FIFS_method()。以上,两个方法都是 Main_PCB 的成员方法,由 Main_PCB 的主调函数 main()调用 call()方法进行调用。进程的优先数及需要的运行时间这里由由随机数产生。进程的到达时间为创建进程的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行 R(Run)、或完成 F(Finish)三种状态之一。这里采用线程的睡眠sleep()方法实现,最后通过进程的开始时间、执行

6、时间和结束时间,观察进程的执行过程。222、程序执行过程(1)开始执行 Main_PCB 主调方法 main();(2)调用方法 process_Create(ProcessNum)创建 ProcessNum个进程调用 call(method)方法;(a)如果 method =1 执行 FIFS_method()先来先服务算法,接着执行创建进程的个子作业线程;(b)如果 method =2 执行 HIGH_method()最高优先数优先的调度算法,接着执行创建进程的个子作业线程(3)输出程序执行的开始,和结束时间。3、实现原理图创建 num 个进程依此命名为 process0,process1

7、,等调用 call(method)方法Method=1判断 method 的值Method=2输出出错提示输出结果Main_PCBVariable processID ProcessNum Time Pcb_Que excuteQueue processName+ main()+ call()+HIGH_method()+FIFS_method()+process_Create()+printSign().PCB_blockpcb_Begintime pcb_Finishtime pcb_ID pcb_Name pcb_Needtime pcb_Needtime pcb_Needtime pc

8、b_Needtime+ pcb_Work()4、实现类图Work+ main()+run()+workMethod()5、实现用到的数据结构根据类图可以分析出所采用的数据结构有:(1) 队列主要完成 FIFS_method()算法,进程的先来先服务;Process0Process1.ProcessN(2) 堆栈主要完成方法的调用时,先调用的后执行;24(3) 数组采用链表主要用来记录进程创建时的信息,为以后观察其创建的初值、运行过程和执行结果;采用链表数组的好处是可以实现数组的长度动态变化;Date1Date2DateN五程序代码Main_PCB 如下:package PCB_con; imp

9、ort java.lang.*; import java.lang.Object; import java.io.*;import java.util.*;public class Main_PCB public static int variable;public static int processID ;25public static int ProcessNum=5; public static Date Time =new Date();public static PCB_block Pcb_Que = new PCB_blockProcessNum; public static i

10、nt 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

11、 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

12、.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 (callm

13、eth=2) HIGH_method(); elseSystem.out.println(没有进程的调度算法被执行!);/最高优先数优先调度public static void HIGH_method()System.out.println();26System.out.println();System.out.println(-最高优先数算法被调度);System.out.println();System.out.println(公共变量的初值是:+variable); int sort = new intProcessNum;for(int i=0;isort.length;i+) sor

14、ti=processProi;for(int i=0;isort.length;i+) int temp;for(int j=0;jsort.length-1;j+) if(sortjsortj+1)temp=sortj; sortj=sortj+1;sortj+1=temp;System.out.println(优先级排序:) ; for(int i=0;isort.length;i+)System.out.println(sorti);System.out.println();System.out.println(进程被执行的顺序为:); for(int i=0;isort.length

15、;i+)int j=0; while(sorti!=processProj )if (jprocessPro.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()27System

16、.out.println();System.out.println();System.out.println(-先来先服务算法被调度);System.out.println();System.out.println(进程被执行的顺序为:); for(int i=0; iexcuteQueue.length;i+)int j=0; while(excuteQueuei!=processIdj )if(jprocessId.length-1 )j+;System.out.println(Step+i+:执行+processNamej);/processWki.run(); processWkj.w

17、orkMethod(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.prin

18、tln(进程刚被创建是的信息如下:); System.out.println();for(int i=0;iPcb_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;28Proce

19、ss.pcb_Begintime.minute = Time.getMinutes(); Process.pcb_Begintime.secend = Time.getSeconds(); Process.pcb_Statue =Wait;class ProMeth extends Workpublic void run()publicvoid workMethod(int id,int sletim) System.out.println(); System.out.println(Process+id+: Start running!); System.out.println();Date

20、 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;i20;i+)variable=variable+i;try sle

21、ep(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();29Process.pcb

22、_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; processBt1

23、i=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_Needti

24、me);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_bloc

25、k String pcb_Name; int pcb_ID;30int 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 Thread public void run()public static void main(String args) int var=0;Work p=

26、 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;先来先服务调度方法:31public static void FIFS_meth

27、od() System.out.println();System.out.println();System.out.println(-先来先服务算法被调度);System.out.println();System.out.println(进程被执行的顺序为:); for(int i=0; iexcuteQueue.length;i+)int j=0; while(excuteQueuei!=processIdj )if(jprocessId.length-1 )j+;System.out.println(Step+i+:执行+processNamej);/processWki.run(); p

28、rocessWkj.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.p

29、cb_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;32PCB# );System.out.println(#Process+i+刚创建时的信息System.out.println(); System.out.println(Na

30、me:+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:

31、+Pcb_Quei.pcb_Statue); System.out.println();proIDi = Pcb_Quei.pcb_ID ;excuteQueue = proID;/被创建进程的存贮数组public static void store_ProcessInfoArray()/进程信息类class PCB_block String pcb_Name; int pcb_ID;int pcb_Pro;PCB_Begintime pcb_Begintime= new PCB_Begintime(); int pcb_Needtime;int pcb_Spendtime; int pcb_

32、Finishtime; String pcb_Statue;Work pcb_Work = new Work();/进程工作的线程class Work extends Thread33public 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) trysleep(sletim);catch(

33、Exception e) System.out.println(e.toString() );void workMethod(int id,int sletim)/时间的分和时类class PCB_Begintime int 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 i

34、nt processID ; public static int ProcessNum=5;34public 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 StringProce

35、ssNum; 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;publ

36、ic static String processSta = new StringProcessNum; public static Work processWk = new WorkProcessNum;/主调方法public static void main(String args)/int ProcessNum=Integer.parseInt(args0);/命令行输入创建进程的个数;/intcallMethod=Integer.parseInt(args0);/命令行输入调用的算法FIFS 值为 1 或 优先级值为 2; printSign();System.out.println(创

37、建的进程数量是:+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.

38、out.println();35System.out.println(-最高优先数算法被调度);System.out.println();System.out.println(公共变量的初值是:+variable); int sort = new intProcessNum;for(int i=0;isort.length;i+) sorti=processProi;for(int i=0;isort.length;i+) int temp;for(int j=0;jsort.length-1;j+) if(sortjsortj+1) temp=sortj;sortj=sortj+1; sor

39、tj+1=temp;System.out.println(优先级排序:) ; for(int i=0;isort.length;i+) System.out.println(sorti);System.out.println();System.out.println(进程被执行的顺序为:); for(int i=0;isort.length ;i+)int j=0; while(sorti!=processProj ) if (jprocessPro.length-1 )j+;System.out.println(Step+i+:执行+processNamej); int sleeptime

40、=(int)(Math.random()*10000); processWkj.workMethod(j,sleeptime) ;/processWki.run();System.out.println(公共变量的当前值是:+variable);进程创建方法static void process_Create(int Process_ProcessNum)36PCB_block Pcb_Que =new PCB_blockProcess_ProcessNum; int proID = new intPcb_Que.length;System.out.println(进程刚被创建是的信息如下:)

41、;System.out.println();for(int i=0;iPcb_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.minu

42、te= Time.getMinutes(); Process.pcb_Begintime.secend= Time.getSeconds(); Process.pcb_Statue =Wait;class ProMeth extends Work public void run()publicvoid workMethod(int id,int sletim) System.out.println(); System.out.println(Process+id+:Start running!); System.out.println();Date date1 = new Date();Sys

43、tem.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;i20;i+) variable=variable+i;try /sleep(sleeptime);sleep(slee

44、ptime);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*创建的进程数量是:5进程刚被创建是的信息如下: #Process0刚创建时的信息PCB#Name:process0createTime:Thu Dec 15 15:41:14 CST 2005 ID:0Needtime:164Pro:9 Spendtime:0current status:Wait #Process1刚创建时的信息PCB#Name:process1createTime:Thu Dec 15 15:41:14 CST 2005 ID:10Needtime:636Pro:11Spendtime:0 current status:Wait#Process2刚创建时的信息PCB#Name:process2createTi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论