程序模拟磁盘调度设计实验4实验报告.docx
《程序模拟磁盘调度设计实验4实验报告.docx》由会员分享,可在线阅读,更多相关《程序模拟磁盘调度设计实验4实验报告.docx(21页珍藏版)》请在冰点文库上搜索。
程序模拟磁盘调度设计实验4实验报告
《操作系统》实验报告
年级、专业、班级
2010级信安一班
2010级信安二班
姓名
实验题目
程序模拟磁盘调度设计
实验时间
2013.5.21
实验地点
主教0416
实验成绩
实验性质
□验证性□设计性□综合性
教师评价:
□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;
□实验结果正确;□语法、语义正确;□报告规范;
其他:
评价教师签名:
一、实验目的
设计程序实现FIFO、SSTF、SCAN和C-SCAN算法模拟磁盘调度。
二、实验项目内容
设计程序实现分析四种不同的磁盘调度算法,统计每种算法的磁道移动数。
程序功能:
1.设计程序实现FIFO、SSTF、SCAN以及C-SCAN四种不同的磁盘调度算法。
2.磁盘调度请求序列长度不少于100。
3.给出每种调度的服务序列。
4.统计每种调度的磁道移动数。
5.根据实验结果,对四种调度算法进行分析评价。
三、实验过程或算法(源程序)
程系统主界面可以灵活选择某种算法,算法包括:
先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
模块调用关系图:
1、先来先服务算法(FCFS)
这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2、最短寻道时间优先算法(SSTF)
该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
3、扫描算法(SCAN)
扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
4、循环扫描算法(CSCAN)
循环扫描算法是对扫描算法的改进。
如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。
这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。
例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
注:
以上算法的实现程序见附录一源代码。
四、实验结果及分析和(或)源程序调试过程
1.主界面:
4-1.主界面
2.在“磁盘磁道数”、“被请求磁道数”、“当前磁道”输入框中输入相应内容,则随机生成并在“磁道请求序列”显示框中显示生成的请求序列:
图4-2生成序列
3.在组合框中选择相应的算法进行模拟,在“调度服务序列”显示框显示相应算法的调度序列及磁道号移动距离:
图4-3FIFO算法模拟结果
图4-4SSTF算法模拟结果
图4-5SCAN算法模拟结果
图4-6C-SCAN算法模拟结果
演示结束。
五、心得体会:
通过本次实验,我对四种磁盘调度算法策略有了更深的了解,理解了操作系统关于磁盘管理的一些方法,并通过编程实现了FIFO算法,SSTF算法,SCAN算法,C-SCAN算法。
也进一步提高了我们的编程能力,从中学会了很多。
六、附录(程序源代码)
DiskScheduling.java
importjava.awt.BorderLayout;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.ItemEvent;
importjava.awt.event.ItemListener;
importjava.util.Random;
importjavax.swing.JButton;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
publicclassDiskSchedulingextendsJFrameimplementsActionListener{
JTextFieldjtext1=newJTextField();
JTextFieldjtext2=newJTextField();
JTextFieldjtext3=newJTextField();
JTextAreajtext4=newJTextArea();
JTextAreajtext5=newJTextArea();
JTextAreatext1=newJTextArea();
JTextAreatext2=newJTextArea();
JLabellab1=newJLabel("磁盘磁道数");
JLabellab2=newJLabel("被请求磁道数");
JLabellab3=newJLabel("当前磁道");
JLabellab4=newJLabel("寻道总长度:
");
JLabellab5=newJLabel("平均寻道长度:
");
JLabellab6=newJLabel("磁道请求序列:
");
JLabellab7=newJLabel("调度服务序列:
");
JPanelpan1=newJPanel();
JPanelpan2=newJPanel();
JPanelpan3=newJPanel();
JPanelpan4=newJPanel();
JPanelpan5=newJPanel();
JPanelpan6=newJPanel();
JButtonmake;
privateString[]flag={"请选择...","FIFO","SSTF","SCAN","C-SCAN"};
privateJComboBoxjcbo=newJComboBox(flag);
privateintnum;
privateintkai;
privateintsum;
privateintdisknum;
privateintm=0,n=0;
privateints[];
privateints1[];
privateintc1[];
privateintc2[];
//Drawdraw;
publicDiskScheduling(){
make=newJButton("生成随机序列");
make.setSize(130,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.setSize(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.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.addItemListener(newItemListener(){
@Override
publicvoiditemStateChanged(ItemEvente){
//TODOAuto-generatedmethodstub
if(jcbo.getSelectedIndex()==1){
fifo();
}
elseif(jcbo.getSelectedIndex()==2){
sstf();
}
elseif(jcbo.getSelectedIndex()==3){
scan();
}
elseif(jcbo.getSelectedIndex()==4){
cscan();
}
}
});
pan2.add(lab1);
pan2.add(lab2);
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(false);
JScrollPanescrollPane1=newJScrollPane(text1);
pan3.setLayout(newBorderLayout());
pan3.add(scrollPane1,BorderLayout.CENTER);
pan3.setSize(450,120);
pan3.setLocation(2,203);
text2.setLineWrap(true);
text2.setWrapStyleWord(true);
text2.setEditable(false);
JScrollPanescrollPane2=newJScrollPane(text2);
pan4.setLayout(newBorderLayout());
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.add(pan3);
pan1.add(pan5);
pan1.add(pan4);
setLayout(newGridLayout(1,2,5,5));
add(pan1,BorderLayout.CENTER);
}
publicvoidcreat(){
m=0;
n=0;
Randomrnd=newRandom();
kai=Integer.parseInt(jtext3.getText());
num=Integer.parseInt(jtext2.getText());
disknum=Integer.parseInt(jtext1.getText());
if(kai=0&&kai!
=0){
s=newint[num];
s1=newint[num];
c1=newint[num];
c2=newint[num];
for(intj=0;j{
s[j]=rnd.nextInt(disknum);
for(inti=0;iif(s[j]==s[i]||s[j]>disknum)
j--;
}
Stringstext="";
for(inti=0;i{stext+=s[i]+"";
}
paixu();
text1.setText(stext);
jcbo.setEnabled(true);
}
else{
JOptionPane.showMessageDialog(this,"输入不正确,请重新输入!
"+'\n'+"提示:
1.当前所在磁道数不能大于磁盘磁道数."+
'\n'+"2.磁盘磁道数和被请求磁道数都不能为0.",
"警告!
",JOptionPane.WARNING_MESSAGE);
}
}
publicvoidpaixu(){
intsu=kai;
intt;
for(inti=0;iif(su>s[i])
c1[m++]=s[i];
else
c2[n++]=s[i];
for(inti=0;ifor(intj=i;jif(c1[i]{t=c1[i];c1[i]=c1[j];c1[j]=t;}
for(inti=0;ifor(intj=i;jif(c2[i]>c2[j])
{t=c2[i];c2[i]=c2[j];c2[j]=t;}
}
publicvoidfifo(){
Stringstext="被访问的下一个磁道磁道号移动距离"+'\n';
intsu=kai;
sum=0;
for(inti=0;i{if(su
s1[i]=s[i]-su;
else
s1[i]=su-s[i];
su=s[i];
sum+=s1[i];
}
jtext4.setText(String.valueOf(sum));
sum=sum/num;
for(inti=0;i{stext+=""+s[i]+""+s1[i]+"";
stext+='\n';
}
stext+="平均寻道长度:
"+sum+"";
jtext5.setText(String.valueOf(sum));
text2.setText(stext);
}
publicvoidsstf(){
Stringstext="被访问的下一个磁道磁道号移动距离"+'\n';
intsu=kai;
ints2[]=newint[100];
sum=0;
for(inti=0;is2[i]=c1[i];
for(inti=0;is2[i+m]=c2[i];
for(inti=0;i{if(sus1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
jtext4.setText(String.valueOf(sum));
sum=sum/num;
for(inti=0;i{stext+=""+s2[i]+""+s1[i]+"";
stext+='\n';
}
stext+="平均寻道长度:
"+sum+"";
jtext5.setText(String.valueOf(sum));
text2.setText(stext);
}
publicvoidscan(){
Stringstext="被访问的下一个磁道磁道号移动距离"+'\n';
intsu=kai;
ints2[]=newint[100];
sum=0;
for(inti=0;is2[i]=c2[i];
for(inti=0;is2[i+n]=c1[i];
for(inti=0;i{if(sus1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
jtext4.setText(String.valueOf(sum));
sum=sum/num;
for(inti=0;i{stext+=""+s2[i]+""+s1[i]+"";
stext+='\n';
}
stext+="平均寻道长度:
"+sum+"";
jtext5.setText(String.valueOf(sum));
text2.setText(stext);
}
publicvoidcscan(){
Stringstext="被访问的下一个磁道磁道号移动距离"+'\n';
intsu=kai;
intj=0;
ints2[]=newint[100];
sum=0;
for(inti=0;is2[i]=c2[i];
for(inti=m-1;i>=0;j++,i--)
s2[j+n]=c1[i];
for(inti=0;i{if(sus1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
jtext4.setText(String.valueOf(sum));
sum=sum/num;
for(inti=0;i{stext+=""+s2[i]+""+s1[i]+"";
stext+='\n';
}
stext+="平均寻道长度:
"+sum+"";
jtext5.setText(String.valueOf(sum));
text2.setText(stext);
}
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
if(e.getSource()==make){
creat();
}
}
publicstaticvoidmain(Stringar[]){
DiskSchedulingdisk=newDiskScheduling();
disk.pack();
disk.setTitle("磁盘调度");
//disk.setLocationRelativeTo(null);
disk.setDefaultCloseOperation(EXIT_ON_CLOSE);
disk.setSize(500,550);
disk.setVisib