操作系统:磁盘调度实验之扫描和循环扫描调度算法(含源码
和⽂档)
⽬录
实验相关概述
1. 扫描算法
扫描算法⼜称为电梯算法,其原理与电梯运⾏情况相似,即运⾏⽅向上的请求优先,若就是访问⽅向向上,则先依次访问较⼤的磁道号⾄顶,再向下访问较⼩的磁道号;若就是访问⽅向向下,则先依次访问较⼩得磁道号⾄底,再向上访问较⼤的磁道号。
1. 循环扫描算法
循环扫描算法⼜称为单向电梯算法,若就是访问⽅向向上,则向上依次访问完较⼤的磁道号后,返回最低端,依次向上访问较⼩的磁道号;若就是访问⽅向向下,则向下依次访问完较⼩的磁道号后,返回最顶端,依次向下访问较⼤的磁道号.
实验的⽬的及要求
1. ⽬的
通过实验使学⽣掌握磁盘上数据的组织⽅式,以及让学⽣了解并掌握扫描算法及循环扫描算法的相关特性,及区别。
1. 要求
实验结束后要求每位同学都应该掌握磁盘上数据的组织⽅式,以及扫描算法和循环扫描算法的基本原理。
实验的实现思路及步骤
1. 扫描算法
2.循环扫描算法
实验结果分析
1.优缺点及区别
扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,⽽且优先考虑磁头的当前移动⽅向。例如,当磁头正在⾃⾥向外移动时,扫描算法所选择的下⼀个访问对象应是磁头移动⽅向向外且距离最近的。这样⾃⾥向外地访问,直到再⽆更外的磁道需要被访问才会将磁臂的移动⽅向变为⾃外向⾥移动。磁臂改变⽅向后,同样选择这样的进程来调度,即其要访问的磁道在当前磁道之内,从⽽避免了饥饿现象。由于这种算法中磁头移动的规律颇似电梯的运⾏,故称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化⽐较⼤的缺点,⽽具有最短寻道时间优先算法的优点,即吞吐量较⼤,平均响应时间较⼩。但由于是摆动式的扫描⽅法,两侧磁道被访问的频率仍低于中间磁道。
循环扫描算法是对扫描算法的改进。如果对磁道的访问请求时均匀分布的,当磁头到达磁盘的⼀端并反向运动时,落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,⽽磁盘另⼀端的请求密度相当⾼,且这些访问请求等待的时间长。为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只⾃⾥向外移动,当磁头移到最外的被访问磁道时,头⽴即返回到最⾥的欲访问磁道,即将最⼩磁道号紧接着最⼤磁道
号构成循环,进⾏扫描。
2.实现代码及截图
public class CAN {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
System.out.println("请输⼊您的选择:1.扫描算法 2.循环扫描算法"); int n = Int();
switch(n) {
case 1:
SCAN s1 = new SCAN();
s1.input();
s1.search();
s1.show();
break;
nextint()方法case 2:
CSCAN s2 = new CSCAN();
s2.input();
s2.search();
s2.show();
}
}
}
}
class SCAN
{
Scanner scan = new Scanner(System.in);
int[] req;
int num;
int[] move;
int[] visit;
void input()
{
System.out.print("请输⼊进程数:");
num = Int();
req = new int[num];
move = new int[num];
visit = new int[num];
for (int i = 0; i < num; i++)
{
System.out.print("进程" + (i + 1) + "访问的磁道号:");
req[i] = Int();
}
System.out.println();
}
void search()
{
System.out.print("请输⼊开始的磁道号:");
int start = Int();
System.out.println("\n从" + start + "号磁道开始,向磁道号增加⽅向移动\n"); bubbleSort(req);
int firstIndex = -1;
for (int i = 0; i < num; i++)
{
if (start > req[i])
continue;
firstIndex = i;
break;
}
if (firstIndex != -1)
{
int index = firstIndex;
for (int i = 0; i < num - index; i++)
{
visit[i] = req[firstIndex];
move[i] = req[firstIndex] - start;
start = visit[i];
firstIndex++;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论