赞
踩
目录
扫描算法又称为电梯算法,其原理与电梯运行情况相似,即运行方向上的请求优先,若就是访问方向向上,则先依次访问较大的磁道号至顶,再向下访问较小的磁道号;若就是访问方向向下,则先依次访问较小得磁道号至底,再向上访问较大的磁道号。
循环扫描算法又称为单向电梯算法,若就是访问方向向上,则向上依次访问完较大的磁道号后,返回最低端,依次向上访问较小的磁道号;若就是访问方向向下,则向下依次访问完较小的磁道号后,返回最顶端,依次向下访问较大的磁道号.
通过实验使学生掌握磁盘上数据的组织方式,以及让学生了解并掌握扫描算法及循环扫描算法的相关特性,及区别。
实验结束后要求每位同学都应该掌握磁盘上数据的组织方式,以及扫描算法和循环扫描算法的基本原理。
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 = scan.nextInt();
switch(n) {
case 1:
SCAN s1 = new SCAN();
s1.input();
s1.search();
s1.show();
break;
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 = scan.nextInt();
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] = scan.nextInt();
}
System.out.println();
}
void search()
{
System.out.print("请输入开始的磁道号:");
int start = scan.nextInt();
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++;
}
for(int i = index - 1, pos = num - index; i >= 0; i--, pos++)
{
visit[pos] = req[i];
move[pos] = start - req[i];
start = visit[pos];
}
}
else
{
for(int i = 0; i < num; i++)
{
visit[i] = req[i];
move[i] = Math.abs(req[i] - start);
start = visit[i];
}
}
}
void bubbleSort(int arr[])
{
for (int i = 0; i < arr.length - 1; i++)
{
for (int j = 0; j < arr.length - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void show()
{
System.out.println("被访问的\t\t移动距离\n下一个磁道号\t(磁道数)\n");
for (int i = 0; i < num; i++)
{
System.out.println(visit[i] + "\t\t" + move[i]);
}
double sum = 0;
for (int i : move)
{
sum += i;
}
System.out.println("平均寻道长度:" + sum / num);
}
SCAN()
{
System.out.println("----------扫描算法----------");
}
}
class CSCAN
{
Scanner scan = new Scanner(System.in);
int[] req;
int num;
int[] move;
int[] visit;
void input()
{
System.out.print("请输入进程数:");
num = scan.nextInt();
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] = scan.nextInt();
}
System.out.println();
}
void search()
{
System.out.print("请输入开始的磁道号:");
int start = scan.nextInt();
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++;
}
for (int i = 0, pos = num - index; i < index; i++, pos++)
{
visit[pos] = req[i];
move[pos] = Math.abs(req[i] - start);
start = visit[pos];
}
} else
{
for (int i = 0; i < num; i++)
{
visit[i] = req[i];
move[i] = Math.abs(req[i] - start);
start = visit[i];
}
}
}
void bubbleSort(int arr[])
{
for (int i = 0; i < arr.length - 1; i++)
{
for (int j = 0; j < arr.length - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void show()
{
System.out.println("被访问的\t\t移动距离\n下一个磁道号\t(磁道数)\n");
for (int i = 0; i < num; i++)
{
System.out.println(visit[i] + "\t\t" + move[i]);
}
double sum = 0;
for (int i : move)
{
sum += i;
}
System.out.println("平均寻道长度:" + sum / num);
}
CSCAN()
{
System.out.println("--------循环扫描算法--------");
}
}
经过这段时间的辅导讨论,我们组的磁盘调度实验之扫描和循环调度算法的实验结束了,最终的实验结果也满足了实验的要求,我现在也能够很好区别扫描算法和循环扫描算法,并了解它们的优缺点。
通过此次实验,我不仅深度了解了扫描算法和循环扫描算法,也使我更加扎实的掌握了有关Java方面的知识,在此次实验过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍地检查终于找出了原因所在,也暴露出了前期我在这一方面知识欠缺和经验不足。实践出真知,通过亲自动手实验,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在实验中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的实验检测环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次实验终于顺利完成了,在实验中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到困难就想要退宿,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能获得成功,收获喜悦,也永远不可能得到社会及其他人对你的认可。
回顾起此次实验,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说是苦多于甜,但是学到了很多很多东西,不仅巩固了以前的知识,还学到了很多书本上没有学到的知识。通过此次实验使我懂得了理论和实际结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识和实际相结合,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。实验过程中,也对团队精神进行了考察,让我们在合作中更加默契,在成功之后一起体会喜悦的心情。果然是团结就是力量,只有相互之间默契融洽的配合才能换来最终完美的结果。
[1]汤子瀛 ,哲凤屏.《计算机操作系统》[M].西安电子科技大学出版社.
[2]王清,李光明.《计算机操作系统》[M].冶金工业出版社.
[3]孙钟秀等.《操作系统教程》[M].高等教育出版社.
[4]曾明.《Linux操作系统应用教程》[M].陕西科学技术出版社.
[5]张丽芬,刘利雄.《操作系统实验教程》[M].清华大学出版社.
[6]孟静.《操作系统教程——原理和实例分析》[M].高等教育出版社.
[7]周长林.《计算机操作系统教程》[M].高等教育出版社.
[8]张尧学.《计算机操作系统教程》[M].清华大学出版社.
[9]任满杰.《操作系统原理实用教程》[M].电子工业出版社.
[10]张坤.《操作系统实验教程》[M].清华大学出版社.
首先非常感谢学校能开设这个实验,为我日后从事计算机方面的工作有所助益,奠定了基础。
其次,我要特别感谢熊婷老师对我的悉心指导,在实验期间老师帮助我理清实验思路,指导操作方法。老师渊博的知识、严谨的作风、诲人不倦的态度和学术上精益求精的精神让我受益终生。这期间凝结了老师很多的心血,在此我表示由衷的感谢。没有他的帮助,我将无法顺利完成这次实验。
再次,学校在这方面也给我们提供了很大的支持和帮助,学校领导比较重视,给我们安排了较多的上机次数和足够的计算机,让我们有尽可能多的时间上机;并为我们开通了网线,方便我们上网查找信息;另外提供了专门的教室方便我们上机调试;对于学校和老师为我的实验所提供的极大帮助和关心,在此我致以衷心的感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。