這一版的磁盤調度,作者只分析了磁盤通道號,之後作者會加入對最晚完成時間的分析。
首先理解一下,什麼是磁盤調度,磁盤調度的意思是,所有的進程都是在磁盤中得某個同道號中享受資源的,那麼就會存在一個問題,我們是按什麼順序來執行這些進程呢,
一種是按照最晚完成時間的前後來安排,這種可以使得任務能夠順序的執行。但是任務完成的時間會大大的增加。
有一種就是按照磁盤的通道號的大小來操作,這樣的話,能夠更快速的完成任務,但是可能其中有些進程會因爲超過最晚完成時間而導致進程的失效。
還有一種就是兩種都比較兼顧的算法就是,電梯調度算法,這種算法既考慮到了磁盤通道號,也考慮到了最晚完成時間,這種算法首先是按照最晚完成時間進行排序,排序完了之後,再將最晚完成時間進行劃分區間,比如說在時間區間內,有幾個進程都可以順利的完成,那樣的話,在這種基礎上,就可再對這幾個進程進行磁盤通道號進行排序,這樣的話又能在規定的時間內完成,又能夠保證完成的時間儘量少。所以非常適合實現。
這裏作者先做了電梯調度算法的一部分,源代碼中會詳細講解。
下面貼源代碼
第一個是純粹是通過機器自動選擇操作的方式
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;
public class 磁盤調度 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Random ran=new Random();
System.out.println("輸入隨機產生的進程數的範圍");//初始化
System.out.print("最小是:");
int n=sc.nextInt();
System.out.print("最大是:");
int m=sc.nextInt();
int n1=ran.nextInt(m-n+1)+n;
System.out.println("輸入磁盤號的範圍");
System.out.print("最小是:");
int nn=sc.nextInt();
System.out.print("最大是:");
int mm=sc.nextInt();
Queue<node>queue=new PriorityQueue<node>(compare);
node []node1=new node[n1];
for(int i=0;i<n1;i++)
{
node1[i]=new node();
node1[i].name=i+1;
node1[i].number=ran.nextInt(mm-nn+1)+nn;
queue.add(node1[i]);
}
System.out.println("初始化已經完成!!");
int length=queue.size();
double count=ran.nextDouble();
if(count<0.5)//磁盤調度
{
length--;
System.out.println("進行磁盤調度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已經執行結束!!");
}
else //壓入新的進程
{
length++;
System.out.println("進行壓入新的進程操作!!");
node node2=new node();
System.out.println("輸入壓入的進程的進程號,類型爲int類型");
node2.name=sc.nextInt();
System.out.println("輸入壓入的進程的磁盤通道號,注意範圍是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已經壓入");
}
System.out.println("是否繼續,輸入Y或者N");
String str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你輸入的操作不存在,請重新輸入!!");
str=sc.next();
}
while(str.equals("Y")&&length>0)
{
count=ran.nextDouble();
if(count<0.5)//進行磁盤調度
{
length--;
System.out.println("進行磁盤調度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已經執行結束!!");
}
else//壓入新的進程
{
length++;
System.out.println("進行壓入新的進程操作!!");
node node2=new node();
System.out.println("輸入壓入的進程的進程號,類型爲int類型");
node2.name=sc.nextInt();
System.out.println("輸入壓入的進程的磁盤通道號,注意範圍是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已經壓入");
}
System.out.println("是否繼續,輸入Y或者N");
str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你輸入的操作不存在,請重新輸入!!");
str=sc.next();
}
}
if(length==0)
{
System.out.println("進程已經全部執行完畢!!!");
}
}
static Comparator<node>compare=new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
// TODO Auto-generated method stub
return o1.number-o2.number;
}
};
static class node
{
int name;//進程名
//int limittime;//最晚完成時間
int number;//磁道通道號
public node() {
// TODO Auto-generated constructor stub
}
}
}
第二個是通過人自己選擇操作的方式
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;
public class 磁盤調度第二版 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Random ran=new Random();
System.out.println("輸入隨機產生的進程數的範圍");//初始化
System.out.print("最小是:");
int n=sc.nextInt();
System.out.print("最大是:");
int m=sc.nextInt();
int n1=ran.nextInt(m-n+1)+n;
System.out.println("輸入磁盤號的範圍");
System.out.print("最小是:");
int nn=sc.nextInt();
System.out.print("最大是:");
int mm=sc.nextInt();
Queue<node>queue=new PriorityQueue<node>(compare);
node []node1=new node[n1];
for(int i=0;i<n1;i++)
{
node1[i]=new node();
node1[i].name=i+1;
node1[i].number=ran.nextInt(mm-nn+1)+nn;
queue.add(node1[i]);
}
System.out.println("初始化已經完成!!");
int length=queue.size();
//double count=ran.nextDouble();
System.out.println("是否繼續,輸入Y或者N");
String str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你輸入的操作不存在,請重新輸入!!");
str=sc.next();
}
if(str.equals("Y"))//磁盤調度
{
length--;
System.out.println("進行磁盤調度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已經執行結束!!");
}
else //壓入新的進程
{
length++;
System.out.println("進行壓入新的進程操作!!");
node node2=new node();
System.out.println("輸入壓入的進程的進程號,類型爲int類型");
node2.name=sc.nextInt();
System.out.println("輸入壓入的進程的磁盤通道號,注意範圍是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已經壓入");
}
System.out.println("是否繼續,輸入Y或者N");
str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你輸入的操作不存在,請重新輸入!!");
str=sc.next();
}
while(length>0)
{
if(str.equals("Y"))//進行磁盤調度
{
length--;
System.out.println("進行磁盤調度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已經執行結束!!");
}
else//壓入新的進程
{
length++;
System.out.println("進行壓入新的進程操作!!");
node node2=new node();
System.out.println("輸入壓入的進程的進程號,類型爲int類型");
node2.name=sc.nextInt();
System.out.println("輸入壓入的進程的磁盤通道號,注意範圍是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已經壓入");
}
System.out.println("是否繼續,輸入Y或者N");
str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你輸入的操作不存在,請重新輸入!!");
str=sc.next();
}
}
if(length==0)
{
System.out.println("進程已經全部執行完畢!!!");
}
}
static Comparator<node>compare=new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
// TODO Auto-generated method stub
return o1.number-o2.number;
}
};
static class node
{
int name;//進程名
//int limittime;//最晚完成時間
int number;//磁道通道號
public node() {
// TODO Auto-generated constructor stub
}
}
}
還是老樣子,作者很菜,如有不足,不吝賜教!!!