操作系統實驗之磁盤調度

這一版的磁盤調度,作者只分析了磁盤通道號,之後作者會加入對最晚完成時間的分析。
首先理解一下,什麼是磁盤調度,磁盤調度的意思是,所有的進程都是在磁盤中得某個同道號中享受資源的,那麼就會存在一個問題,我們是按什麼順序來執行這些進程呢,

一種是按照最晚完成時間的前後來安排,這種可以使得任務能夠順序的執行。但是任務完成的時間會大大的增加。

有一種就是按照磁盤的通道號的大小來操作,這樣的話,能夠更快速的完成任務,但是可能其中有些進程會因爲超過最晚完成時間而導致進程的失效。

還有一種就是兩種都比較兼顧的算法就是,電梯調度算法,這種算法既考慮到了磁盤通道號,也考慮到了最晚完成時間,這種算法首先是按照最晚完成時間進行排序,排序完了之後,再將最晚完成時間進行劃分區間,比如說在時間區間內,有幾個進程都可以順利的完成,那樣的話,在這種基礎上,就可再對這幾個進程進行磁盤通道號進行排序,這樣的話又能在規定的時間內完成,又能夠保證完成的時間儘量少。所以非常適合實現。

這裏作者先做了電梯調度算法的一部分,源代碼中會詳細講解。
下面貼源代碼
第一個是純粹是通過機器自動選擇操作的方式

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
		}
	}
}

還是老樣子,作者很菜,如有不足,不吝賜教!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章