《程序模拟磁盘调度设计--实验4实验报告.doc》由会员分享,可在线阅读,更多相关《程序模拟磁盘调度设计--实验4实验报告.doc(16页珍藏版)》请在三一办公上搜索。
1、操作系统实验报告年级、专业、班级2010级信安一班2010级信安二班姓名 实验题目程序模拟磁盘调度设计实验时间 2013.5.21实验地点主教0416实验成绩 实验性质验证性 设计性 综合性教师评价:算法/实验过程正确; 源程序/实验内容提交 程序结构/实验步骤合理;实验结果正确; 语法、语义正确; 报告规范; 其他: 评价教师签名:一、实验目的设计程序实现FIFO、SSTF、SCAN和C-SCAN算法模拟磁盘调度。二、实验项目内容设计程序实现分析四种不同的磁盘调度算法,统计每种算法的磁道移动数。程序功能:1.设计程序实现FIFO、SSTF、SCAN以及C-SCAN四种不同的磁盘调度算法。2.
2、磁盘调度请求序列长度不少于100。3.给出每种调度的服务序列。4.统计每种调度的磁道移动数。5.根据实验结果,对四种调度算法进行分析评价。三、实验过程或算法(源程序)程系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。模块调用关系图: 1、先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多
3、的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2、最短寻道时间优先算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。3、扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外
4、移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。 4、循环扫描算法(CSCAN)循环扫描算法是对扫描算法的
5、改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。 注:以上算法的实现程序见附录一源代码。 四、实验结果及分析和(或)源程序调试过程1. 主界面: 4-1.主界面2. 在“磁盘磁道数”、“被请求磁道数”、“当前磁道”输入框中输入相应内容,则随机生成并在“磁道请求序列”显示框中显
6、示生成的请求序列: 图4-2 生成序列3. 在组合框中选择相应的算法进行模拟,在“调度服务序列”显示框显示相应算法的调度序列及磁道号移动距离: 图4-3 FIFO算法模拟结果 图 4-4 SSTF算法模拟结果 图4-5 SCAN算法模拟结果 图 4-6 C-SCAN算法模拟结果演示结束。五、心得体会:通过本次实验,我对四种磁盘调度算法策略有了更深的了解,理解了操作系统关于磁盘管理的一些方法,并通过编程实现了FIFO算法,SSTF算法,SCAN算法,C-SCAN算法。也进一步提高了我们的编程能力,从中学会了很多。六、附录(程序源代码) DiskScheduling.javaimport java
7、.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.util.Random;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import java
8、x.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class DiskScheduling extends JFrame implements ActionListenerJTextField jtext1 = new JTextField() ;JTextField jtext2 = new JTextFie
9、ld() ;JTextField jtext3 = new JTextField() ; JTextArea jtext4 = new JTextArea() ; JTextArea jtext5 = new JTextArea() ;JTextArea text1 =new JTextArea();JTextArea text2 =new JTextArea();JLabel lab1 = new JLabel(磁盘磁道数);JLabel lab2 = new JLabel(被请求磁道数);JLabel lab3 = new JLabel(当前磁道 );JLabel lab4 = new J
10、Label(寻道总长度:);JLabel lab5 = new JLabel(平均寻道长度 :);JLabel lab6 = new JLabel(磁道请求序列 :);JLabel lab7 = new JLabel(调度服务序列 :);JPanel pan1=new JPanel();JPanel pan2=new JPanel();JPanel pan3=new JPanel();JPanel pan4=new JPanel();JPanel pan5=new JPanel();JPanel pan6=new JPanel();JButton make;private String fla
11、g = 请选择.,FIFO,SSTF,SCAN,C-SCAN;private JComboBox jcbo = new JComboBox(flag);private int num;private int kai;private int sum;private int disknum;private int m=0,n=0;private int s;private int s1;private int c1;private int c2;/Draw draw;public DiskScheduling()make = new JButton(生成随机序列);make.setSize(130
12、,25);make.setLocation(250, 10);make.addActionListener(this);lab1.setSize(100,25);lab1.setLocation(20, 10);lab2.setSize(100,25);lab2.setLocation(20, 50);lab3.setSize(100,25);lab3.setLocation(20, 90);lab4.setSize(100,25);lab4.setLocation(20, 130);lab5.setSize(100,25);lab5.setLocation(160,130 );lab6.se
13、tSize(100,25);lab6.setLocation(20,165 );pan2.setLayout(null);jtext1.setSize(100, 25);jtext1.setLocation(130, 10);jtext1.setText(0);jtext2.setSize(100, 25);jtext2.setLocation(130, 50);jtext2.setText(0);jtext3.setSize(100, 25);jtext3.setLocation(130, 90);jtext3.setText(0);jtext4.setSize(50, 25);jtext4
14、.setLocation(100, 135);jtext4.setEditable(false);jtext4.setText(0);jtext4.setOpaque(false);jtext5.setSize(50, 25);jtext5.setLocation(265, 135);jtext5.setEditable(false);jtext5.setText(0);jtext5.setOpaque(false);jcbo.setSize(130, 25);jcbo.setLocation(250, 90);jcbo.setEnabled(false);jcbo.addItemListen
15、er(new ItemListener()Overridepublic void itemStateChanged(ItemEvent e) / TODO Auto-generated method stubif(jcbo.getSelectedIndex() = 1)fifo();else if(jcbo.getSelectedIndex() = 2)sstf();else if(jcbo.getSelectedIndex() = 3)scan();else if(jcbo.getSelectedIndex() = 4)cscan(););pan2.add(lab1);pan2.add(la
16、b2);pan2.add(lab3);pan2.add(lab4);pan2.add(lab5);pan2.add(lab6);pan2.add(jtext1);pan2.add(jtext2);pan2.add(jtext3);pan2.add(jtext4);pan2.add(jtext5);pan2.add(jcbo);pan2.add(make);pan2.setSize(450, 190);pan2.setLocation(2, 2);text1.setLineWrap(true);text1.setWrapStyleWord(true);text1.setEditable(fals
17、e);JScrollPane scrollPane1 = new JScrollPane( text1);pan3.setLayout(new BorderLayout();pan3.add(scrollPane1, BorderLayout.CENTER);pan3.setSize(450,120);pan3.setLocation(2,203);text2.setLineWrap(true);text2.setWrapStyleWord(true);text2.setEditable(false);JScrollPane scrollPane2 = new JScrollPane( tex
18、t2);pan4.setLayout(new BorderLayout();pan4.add(scrollPane2, BorderLayout.CENTER);pan4.setSize(450,120);pan4.setLocation(2,360);lab7.setSize(100,25);pan5.setLayout(null);lab7.setLocation(20, 10);pan5.add(lab7);pan5.setSize(450,35);pan5.setLocation(2,324); pan1.setLayout(null); pan1.add(pan2); pan1.ad
19、d(pan3); pan1.add(pan5); pan1.add(pan4); setLayout(new GridLayout(1,2,5,5);add( pan1,BorderLayout.CENTER);public void creat() m = 0; n = 0; Random rnd = new Random(); kai = Integer.parseInt(jtext3.getText(); num = Integer.parseInt(jtext2.getText(); disknum = Integer.parseInt(jtext1.getText(); if(kai
20、 disknum & num!=0 & kai!=0) s = new intnum; s1 = new intnum; c1 = new intnum; c2 = new intnum; for(int j=0;jnum;j+) sj= rnd.nextInt(disknum); for(int i=0;i disknum) j-; String stext = ; for(int i=0;inum;i+) stext+=si+ ; paixu(); text1.setText(stext); jcbo.setEnabled(true); else JOptionPane.showMessa
21、geDialog(this, 输入不正确,请重新输入!+n+提示:1.当前所在磁道数不能大于磁盘磁道数. + n+ 2.磁盘磁道数和被请求磁道数都不能为0., 警告!, JOptionPane.WARNING_MESSAGE); public void paixu() int su=kai; int t; for(int i=0;isi) c1m+=si; else c2n+=si; for(int i=0;im;i+) for(int j=i;jm;j+) if(c1ic1j) t=c1i;c1i=c1j;c1j=t; for(int i=0;in;i+) for(int j=i;jc2j)
22、 t=c2i;c2i=c2j;c2j=t; public void fifo() String stext=被访问的下一个磁道 磁道号移动距离+n; int su=kai; sum=0; for(int i=0;inum;i+) if(susi) s1i=si-su; else s1i=su-si; su=si; sum+=s1i; jtext4.setText(String.valueOf(sum); sum=sum/num; for(int i=0;inum;i+) stext+= +si+ +s1i+ ; stext+=n; stext+=平均寻道长度:+sum+ ; jtext5.se
23、tText(String.valueOf(sum); text2.setText(stext); public void sstf() String stext=被访问的下一个磁道 磁道号移动距离+n; int su=kai; int s2=new int100; sum=0; for(int i=0;im;i+) s2i =c1i; for(int i=0;in;i+) s2i+m=c2i; for(int i=0;inum;i+) if(sus2i) s1i=s2i-su; else s1i=su-s2i; su=s2i; sum+=s1i; jtext4.setText(String.v
24、alueOf(sum); sum=sum/num; for(int i=0;inum;i+) stext+= +s2i+ +s1i+ ; stext+=n; stext+=平均寻道长度:+sum+ ; jtext5.setText(String.valueOf(sum); text2.setText(stext); public void scan() String stext=被访问的下一个磁道 磁道号移动距离+n; int su=kai; int s2=new int100; sum=0; for(int i=0;in;i+) s2i =c2i; for(int i=0;im;i+) s2
25、i+n=c1i; for(int i=0;inum;i+) if(sus2i) s1i=s2i-su; else s1i=su-s2i; su=s2i; sum+=s1i; jtext4.setText(String.valueOf(sum); sum=sum/num; for(int i=0;inum;i+) stext+= +s2i+ +s1i+ ; stext+=n; stext+=平均寻道长度:+sum+ ; jtext5.setText(String.valueOf(sum); text2.setText(stext); public void cscan() String stex
26、t=被访问的下一个磁道 磁道号移动距离+n; int su=kai; int j=0; int s2=new int100; sum=0; for(int i=0;i=0;j+,i-) s2j+n=c1i; for(int i=0;inum;i+) if(sus2i) s1i=s2i-su; else s1i=su-s2i; su=s2i; sum+=s1i; jtext4.setText(String.valueOf(sum); sum=sum/num; for(int i=0;inum;i+) stext+= +s2i+ +s1i+ ; stext+=n; stext+=平均寻道长度:+s
27、um+ ; jtext5.setText(String.valueOf(sum); text2.setText(stext); Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stub if (e.getSource() = make) creat(); public static void main(String ar) DiskScheduling disk=new DiskScheduling(); disk.pack(); disk.setTitle(磁盘调度); /disk.setLocationRelativeTo(null); disk.setDefaultCloseOperation(EXIT_ON_CLOSE); disk.setSize(500,550); disk.setVisible(true);