1. 程式人生 > >Java 作業系統 進先出的演算法(FIFO)、最少使用演算法(LFU)

Java 作業系統 進先出的演算法(FIFO)、最少使用演算法(LFU)

設計目的:

加深對請求頁式儲存管理實現原理的理解,掌握頁面置換演算法。

設計內容:

    設計一個程式,有一個虛擬儲存區和記憶體工作區,實現下述三種演算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。

演算法包括:先進先出的演算法(FIFO)、最少使用演算法(LFU)程式碼如下:
import java.util.Scanner;
import java.util.Random;


public class QQ {
	public static void main(String[] args) {
		int Input;
		Scanner input = new Scanner(System.in);
		System.out.println("請選擇下面兩種演算法中的一種:           1.先進先出           2.最近未使用演算法");
		Input = input.nextInt(); 
		switch(Input){
		case 1:
		FIFO f = new FIFO();
		f.way();
		break;
		case 2:
		LRU l = new LRU();
		l.way();
		break;
		default:
		System.out.println("非法輸入");
		break;
		}
	}
}

class FIFO{
	void way() {
		int i,j;
		int m = 0;
		int n = 0;
		int Maxflag = 0;
		int Max = -1;
		int count = 0;//缺頁數
		int Num1,Num2;
		double QYL;
		double MZL;
		System.out.print("請輸入程序數:");
		Random rand = new Random();
		Scanner a = new Scanner(System.in);
		Num1 = a.nextInt();
		JJ page[] = new JJ[Num1];
		System.out.println("產生的隨機程序序列如下:");
		for(i = 0; i < Num1; i++) {
			page[i] = new JJ();
			page[i].num = rand.nextInt(10) + 1 ;
		}
		for(i = 0; i < Num1; i++){
			System.out.print(page[i].num+"   ");
		}
		System.out.println();
		System.out.print("請輸入記憶體塊數:");
		Num2 = a.nextInt();
		NC nc[] = new NC[Num2];
		for(i = 0; i < Num2; i++) {
			nc[i] = new NC();
			nc[i].phb = 0;
			nc[i].flag = 0;
		}
		System.out.println("現在在記憶體中的程序編號為:");
		for(i = 0; i < Num2; i++)
		{
			System.out.print(nc[i].phb+"   ");
		}
		System.out.println();
		for(j = 0; j < Num1; j++){
			NC c = new NC();
			m = c.searchphb(nc,Num2);
			n = c.searchpro(page,Num1,nc,Num2,j);
			for(i = 0; i < Num2; i++)
	        {
	           if(nc[i].flag>Maxflag)
	             {
	                 Maxflag = nc[i].flag;
	                 Max = i;
	             }
	        }   
	        if(n == -1)               //不存在相同程序
			{
	           if(m != -1)            //存在空閒物理塊
	           {
				   nc[m].phb = page[j].num;   //程序號填入該空閒物理塊
				   count++;
	               nc[m].flag = 0;
	               for(i = 0;i <= m; i++)
	               {
	            	   nc[i].flag++;
	               }
	               m = -1;
	           }
	           else                //不存在空閒物理塊
	           {
	        	   nc[Max].phb = page[j].num;
	        	   nc[Max].flag = 0;
	              for(i = 0;i < Num2; i++)
	              {
	            	  nc[i].flag++;
	              }
	              Max = -1;
	              Maxflag = 0;
	              count++;
	           }
	       }
	       else                    //存在相同的程序
	       {
	    	   nc[n].phb = page[j].num;
	           for(i = 0;i < Num2; i++)
	           {
	        	   nc[i].flag++;
	           }
	           n = -1;
	       }

				System.out.println("現在在記憶體中的程序編號為:");
				for(i = 0; i < Num2; i++)
				{
					System.out.print(nc[i].phb+"   ");
				}
				System.out.println();
		}
		QYL = (double)count/Num1;
		MZL = 1 - QYL;
		System.out.println("缺頁次數為:"+count);
		System.out.println("缺頁率為:"+QYL);
		System.out.println("命中率為:"+MZL);
	}
	
}

class LRU{
	void way() {
		int i,j;
		int m = 0;
		int n = 0;
		int MaxTime = 0;
		int Max = -1;
		int count = 0;//缺頁數
		int Num1,Num2;
		double QYL;
		double MZL;
		System.out.print("請輸入程序數:");
		Random rand = new Random();
		Scanner a = new Scanner(System.in);
		Num1 = a.nextInt();
		JJ page[] = new JJ[Num1];
		System.out.println("產生的隨機程序序列如下:");
		for(i = 0; i < Num1; i++) {
			page[i] = new JJ();
			page[i].num = rand.nextInt(10) + 1 ;
		}
		for(i = 0; i < Num1; i++){
			System.out.print(page[i].num+"   ");
		}
		System.out.println();
		System.out.print("請輸入記憶體塊數:");
		Num2 = a.nextInt();
		NC nc[] = new NC[Num2];
		for(i = 0; i < Num2; i++) {
			nc[i] = new NC();
			nc[i].phb = 0;
			nc[i].flag = 0;
		}
		System.out.println("現在在記憶體中的程序編號為:");
		for(i = 0; i < Num2; i++)
		{
			System.out.print(nc[i].phb+"   ");
		}
		System.out.println();
		for(j = 0; j < Num1; j++){
			NC c = new NC();
			m = c.searchphb(nc,Num2);
			n = c.searchpro(page,Num1,nc,Num2,j);
			for(i = 0; i < Num2; i++)
	        {
	           if(nc[i].time > MaxTime)
	             {
	                 MaxTime = nc[i].time;
	                 Max = i;
	             }
	        }   
	        if(n == -1)               //不存在相同程序
			{
	           if(m != -1)            //存在空閒物理塊
	           {
				   nc[m].phb = page[j].num;   //程序號填入該空閒物理塊
				   count++;
	               nc[m].time = 0;
	               for(i = 0;i <= m; i++)
	               {
	            	   nc[i].time++;
	               }
	               m = -1;
	           }
	           else                //不存在空閒物理塊
	           {
	        	   nc[Max].phb = page[j].num;
	        	   nc[Max].time = 0;
	              for(i = 0;i < Num2; i++)
	              {
	            	  nc[i].time++;
	              }
	              Max = -1;
	              MaxTime = 0;
	              count++;
	           }
	       }
	       else                    //存在相同的程序
	       {
	    	   nc[n].phb = page[j].num;
	    	   nc[n].time = 0;
	           for(i = 0;i < Num2; i++)
	           {
	        	   nc[i].time++;
	           }
	           n = -1;
	       }

				System.out.println("現在在記憶體中的程序編號為:");
				for(i = 0; i < Num2; i++)
				{
					System.out.print(nc[i].phb+"   ");
				}
				System.out.println();
		}
		QYL = (double)count/Num1;
		MZL = 1 - QYL;
		System.out.println("缺頁次數為:"+count);
		System.out.println("缺頁率為:"+QYL);
		System.out.println("命中率為:"+MZL);
	}
}

class JJ{
	int num;//記錄頁面號
}

class NC{
	int phb;//記憶體塊
	int flag;
	int time;//記錄調入記憶體時間
	
	int searchphb(NC nc[],int Num2) { 
		int i;//查詢空閒物理塊
		int m = 0;
		for(i = 0; i < Num2; i++) {
			if(nc[i].phb == 0) {  
				   m = i; 
				   break; 
			}
		} 
		if(i < Num2)
			return m;
		return -1;
	}
	
	int searchpro(JJ page[],int Num1,NC nc[],int Num2,int j) {    //查詢是否有相同程序塊
		int i;
		int n = 0;
		for(i = 0; i < Num2; i++){
        if(page[j].num == nc[i].phb){
        	n = i;
        	break;
        }
		}
		if(i < Num2)
			return n;
		return -1;
	}
}

相關推薦

Java 作業系統 演算法FIFO最少使用演算法LFU

設計目的:加深對請求頁式儲存管理實現原理的理解,掌握頁面置換演算法。設計內容:    設計一個程式,有一個虛擬儲存區和記憶體工作區,實現下述三種演算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。演算法包括:先進先出的

java佇列--先進迴圈佇列鏈佇列

佇列: 只允許在一端進行插入操作(隊尾),在另一端進行刪除操作(隊頭)。 佇列的特徵就是: 先進先出。 佇列的思想及實現也同樣非常簡單。在生活中的各種常常都需要排隊進行,鍵盤中快取區、作業系統中的作業排程等都有用到佇列先進先出的思想。在這裡同樣用一個示意圖展示佇列的基本思想

二叉樹中後序遍歷遞迴非遞迴方法層序遍歷 Java實現

第一部分:二叉樹結點的定義 二叉樹結點有三個屬性:資料域、左結點、右結點。構造方法寫三個引數,這樣建立結點的時候程式碼更簡潔,且要從葉子結點開始建立(從底往上建立)。注:如果只寫一個賦值引數的構造器,那麼建立節點的順序就無所謂了,但是建立二叉樹時要多寫幾行程式碼。 pack

西門子plc s7-200寫的先進範例 用fifo

本人最近寫了一個五臺鍋爐共用一個冷卻水泵的程式,開始打算用時間戳來記錄每臺鍋爐需要冷卻的時間,然後用時間進行排序,但是後來無意中發現fifo可以實現表的先進先出的功能,就抱著學習的目的,用fifo寫了本程式。第一步,先要建立一個表如下圖,上電初始化建立一個具有5個值的表,從V

java代碼導數據到Exceljs導數據到Excel(三)

文件 servlet .net rii try use sss open list jsp內容忽略,僅寫個出發按鈕: <button style="width: 100px" onclick="expertExcel()" >JS導出Exce

Java的位運算符詳解實例——與&~|異或^僅作記錄

out 位運算符 異或運算 pri stat 運算 data 操作 amp 位運算符主要針對二進制,它包括了:“與”、“非”、“或”、“異或”。從表面上看似乎有點像邏輯運算符,但邏輯運算符是針對兩個關系運算符來進行邏輯運算,而位運算符主要針對兩個二進制數的位進行邏輯運算。下

Java - 斐波那契遞歸或不遞歸

str int() args 第一個 imp arr pack 長度 true 不遞歸 package com.ikoo; public class NoRecursion { public static void main(String[] args) {

Java的位運算符—與&~|異或^

ati 得出 rdquo 根據 有一個 關系 public 操作數 針對 位運算符主要針對二進制,它包括了:“與”、“非”、“或”、“異或”。從表面上看似乎有點像邏輯運算符,但邏

java運算符 與&~|異或^

log 都是 如果 原碼 IT parse ava 十進制 就是 1.位異或運算(^) 運算規則是:兩個數轉為二進制,然後從高位開始比較,如果相同則為0,不相同則為1。 比如:8^11. 8轉為二進制是1000,11轉為二進制是1011.從高位開始比較得到的是:0011

java 談談引用強引用Strong Reference軟引用Soft Reference弱引用Weak Reference虛引用Phantom Reference)

內存 enc ID 足夠 phantom 強引用 進行 溢出 tom 簡單談談引用(摘自java虛擬機第二版 ) 署名:wander 一、四種引用   在JDK 1.2之後,Java對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟

java基礎17集合類1:Collection

實例 array 9.png str 列表 println 方式 elements .com 一.  什麽是集合類? 二.  Collection接口   2.1  Collection子接口(List接口和Set接口)   2.1  Collection的常用方法 三. 

PHP 階之 抽象類abstract接口interfaceTrait特征

包含 中一 man ont 就是 類型 link array ike 抽象類 PHP 5 支持抽象類和抽象方法。定義為抽象的類不能被實例化。 抽象方法只能在抽象類中,抽象類中可以包含非抽象方法 被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現 繼承

Linux後臺程管理以及ctrl+z掛起ctrl+c中斷ctrl+退出和ctrl+dEOF的區別(轉)

列表 art 信息 csdn 而是 png detail tps 後臺 一、後臺進程管理命令 fg、bg、jobs、&、ctrl + z、ctrl + c、ctrl + \、ctrl + d1、 &加在一個命令的最後,可以把這個命令放到後臺執行 ,如fire

用maven來創建scala和java項目代碼環境圖文詳解Intellij IDEAUltimate版本Intellij IDEACommunity版本和Scala IDEA for Eclipse皆適用博主推薦

搭建 ava XML .com 自動 ado ima 強烈 mapred 為什麽要寫這篇博客?   首先,對於spark項目,強烈建議搭建,用Intellij IDEA(Ultimate版本),如果你還有另所愛好嘗試Scala IDEA for Eclipse,有時間自己去

機器學習實戰決策樹DTDecision TreeID3演算法

目錄 0. 前言 1. 資訊增益(ID3) 2. 決策樹(Decision Tree) 3. 實戰案例 3.1. 隱形眼鏡案例 3.2. 儲存決策樹 3.3. 決策樹畫圖表示 學習完機器學習實戰的決策樹,簡單的做

java二進位制數原碼補碼反碼,運算子 與&~|異或^及位運算總結

    看過博主另一篇文章--Java集合--HashMap,對裡面使用的運算子及位運算不是很清楚的童鞋可以看下這篇文章,對理解hashMao原始碼很有幫助,自己也可以在程式中寫寫,逼格絕對滿分!!!      大家都知道一個位元組是8個二進位制

Java 013 StringBuffer類Arrays類常見排序包裝類Integer類

知識點梳理 心得體會 小知識點 1.執行緒安全與不安全 概念:程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。執行緒安全的程式,多程序需要訪

線性迴歸5嶺迴歸LAR演算法實現LASSO演算法實戰---機器學習

嶺迴歸演算法: 嶺迴歸原理不懂的,請先搞懂嶺迴歸的原理在實現,只看程式碼不懂原理和不學差不多,不懂的請看什麼是嶺迴歸,下面直接給出嶺迴歸的優化公式: 經過化簡以後的目標公式為:    原始的最小二乘法的無偏估計優化目標公式為:    

(ECC)RSA和AES混合演算法實戰客戶端服務端雙向加密

https://blog.csdn.net/myzksky/article/details/81042135 RSA和ECC混合演算法實戰(客戶端、服務端雙向加密) 注意點(RSA加密資料效能較弱,而且有長度限制,最多不能超過117位資料,超出後則丟擲異常) 預設情況下AES加密、ECC