所以我在Java中执行扫描算法(操作系统)时遇到了一些问题。我做了最短寻道时间优先算法来计算磁盘优化:
private int[] arrangeBySSTF(int current, int sequence[])
{
int n = sequence.length;
int sstf[] = new int[n];
for(int i =0; i < n; i++){
sstf[i] = sequence[i];
}
int ii = -1;
for(int i =0; i<n; i++)
{
int minimum = Integer.MAX_VALUE;
ii = i;
for(int j = i; j < n; j++)
{
int distance = Math.abs(current - sstf[j]);
if(distance < minimum)
{
ii = j;
minimum = distance;
}
}
int tmp = sstf[i];
sstf[i] = sstf[ii];
sstf[ii] = tmp;
current = sstf[i];
}
return sstf;
}
然而,我不知道如何启动扫描算法。有人能帮忙吗?
提前谢谢。
扫描算法通过向一个方向提供请求来工作。以下是针对您的问题的快速而肮脏的代码。
import java.util.Arrays;
private int[] arrangeBySCAN(int current, int sequence[]) {
// Assuming inward movement i.e going toward zero
int n = sequence.length;
int scan[] = new int[n + 1];
int temp[] = new int[n + 1];
for (int i = 0; i < n; i++) {
temp[i] = sequence[i];
}
temp[n] = 0;
Arrays.sort(temp);
// find first element in array temp which is less than current
int index = 0;
for (int i = 1; i < temp.length; i++) {
if (temp[i] > current) {
index = i - 1;
break;
}
}
int k = 0;
// Server all request upto zero move backward
for (int i = index; i >= 0; --i, ++k) {
scan[k] = temp[i];
}
// move forward from zero
for (int i = index + 1; i < temp.length; i++, ++k) {
scan[k] = temp[i];
}
return scan;
}
该算法的工作原理是首先对序列进行排序,然后找到一个小于当前的请求,并为所有请求提供服务,直到为零。在此服务器之后,剩余的请求通过从零开始向前移动。
通过只使用一个数组而不是2,并使用二进制搜索来找到小于当前值的第一个元素,可以在上面的代码中进行多次优化,我希望您可以自己进行优化。
希望这能被正确地记录下来,让你理解:
package diskScheduling;
import java.util.*;
public class SCAN {
public static int callSCAN(int arr[],int init,int maxreq){
/* In this algorithm head moves only in one direction and
* on reaching the boundary its reverses its direction
* Here in this algorithm , we implement it move in forward direction first
* ,i.e towards higher track requests,then towards lower track request*/
int sum=0,len=arr.length;
//sorting the requests
Arrays.sort(arr);
//finding virtual location of init in the request array
//binary search returns the index of search element if found
//else it returns -(insertion point) -1
int pos= Arrays.binarySearch(arr, init);
pos=-pos-1;
// System.out.println(pos);
int left=pos-1,right=pos;
//moving towards right side first in the array
sum+=Math.abs(init-arr[right]);
System.out.println(arr[right]);
while(right<len-1){
sum+=Math.abs(arr[right]-arr[right+1]);
System.out.println(arr[right+1]);
right++;
}
/* moving to maximum possible track request from
* where head will reverse its direction */
sum+=Math.abs(arr[len-1]-maxreq);
System.out.println(maxreq);
//now moving towards left direction .
sum+=Math.abs(maxreq-arr[left]);
System.out.println(arr[left]);
while(left!=0){
sum+=Math.abs(arr[left]-arr[left-1]);
System.out.println( arr[left-1]);
left--;
}
return sum;
}
public static void main(String[] args) {
//maxreq maximum possible disk request
int maxreq = 200;
//request array
int arr[]={98,183,37,122,14,124,65,67};
// disk head starts at init
int init=53;
int res=callSCAN(arr,init,maxreq);
System.out.println("Total Head Movement= "+res);
}
}