程序模拟磁盘调度设计实验4实验报告.docx
《程序模拟磁盘调度设计实验4实验报告.docx》由会员分享,可在线阅读,更多相关《程序模拟磁盘调度设计实验4实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
程序模拟磁盘调度设计实验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)
该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以
使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时
间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变
化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
随机生咸磁适号-
输出^商序的薪道序
務动到最小f刘号,改冋外【内〉穆动扫
求平均寻道长度,
输出穆动的平均晞遣齣•
又是距离最近的。
自外向里移动。
在当前磁道之内,
这样自里向外地访问,直这时,同样也是每次选择从而避免了饥饿现象的出
3、扫描算法(SCAN
扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当
前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,到再无更外的磁道需要访问才将磁臂换向,这样的进程来调度,即其要访问的磁道,
现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
此算
法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
亶法浚程圉:
"
使用冒泡法从小到夫排序•
输出排好序的磁道序列-
选择移动胃移动万问,幵始扫描+
肾狐岷小':
卞耳,改向外(内)陽动扫描末扫描的茁荷』
4、循环扫描算法(CSCAN
循环扫描算法是对扫描算法的改进。
如果对磁道的访问请求是均匀分布的,当磁
头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。
这是由于这些
磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。
例如,只自里向外移动,当磁
头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接
着最大磁道号构成循环,进行扫描。
幵蛤•
規立榕动包单问反豆的从内WhF3i-
对拭主成
!
3擱到員总陌,宜搞
<_■
工
V
判所岂SikiiU0序列中加恆赵•
叮.审
注:
以上算法的实现程序见附录一源代码。
四、实验结果及分析和(或)源程序调试过程
1.主界面:
4-1.主界面
2.在“磁盘磁道数”、“被请求磁道数”、“当前磁道”输入框中输入相应内容,则随机生成并在“磁道请求序列”显示框中显示生成的请求序列:
图4-2生成序列
3.在组合框中选择相应的算法进行模拟,在“调度服务序列”显示框显示相应算法的调度序列及磁道号移动距离:
图4-3FIFO算法模拟结果
500生诙机序列
1QQ
250SSTF▼
平均日适也信
7
日适总低度733
蹴道请茨庠列:
图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.ltemEvent;importjava.awt.event.ltemListener;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;
public
classDiskScheduling
extendsJFrameimplementsActionListener{
newJTextField。
newJTextField()newJTextField()newJTextArea()newJTextArea()
JTextFieldjtext1
JTextFieldjtext2
JTextFieldjtext3
JTextAreajtext4
JTextAreajtext5
JTextAreatext1=newJTextArea();
JTextAreatext2=newJTextArea();
JLabel
lab1=
newJLabel(
"磁盘磁道数");
JLabel
lab2=
newJLabel(
"被请求磁道数”);
JLabel
lab3=
newJLabel(
"当前磁道”);
JLabel
lab4=
newJLabel(
"寻道总长度:
”);
JLabel
lab5=
newJLabel(
"平均寻道长度:
”);
JLabel
lab6=
newJLabel(
"磁道请求序列:
”);
JLabelIab7=newJLabel("调度服务序列:
");JPanelpanl=newJPanel();
JPanelpan2=newJPanel();
JPanelpan3=newJPanel();
JPanelpan4=newJPanel();
JPanelpan5=newJPanel();
JPanelpan6=newJPanel();
JButtonmake;privateString[]flag={"请选
择..
","FIFO","SSTF",”SCAN","C-SCAN"};
private
JComboBoxjcbo
private
int
num;
private
int
kai;
private
int
sum;
private
int
disknum;
private
int
mF0,n=0;
private
int
s[];
private
int
s1[];
private
int
c1[];
private
int
c2[];
//Drawdraw;
newJComboBox(flag);
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(){
@OverridepublicvoiditemStateChanged(ltemEvente){//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);
textl.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.CENTEFR;
}publicvoidcreat(){
m=0;n=0;
Randomrnd=kai=Integer.
newRandom();parseInt(jtext3
.getText());
num=Integer.parseInt(jtext2.getText());
disknum=Integer.parseInt(jtextl.getText());
if(kai=0&&kai!
=0){
s=newint[num];si=newint[num];ci=newint[num];c2=newint[num];
for(intj=O;js[j]=rnd.nextlnt(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
}
}
public
void
paixu(){
int
su=
kai;
int
t;
for
(int
i=0;iif(su>s[i])c1[m++]=s[i];else
c2[n++]=s[i];
for(inti=0;ifor(inti=0;i{t=c2[i];
mi++)mj++)c1[j])c1[i]=c1[j];
n;i++)
n;j++)c2[j])c2[i]=c2[j];
c1[j]=t;}
c2[j]=t;}
publicvoidfifo(){
磁道号移动距离
Stringstext="被访问的下一个磁道
"+'\n';
intsu=kai;
sum=0;
for(inti=0;i{if(su
else
si[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[]=sum=0;
new
int[100];
for(int
i=0;i<
mi++)
s2[i]=
c1[i];
for(int
i=0;i<
n;i++)
s2[i+m=
:
c2[i];
for(int
i=0;i<
num;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';
int
su=
kai;
int
s2[]=
new
int[100];
sum=0;
for
(int
i=0;i<
n;i++)
s2[i]=
c2[i];
for
(int
i=0;i<
mi++)
s2[i+
n]=
:
c1[i];
for
(int
i=0;i<
num;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(