0
点赞
收藏
分享

微信扫一扫

操作系统之磁盘调度——SCAN实例讲解


​​操作系统之进程调度——优先权法和轮转法(附上样例讲解)​​​​操作系统之银行家算法—详解流程及案例数据​​​​操作系统之多线程编程—读者优先/写者优先详解​​​​操作系统之存储管理——FIFO算法和LRU算法​​​​操作系统之磁盘调度——SCAN实例讲解​​

要求

理解

上面就是​​实验要求​​​。
本实验的核心就是对SCAN算法的理解,SCAN被称为​​​梯度算法​​​。因为它不仅兼顾​​距离​​​的远近还兼顾​​方向性​​​。
Scan​​​算法思想​​大致为:

  • 当设备无访问请求时,磁头不动;
  • 当有访问请求时,磁头按一个方向移动,在移 [2] 动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。
  • 如下图所示:
  • 操作系统之磁盘调度——SCAN实例讲解_自动生成_02

代码

这大致就是流程,当然,你可以动态的增加io请求(接受请求)。
附上代码:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class 磁盘调度 {
private static void getstatus(Listlist) {
// TODO 自动生成的方法存根
System.out.println("进程id: 磁道: 是否调度?:");
for(int i=0;i list, int index, int cidao) {
if(index==1)//向左面
{
int mid=0;
for(int i=0;i<=list.size();i )
{
if(list.get(i).cidao>cidao&&list.get(i).isdiaodu==false)
{
mid=i-1;break;
}
}
while(mid>=0)
{
if(list.get(mid).isdiaodu==false)
{
io io=list.get(mid);
io.isdiaodu=true;
System.out.println("进程" io.id " 磁道:" io.cidao " 已经调度");
}
mid--;
}
mid ;
while(midcidao&&list.get(i).isdiaodu==false)
{
mid=i;break;
}
}
while(mid=0)
{
if(list.get(mid).isdiaodu==false)
{
io io=list.get(mid);
io.isdiaodu=true;
System.out.println("进程" io.id " 磁道:" io.cidao " 已经调度");
}
mid--;
}

}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
System.out.println("请输入访问磁盘的进程数量");
int n=sc.nextInt();
System.out.println("请输入访问进程的id和磁道号");
Listlist=new ArrayList<>();
for(int i=0;icompare=new Comparator(
) {

@Override
public int compare(io o1, io o2) {
// TODO 自动生成的方法存根
return o1.cidao-o2.cidao;
}
};
static class io
{
int id;
int cidao;
boolean isdiaodu;
public io(int id,int cidao)
{
this.id=id;
this.cidao=cidao;
}
}
}

输出案例

测试数据:

操作系统之磁盘调度——SCAN实例讲解_磁道_03

操作系统之磁盘调度——SCAN实例讲解_磁盘调度_04


若有错误的地方,还请大神指正。

如果对​​后端、爬虫、数据结构算法​​​等感性趣欢迎关注我的个人公众号交流:​​bigsai​


举报

相关推荐

0 条评论