【南郵操作系統實驗,大牛帶你直擊優秀開源框架靈魂

代碼摸摸大 2021-09-19 23:34:01 阅读数:514

操作 大牛 框架
 // 實現 FIFO 算法
// 本次頁面走向,物理頁框中不存在,且物理頁框中沒有空比特了
if (isExist == false && isEmpty == false){
// 此時的 pageFrame[helpNum%frameNum] 為淘汰頁面
stack.push(pageFrame[helpNum%frameNum]); // 淘汰頁面入棧
// System.out.println("本次淘汰頁面:" + pageFrame[helpNum%frameNum]);
sb.append("本次淘汰頁面:" + pageFrame[helpNum%frameNum] + "\n");
pageFrame[helpNum%frameNum] = page[count]; // 先進先出
helpNum++;
}
if (isMiss == true){ // 計算缺頁次數
pageMissNum++;
}
// System.out.print("目前物理頁框中頁面走向為:");
sb.append("目前物理頁框中頁面走向為:");
for (Integer i : pageFrame) {
// System.out.print(i + " ");
sb.append(i + " ");
}
// System.out.println();
sb.append("\n---------------------------------------\n");
count++;
}
// System.out.println();
sb.append("\n");
System.out.println("缺頁次數:" + pageMissNum + "次");
System.out.println("一共調用: " + pageNum + "次");
System.out.println("缺頁中斷率:" + pageMissNum*1.0/pageNum*100 + "%" );
System.out.print("淘汰頁面:");
for (Integer integer : stack) {
System.out.print(integer + " ");
}
return sb.toString();
}
public static void main(String[] args) {
FIFO fifo = new FIFO();
String s = fifo.fifoRun(3, "2 3 2 1 5 2 4 5 3 2 5 2");
System.out.println(s);
}

}


[](
)LRU
----------------------------------------------------------------------

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

package com.yusael.pagereplace;

import java.util.Stack;

public class LRU {

public int frameNum; // 分配給該作業的物理頁框數
public Integer[] pageFrame; // 物理頁框
public int pageNum; // 作業的頁面走向總次數
public Integer[] pages; // 作業的頁面走向
public Stack<Integer> stack = new Stack<>(); // 存放淘汰頁面的棧
public int pageMissNum = 0; // 缺頁次數
public String lruRun(int frameNum, String inputPages) {
this.frameNum = frameNum; // 物理頁框數
String[] split = inputPages.split("\\s+|,\\s+|,\\s+|,");
this.pageNum = split.length; // 作業的頁面走向總次數
pages = new Integer[pageNum]; // 作業的頁面走向
for (int i = 0; i < pageNum; i++) {
this.pages[i] = Integer.parseInt(split[i]);
}
pageFrame = new Integer[frameNum]; // 物理頁框
StringBuilder sb = new StringBuilder();
int count = 0;
while (count < pageNum) {
sb.append("【第" + (count + 1) + "次】\n");
boolean isMiss = true; // 判斷本次是否缺頁
boolean isEmpty = true; // 判斷物理頁框中是否有空比特
boolean isExist = false; // 判斷物理頁框中是否存在本次頁面走向
// 判斷物理頁框中是否已經存在本次頁面走向
for (int i = 0; i < frameNum; i++) {
if (pages[count] == pageFrame[i]) {
isExist = true;
break;
}
}
// 若本次頁面走向,物理頁框中已存在,則直接進入下次頁面走向
if (isExist == true){
sb.append("本次頁面走向,頁框中已經存在!\n");
sb.append("目前物理頁框中頁面走向為:");
for (Integer i : pageFrame) {
sb.append(i + " ");
}
sb.append("\n---------------------------------------\n");
count++;
continue;
}
// 判斷物理頁框有無空比特
for (int i = 0 ; i < frameNum ; i++){
if (pageFrame[i] == null){
isEmpty = true;
break;
}else{
isEmpty = false;
}
}
// 本次頁面走向,物理頁框中不存在,且有空比特,按順序放入
if (isExist == false && isEmpty == true){
for (int i = 0; i < frameNum; i++) {
if (pageFrame[i] == null) { // 物理頁框中有空比特則放入
pageFrame[i] = pages[count];
break; // 從頭開始找,找到一個空比特即可
}
}
}
// 本次頁面走向,物理頁框中不存在,且物理頁框中沒有空比特了
// 實現 LRU 算法
if (!isExist && !isEmpty){
for (int i = 0 ; i < frameNum ; i++){
if (pages[count-frameNum] == pageFrame[i]){
stack.push(pageFrame[i]); // 淘汰頁面入棧
pageFrame[i] = pages[count];
}
}
}
if (isMiss == true){ // 計算缺頁次數
pageMissNum++;
}
sb.append("目前物理頁框中頁面走向為:");
for (Integer i : pageFrame) {
sb.append(i + " ");
}
sb.append("\n---------------------------------------\n");
count++;
}
sb.append("\n");
return sb.toString();
/* System.out.println("缺頁次數:" + pageMissNum + "次");
System.out.println("一共調用: " + pageNum + "次");
System.out.println("缺頁中斷率:" + pageMissNum*1.0/pageNum*100 + "%" );
System.out.print("淘汰頁面:");
for (Integer integer : stack) {
System.out.print(integer + " ");
}*/
}
public static void main(String[] args) {
LRU lru = new LRU();
String s = lru.lruRun(3, "2 3 2 1 5 2 4 5 3 2 5 2");
System.out.println(s);
}

}


[](
)OPT
----------------------------------------------------------------------

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

package com.yusael.pagereplace;

import java.util.Stack;

public class OPT {

public int frameNum; // 分配給該作業的物理頁框數
public Integer[] pageFrame; // 物理頁框
public int pageNum; // 作業的頁面走向總次數
public Integer[] pages; // 作業的頁面走向
public Stack<Integer> stack = new Stack<>(); // 存放淘汰頁面的棧
public int pageMissNum = 0; // 缺頁次數
public String optRun(int frameNum, String inputPages) {
this.frameNum = frameNum; // 物理頁框數
String[] split = inputPages.split("\\s+|,\\s+|,\\s+|,");
this.pageNum = split.length; // 作業的頁面走向總次數
pages = new Integer[pageNum]; // 作業的頁面走向
for (int i = 0; i < pageNum; i++) {
this.pages[i] = Integer.parseInt(split[i]);
}
pageFrame = new Integer[frameNum]; // 物理頁框
StringBuilder sb = new StringBuilder();
int count = 0;
while (count < pageNum) {
sb.append("【第" + (count + 1) + "次】\n");
boolean isMiss = true; // 判斷本次是否缺頁
boolean isEmpty = true; // 判斷物理頁框中是否有空比特
boolean isExist = false; // 判斷物理頁框中是否存在本次頁面走向
// 判斷物理頁框中是否已經存在本次頁面走向
for (int i = 0; i < this.frameNum; i++) {
if (pages[count] == pageFrame[i]) {
isExist = true;
break;
}
}
// 若本次頁面走向,物理頁框中已存在,則直接進入下次頁面走向
if (isExist == true){
sb.append("本次頁面走向,頁框中已經存在!\n");
sb.append("目前物理頁框中頁面走向為:");
for (Integer i : pageFrame) {
sb.append(i + " ");
}
sb.append("\n---------------------------------------\n");
count++;
continue;
}
// 判斷物理頁框有無空比特
for (int i = 0; i < this.frameNum; i++){
if (pageFrame[i] == null){
isEmpty = true;
break;
}else{
isEmpty = false;
}
}
// 本次頁面走向,物理頁框中不存在,且有空比特,按順序放入
if (isExist == false && isEmpty == true){
for (int i = 0; i < this.frameNum; i++) {
if (pageFrame[i] == null) { // 物理頁框中有空比特則放入
pageFrame[i] = pages[count];
break; // 從頭開始找,找到一個空比特即可
}
}
}
// 本次頁面走向,物理頁框中不存在,且物理頁框中沒有空比特了
// 實現 OPT 算法
if (isExist == false && isEmpty == false){
boolean isExistEle = false; // 是否存在未來不再出現的元素
boolean isFound = false; // 是否找到未來下標的元素
int frameIndex = 0; // 記錄的物理頁框下標
Stack<Integer> helpStack = new Stack<>(); // 輔助棧
// 尋找將來不再出現的,存在於當前物理頁框中的元素
for (int i = 0; i < this.frameNum; i++){
for (int j = count; j < pageNum; j++){
if (pageFrame[i] == pages[j]){ // 若當前物理頁框中,不存在未來不再出現的元素
helpStack.push(j); // 記錄當前未來將遇見的下標
isFound = true; // 找到未來下標的元素
}
}
// 當前物理頁框中,存在未來不再出現的元素
if (!isFound){
frameIndex = i; // 記錄當前物理頁框
isExistEle = true; // 存在未來不再出現的元素
break;
}
isFound = false;
}
/*for (Integer integer : helpStack) {
System.out.println(integer);
}
System.out.println("TEST " + frameIndex);
System.out.println("isExistEle " + isExistEle);
System.out.println("isFound " + isFound);*/
if(isExistEle){ // 存在未來不再出現的元素
stack.push(pageFrame[frameIndex]); // 淘汰頁面入棧
pageFrame[frameIndex] = pages[count];
}else{ // 不存在未來不再出的元素
int t = 0;
for (Integer integer : helpStack) {
if(t < integer){
t = integer;
}
}
for (int i = 0; i < this.frameNum; i++){
if (pageFrame[i] == pages[t]){
stack.push(pageFrame[i]); // 淘汰頁面入棧
pageFrame[i] = pages[count];
}
}
}
}
if (isMiss == true){ // 計算缺頁次數
pageMissNum++;
}
sb.append("目前物理頁框中頁面走向為:");
for (Integer i : pageFrame) {
sb.append(i + " ");
}
sb.append("\n---------------------------------------\n");
count++;
}
sb.append("\n");
return sb.toString();
}
public static void main(String[] args) {
OPT opt = new OPT();
String s = opt.optRun(3, "2 3 2 1 5 2 4 5 3 2 5 2");
System.out.println(s);
}

}


[](
)FXML界面
-------------------------------------------------------------------------
console.fxml:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

<?xml version=“1.0” encoding=“UTF-8”?>

最後

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

【南郵操作系統實驗,大牛帶你直擊優秀開源框架靈魂_後端

版权声明:本文为[代碼摸摸大]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919233400693O.html