
实验一单处理器调度算法的实现.docx
7页试验一 单处理器调度算法的实现班级:运算机 04-1 班学号: 04034040112姓名: 汀芷约 成果: 日期: _ 2006-11-02试验一 单处理器调度算法的实现一、 试验目的在多道程序或多任务系统中, 系统同时处于就绪态的进程有如干个; 为了使系统中的各进程能有条不紊地运行,必需挑选某种调度策略,以挑选占用处理机;要求同学设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念;二、 试验内容设计一个按时间片轮转法调度的算法;提示:1、假设系统有 5 个进程,每个进程用一个进程掌握块 PCB 来代表; PCB的格式如下列图;其中,进程名即是进程标识;链接指针:指出下一个到达进程的进程掌握块首地址;根据进程到达的次序排队;系统设置一个队头和队尾指针分别指向第一个和最终一个进程;新生成的进程放队尾;2、为每个进程任意确定一个要求运行时间和到达时间;3、根据进程到达的先后次序排成一个循环队列; 再设一个队首指针指向第一个到达进程的首地址;4、执行处理机调度时, 开头挑选队首的第一个进程运行; 另外再设一个当前运行进程指针,指向当前正运行的进程;5、由于本试验是模拟试验, 所以对被选中进程并不实际启动运行, 而是执行:一是估量运行时间减 1;二是输出当前运行进程的名字;用这两个操作来模拟进程的一次执行;6、进程运行一次后, 以后的调度就将当前指针依次下移一个位置, 指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程;同时仍应当判定该进程的剩余运行是否为 0;如不为 0,就等待下一轮的运行; 如该进程的剩余时间为 0,就将该进程的状态置为 C,并退出循环队列;7、如就绪队列不空,就重复上述的( 5)和( 6)步骤直到全部进程都运行为止;8、在所设计的调度程序中, 应包含显示或打印语句; 以便显示或打印每次选中进程的名称及运行一次后队列的变化情形;三、试验说明1、 程序中使用的数据结构及符号说明:数据结构:数组 data[][]符号说明: 每个进程的状态是就绪 W( Wait )、运行 R( Run)、或完成 C( Complete )三种状态之一;2、程序流程图:输入 name,arrivetime,runtimeState 到数组 data[][]调用 paiXu〔〕 方法调用 diaoDuSuanFa〔〕方法四、试验源程序import java.io.BufferedReader; import java.io.IOException;import java.io.InputStreamReader;public class ShiJianPianDiaoDu { // 调度算法static void diaoDuSuanFa〔Object data[][]〕 { int count = 0, i1 = 0;Object t[];for 〔int i = 0; i < data.length; i++〕 { i1 += 〔Integer〕 data[i][2];}for 〔int j = 0; j < i1; j++〕{if 〔data[0][3] .= "C"〕 { t = data[0];data[0][2] = 〔Integer〕 data[0][2] - 1;if 〔〔Integer〕 data[0][2] == 0〕 {data[0][3] = "C";for 〔int i = 0; i < data.length - 1; i++〕 { data[i] = data[i + 1];}data[data.length - 1] = t; println〔data〕;System.out.println〔"------------------------------"〕;count++;} else {for 〔int i = 0; i < data.length - 1 - count; i++〕 { data[i] = data[i + 1];}data[data.length - 1 - count] = t; println〔data〕;System.out.println〔"------------------------------"〕;}}}}static void paiXu〔Object data[][]〕 // 排序{Object t[];for 〔int i = 0; i < data.length - 1; i++〕 {for 〔int j = 0; j < data.length - i - 1; j++〕if 〔〔Integer〕 data[j][1] > 〔Integer〕 data[j + 1][1]〕 { t = data[j];data[j] = data[j + 1];data[j + 1] = t; }}}static void println〔Object data[][]〕 // 打印{for 〔int i = 0; i < data.length; i++〕 {System.out.println〔" " + data[i][0] + "\t" + data[i][1]+ "\t" + data[i][2] + "\t" + data[i][3]〕; }}public static void main〔String[] args〕 { int n = 0, count = 1;String s;System.out.println〔" 时间片为 1"〕;System.out.print〔" 输入进程数 :"〕; try {BufferedReader br = new BufferedReader〔new InputStreamReader〔 System.in〕〕;s = br.readLine〔〕;n = Integer.parseInt〔s〕;} catch 〔IOException e〕 {} //data[name,arrivetime,runtime,state] Object data[][] = new Object[n][4];for 〔int i = 0; i < n; i++〕 {try {System.out.print〔" 请输入第 " + count + " 个进程的名字 :"〕; BufferedReader br = new BufferedReader〔new InputStreamReader〔System.in〕〕; data[i][0] = br.readLine〔〕;System.out.print〔" 到达时间 〔s〕:"〕;s = br.readLine〔〕;data[i][1] = Integer.parseInt〔s〕;System.out.print〔" 运行时间 〔s〕:"〕; s = br.readLine〔〕;data[i][2] = Integer.parseInt〔s〕;} catch 〔Exception e〕 {} data[i][3] = "R"; count++;}paiXu〔data〕; System.out.println〔"name\t"+"arrivetime\t"+"runtime\t"+"state"〕; diaoDuSuanFa〔data〕;}}五、运行结果六、试验体会为了使系统中的各进程能有条不紊地运行,必需挑选调度策略,而进程调度算法有 FIFO,优先数调度算法,时间片轮转调度算法,本次试验运用的是时间片轮转调度算法;通过本次试验,我巩固和加深处理机调度的概念,为操作系统这门课程打下了坚实的基础;。












