题目 名称 院系 指导老师 组长 联系电话 组长(姓名、学号) 成员(姓 名、学号) 进程调度模拟系统 班级 完成时间 2013.1.8 本次实验成绩 邮件地址 主要 任务 主要 任务 需求分析,模块设计与代码编写,组织任务分配,PPT制作,实验报告审定,材料汇总等 代码的编写 实验报告的编写、材料查找等 题目 实验介绍 原理 进程调度:模拟FCFS和SJF进程调度过程 现在的处理机任务量大,多个进程会不同时先后到达,并且各个进程的工作时间也不一定相同,为了使各个进程间不发生冲突,有条不紊的先后运行,并以最短的时间占用处理机, 面对这种发展状况,有必要使用进程调度算法来提高处理机的工作效率。去选择合适的一种进程调度算法达到理想的效果,可以做到信息的规范管理、科学统计和快速运作,从而减少时间上的浪费。 用Java语句设计实现登陆界面,直观显示各种算法和调度结果,直观地显示运行结果,设计进程调度算法实现用不同算法(先来先服务,短作业优先,高响应比优先调度算法,时间片轮转算法)进行进程调度,算出最短周转时间,实现高效率调度算法。 参考资料 [1] 黄祥喜,计算机操作系统实验教程。广州:中山大学出版社,1994. [2] 汤子瀛,《计算机操作系统(修订版)》西安电子科技大学出版社 [3] Andrew S.Tanenbaum,现代操作系统,机械工业出版社。 [4] (美)Bruce Eckel. Java编程思想. 陈昊鹏译. 北京:机械工业出版社,2007 [5] 王路群.Java高级程序设计.北京:中国水利水电出版社,2006 [6] 孙卫琴. 精通Struts:基于MVC的Java Web设计与开发.北京:电子工业出版社,2004.08 实验环境(软件和硬件): (1)硬件要求 EGA或VGA卡彩显或单显(640×350以上),单机内存2M以上,硬盘40M以上。客户端计算机采用586以上机型,客户端应用程序可以稳定的运行在 Windows07 xp操作系统之上。 (2)软件要求 实现前台登陆界面,需用到JAVA语句,需要安装MyEclipse软件。 实验实现 数据结构的定义 (1) 进程个数 N (2) 进程号 b[i][0] (3) 提交时间 b[i][1] (4) 运行时间 b[i][2] (5) 开始时间 b[i][3] (6) 结束时间 b[i][4] (7) 周转时间 b[i][5] (8) 带权周转时间 b[i][6] 算法介绍(可以是流程图、可以是类C代码、可以是文字算法描述。) 进入系统 构造运行界面 构造函数 实现按钮监听 实现算法功 实现主函数 1. FCFS算法 FCFS算法是最简单的算法,每次调度是从就绪的进程队列中,选择一个最先进入该队列的进程,为之位置分配处理机,使之运行。 (1)先对各进程的提交顺序进行升序排列,选择最先提交的进程开始运行。 (2)对已运行结束的进程结束时间与下一个提交的进程时间比较,若大于下一个进程的提交时间,则下一个进程的开始运行时间就是上一个进程的结束时间,否则,下一个进程的开始运行时间就是自己的提交时间。 (3)依次向后运行。 2. SJF算法 SJF算法是以作业的长短来计算优先级,作业越短优先级越高。作业长短用所要求的运行时间来衡量。 (1)先对各进程的提交顺序进行升序排列,选择最先提交的进程开始运行。 (2)对已运行结束的进程结束时间与下一个提交的进程时间比较,若大于下一个进程的提交时间,则下一个进程的开始运行时间就是上一个进程的结束时间,再次对刚运行结束的进程的结束时间与下一个提交的进程时间进行比较; 若已运行结束的进程结束时间小于下一个提交的进程时间,则再找到刚刚运行结束的进程结束时间大于余下的的进程提交时间,在这两个进程之间对运行时间升序排列,找到运行时间最短的,开始投入运行。然后对余下的进程的提交时间排序,按此操作循环进行。 (3)依次向后运行。 3. 时间片轮转调度算法 时间片轮转法表示的是系统在给定的时间内,响应所有用户的要求。 (1)将所有进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。 (2)执行时间片用完时,由一个计时器发出时钟中断请求,调度程序据此信号来停止该进程的执行,并把他送往就绪队列的末尾。 (3)把处理机分配给就绪队列中新的队首进程,同时也让他执行一个时间片。这样就可以保证就绪队列中的所有进程在给定的时间内,均获得一时间片的处理执行时间。 4.高响应比优先调度算法 该算法综合考虑到先来先服务和短作业优先算法的优缺点,改善了处理机调度的性能。从而引入了优先权,优先权越高,先运行。 优先权=(当前时间-提交时间)/运行时间+1 当前时间是刚刚运行的进程的结束时间,提交时间是准备运行的进程的提交时间。 (1)先对各进程的提交顺序进行升序排列,选择最先提交的进程开始运行。 (2)对已运行结束的进程结束时间与下一个提交的进程时间比较,若大于下一个进程的提交时间,则比较剩下的进程的优先权,优先权越大则先运行。下一个进程的开始运行时间就是上一个进程的结束时间,再次对刚运行结束的进程的结束时间与下一个提交的进程时间进行比较;然后对余下的进程的提交时间排序,按此操作循环进行。 若已运行结束的进程结束时间小于下一个提交的进程时间,则找到最先提交的进程投入运行, 再次比较优先权。 (3)依次向后运行。 5.Java运行界面的实现 使用Java中GUI界面设计,实现各个按钮,文本和标签,再附上一个面板,把表格放到面板上,对于各个按钮实现监听便可对其产生作用。 6.系统模块设计及调试 1.开始界面——任意设置进程个数 2.先来先服务算法运行结果 3.短作业优先算法运行结果 4.时间片轮转调度算法运行结果 5.高响应比优先调度算法运行结果 本次实践计划、进度安排及完成情况 实践计划 1.资料收集和总结 2.需求分析和算法设计,界面设计 3.编程实现及调试,小组讨论及改进 4.实验报告及PPT汇报 进度安排 12.10—12.13 任务分配,资料收集和汇总 12.14—12.18 需求分析,组员讨论 12.19—12.23 算法设计,界面设计,组员讨论 12.24—1.3 1.4—1.8 完成情况 填写人 完成情况 组织任务分配, 材料汇总,需求分析,模块设计与代码编写,实验报告审定,PPT制作 编程实现及调试,组员讨论 实验报告及PPT汇报 收集资料,需求分析,编写部分程序代码 资料查找,需求分析,实验报告编写 资料查找,实验报告整理 收集资料,需求分析,材料总结,PPT整理 实验心得 **:此次操作系统课程设计,作为组长,主要任务为组织任务分配,在技术方面负责需求分析,模块设计与代码编写, PPT制作,实验报告审定,材料汇总等。我们采用JAVA语言设计进程调度模拟系统,在给定题目的基础上,增加了两个调度算法,在此模拟系统中实现了四种基本进程调度,并利用GUI设计的优势设计出良好的界面风格。从课题确定到正式成稿的一个月过程中,我们进行了合理的计划安排和任务分配,组员合作十分融洽,并每周进行一次集中讨论交流,最终较好地完成了预定目标。在编程实践中,我对JAVA语言有了进一步的深入,对进程调度有了更深入的认识。此次团队合作也使我更加明确集体合作的重要性,大家共同讨论,共同搜集资料,集思广益,项目才能圆满完成。相信每一位组员也都收获颇多,很感谢有这么一次机会和大家合作,这会是一次难忘的经历。 **:在这次操作系统课程设计中,我的主要任务是编写部分代码。另外,我也协助编写了实验报告以及资料的收集。编写代码过程中,我认真回顾了上学期操作系统的知识及JAVA和C语言的知识,并仔细编写研究了代码,进行了多次的修改。通过此次课程设计,我对四个进程调度有了更深入的理解(特别是时间片轮转算法),同时我的编程能力也得到了提高,综合运用各种编程语言的能力得到了很好的锻炼,很庆幸有这次锻炼的机会。这次小组分工干活更体现出了合作的优越性,相信对我今后的学习和工作会有很大帮助。 ***:此次课程设计,我参与了实验报告的编写以及资料的查找。在实验报告编写前,我需要对所描述的四个进程有充分的了解,明白他们各自的流程,以及多具有的优缺点;并明白所编写的代码的原理及具体的操作。这些要求也让我对操作系统的调度进程有了进一步的了解与认识,并掌握了对于进程代码的编写与具体操作。小组成员各有分工,也让我明白了分工合作的重要性。 ***:在这次课程设计中,我担任了查找资料和编写实验报告的任务。在这一过程中,我更深入的了解了四个进程调度的流程、运行及优缺点,并且对进程代码的编写有了一定的了解。对于自己的一些不足,小组成员能够耐心帮助,更让我体会到合作的重要性。 **:经过这次操作系统课程设计的项目,我对操作系统中学到的知识认识的更清晰,更透彻。我也明白了个人的能力有限,而集体的能力无限,我们小组共同思考,共同讨论,共同搜集资料,集思广益,项目才能完成的圆满。在此次项目中,我参与了查找资料,需求分析,整理ppt等任务。项目的完成与每一个成员的付出和努力分不开关系,我很感谢这次课设项目提供给我们的机会。 备注 (包括源程序清单及其它说明) 源程序清单 package NEW2; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class OS extends JFrame implements ActionListener{ JButton b1, b2, b3, b4; JTable table; JTextField j2, j3; String str = JOptionPane.showInputDialog(\"请输入进程数:\"); int N = Integer.parseInt(str); String process_num = null; String arrive_time = null; String service_time = null; String start_time = null, end_time = null, total_time = null, weightotal_time = null; String a[][] = new String[N][7]; String[] name = { \"进程号\\"提交时间\\"运行时间\\"开始时间\\"结束时间\周转时间\带权周转时间\" }; double avgtotal_time, avgweightotal_time; public OS() { super(\"进程调度算法演示系统_2012_OS课程设计\"); Container c = getContentPane(); GridBagLayout f = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); c.setLayout(f); table = new JTable(a, name); JScrollPane p1 = new JScrollPane(table); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridheight = 60; gbc.fill = GridBagConstraints.HORIZONTAL; f.setConstraints(p1, gbc); c.add(p1); JLabel label6; label6 = new JLabel(\"请输入\" + N + \"组[进程号]+[提交时间]+[运行时间]:\"); label6.setFont(new Font(\"楷体\ label6.setForeground(new Color(250, 0, 0)); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridheight = 1; f.setConstraints(label6, gbc); c.add(label6); JLabel label7 = new JLabel(\" \"); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridheight = 1; f.setConstraints(label7, gbc); c.add(label7); JLabel label2 = new JLabel(\"平均周转时间:\"); label2.setFont(new Font(\"楷体\ gbc.gridwidth = 1; gbc.gridheight = 1; f.setConstraints(label2, gbc); c.add(label2); j2 = new JTextField(10); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridwidth = 1; gbc.gridheight = 1; f.setConstraints(j2, gbc); j2.setText(\"\" + avgtotal_time); c.add(j2); JLabel label3 = new JLabel(\"平均带权周转时间:\"); label3.setFont(new Font(\"楷体\ gbc.gridwidth = 1; gbc.gridheight = 1; f.setConstraints(label3, gbc); c.add(label3); gbc.gridheight = 1; j3 = new JTextField(1); gbc.ipadx = 1; gbc.ipady = 1; ; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridheight = 1; f.setConstraints(j3, gbc); j3.setText(\"\" + avgweightotal_time); c.add(j3); b1 = new JButton(\"先来先服务\"); b1.setFont(new Font(\"楷体\ gbc.gridwidth = 1; gbc.gridheight = 1; f.setConstraints(b1, gbc); c.add(b1); b2 = new JButton(\"短作业优先\"); b2.setFont(new Font(\"楷体\ gbc.gridwidth = 1; gbc.gridheight = 1; f.setConstraints(b2, gbc); c.add(b2); b3 = new JButton(\"时间片轮转\"); b3.setFont(new Font(\"楷体\ gbc.gridwidth = 1; gbc.gridheight = 1; f.setConstraints(b3, gbc); c.add(b3); b4 = new JButton(\"高响应比优先\"); b4.setFont(new Font(\"楷体\ gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridheight = 1; f.setConstraints(b4, gbc); c.add(b4); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); setSize(500, 580); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for (int i = 0; i < N; i++) for (int j = 0; j < 3; j++) { System.out.println(a[i][j]); } } public void actionPerformed(ActionEvent e) { int i, j, n, p, h; double t, s, m; double b[][] = new double[N][7]; if (e.getSource().equals(b1))// /////////////////////////////先来先服务 { try { for (i = 0; i < N; i++) { for (j = 0; j < 3; j++) { b[i][j] = Double.parseDouble(a[i][j]); } } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (b[i][1] <= b[j][1]) { t = b[i][1]; b[i][1] = b[j][1]; b[j][1] = t; s = b[i][2]; b[i][2] = b[j][2]; b[j][2] = s; m = b[i][0]; b[i][0] = b[j][0]; b[j][0] = m; } } } b[0][3] = b[0][1]; b[0][4] = b[0][3] + b[0][2]; b[0][5] = b[0][4] - b[0][1]; b[0][6] = b[0][5] / b[0][2]; for (i = 1; i < N; i++) { if (b[i - 1][4] >= b[i][1]) { b[i][3] = b[i - 1][4]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } else { b[i][3] = b[i][1]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } } for (i = 0; i < N; i++) { for (j = 0; j < 7; j++) { table.setValueAt(\"\" + b[i][j], i, j); } } } catch (Exception ee) { ee.printStackTrace(); } } if (e.getSource().equals(b2))// /////////////////////////////短作业优先{ try { for (i = 0; i < N; i++) { for (j = 0; j < 3; j++) { b[i][j] = Double.parseDouble(a[i][j]); } } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (b[i][1] < b[j][1]) { t = b[i][1]; b[i][1] = b[j][1]; b[j][1] = t; s = b[i][2]; b[i][2] = b[j][2]; b[j][2] = s; m = b[i][0]; b[i][0] = b[j][0]; b[j][0] = m; } } } b[0][3] = b[0][1]; b[0][4] = b[0][3] + b[0][2]; b[0][5] = b[0][4] - b[0][1]; b[0][6] = b[0][5] / b[0][2]; for (i = 1; i < N; i++) { if (b[i - 1][4] >= b[i][1]) { for (j = i; j < N; j++) { if (b[i - 1][4] < b[j][1]) { h = j; for (p = i; p < h; p++) { for (n = i; n < h; n++) { if (b[p][2] < b[n][2]) { t = b[p][1]; b[p][1] = b[n][1]; b[n][1] = t; s = b[p][2]; b[p][2] = b[n][2]; b[n][2] = s; m = b[p][0]; b[p][0] = b[n][0]; b[n][0] = m; } } } b[i][3] = b[i - 1][4]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } } if (b[i - 1][4] >= b[N - 1][1]) { for (p = i; p < N; p++) { for (n = i; n < N; n++) { if (b[p][2] < b[n][2]) { t = b[p][1]; b[p][1] = b[n][1]; b[n][1] = t; s = b[p][2]; b[p][2] = b[n][2]; b[n][2] = s; m = b[p][0]; b[p][0] = b[n][0]; b[n][0] = m; } } } } } b[i][3] = b[i - 1][4]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } } if (b[i - 1][4] < b[i][1]) { b[i][3] = b[i][1]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } for (i = 0; i < N; i++) { for (j = 0; j < 7; j++) { table.setValueAt(\"\" + b[i][j], i, j); } } } catch (Exception ee) { ee.printStackTrace(); } if (e.getSource().equals(b3))// /////////////////////////////时间片轮转 { JTextField txt = new JTextField(5); String val = JOptionPane.showInputDialog(\"请输入时间片:\"); txt.setText(val); Double slice = Double.parseDouble(txt.getText()); // /////////////////////////////时间片轮转法 int t0 = 1,t1 = 0,m1 = 1,m0 = 0; Double c[] = new Double[N]; for (i = 0; i < c.length; i++) c[i] = 0.0; for (i = 0; i < N; i++) { for (j = 0; j < 3; j++) { b[i][j] = Double.parseDouble(a[i][j]); } } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (b[i][1] <= b[j][1]) { t = b[i][1]; b[i][1] = b[j][1]; b[j][1] = t; s = b[i][2]; b[i][2] = b[j][2]; b[j][2] = s; m = b[i][0]; b[i][0] = b[j][0]; b[j][0] = m; } } } Double r = b[0][1] ; b[0][3] = b[0][1]; while (t0 == 1) { t1 = 0; for (i = m0; i < m1 + m0; i++) { if (c[i] < b[i][2]) {t1 = 1;break;} } if (t1== 1) { for (i = m0; i < m1 + m0; i++) { if (c[i] < b[i][2]) { c[i] = c[i] + slice; r = r + slice; if (c[i] == b[i][2]) b[i][4] = r; } } while(m1 <= N-1){ if(b[m1][1] <= r){ b[m1][3] = r; c[m1] = c[m1] + slice; r = r + slice; m1 = m1 + 1;} } } else { for (i = 0; i < N; i++) { if (c[i] ==0.0) { m0 = i; r = r + b[i][1]; break; } b[m0][3] = b[m0][1]; } } t0 = 0; for (i = 0; i < N; i++) if (c[i] < b[i][2]) {t0 = 1;break;} } for (i = 0; i < N; i++) { b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } for (i = 0; i < N; i++) { for (j = 0; j < 7; j++) { table.repaint(); table.setValueAt(\"\" + b[i][j], i, j); } } } if (e.getSource().equals(b4))// /////////////////////////////高响应比优先调度 { double tt, ss, mm; double d[] = new double[N]; try { for (i = 0; i < N; i++) { for (j = 0; j < 3; j++) { b[i][j] = Double.parseDouble(a[i][j]); } } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (b[i][1] < b[j][1]) { t = b[i][1]; b[i][1] = b[j][1]; b[j][1] = t; s = b[i][2]; b[i][2] = b[j][2]; b[j][2] = s; m = b[i][0]; b[i][0] = b[j][0]; b[j][0] = m; } } } b[0][3] = b[0][1]; b[0][4] = b[0][3] + b[0][2]; b[0][5] = b[0][4] - b[0][1]; b[0][6] = b[0][5] / b[0][2]; for (i = 1; i < N; i++) { for (j = i; j < N; j++) { d[j] = (b[i - 1][4] - b[j][1] + b[j][2]) / b[j][2]; } if (b[i - 1][4] >= b[i][1]) { for (j = i; j < N; j++) { for (p = i; p < N; p++) { if (d[j] >= d[p]) { t = d[j]; d[j] = d[p]; d[p] = t; tt = b[j][0]; b[j][0] = b[p][0]; b[p][0] = tt; s = d[j]; d[j] = d[p]; d[p] = s; ss = b[j][1]; b[j][1] = b[p][1]; b[p][1] = ss; m = d[j]; } d[j] = d[p]; } } } d[p] = m; mm = b[j][2]; b[j][2] = b[p][2]; b[p][2] = mm; b[i][3] = b[i - 1][4]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } else { b[i][3] = b[i][1]; b[i][4] = b[i][3] + b[i][2]; b[i][5] = b[i][4] - b[i][1]; b[i][6] = b[i][5] / b[i][2]; } } for (i = 0; i < N; i++) { for (j = 0; j < 7; j++) { table.repaint(); table.setValueAt(\"\" + b[i][j], i, j); } } } catch (Exception ee) { ee.printStackTrace(); } } for (i = 0; i < N; i++) {avgtotal_time=avgtotal_time+b[i][5]; avgweightotal_time = avgweightotal_time + b[i][6]; } avgtotal_time = avgtotal_time / N; j2.setText(\"\" + avgtotal_time); avgweightotal_time = avgweightotal_time / N; j3.setText(\"\" + avgweightotal_time); public static void main(String args[]) { OS a = new OS(); } }
因篇幅问题不能全部显示,请点此查看更多更全内容