完成LRU頁面調度算法的模擬

目錄

1.上代碼

2.實現思路?


1.上代碼

#include<iostream>
using namespace std;
//內存塊類
class memory
{
public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(memory *My_Memory, int ans, int a);friend void show(memory *My_Memory, int ans);
private:int page;int time;
};
//為了多次初始化
void memory::init()
{page = 0;time = 0;
}
//修改內存塊保存的頁和時間
void memory::alter(int a, int b)
{page = a;time = b;
}
//檢查該塊是否已被占用
int memory::check_full()
{if (page == 0 && time == 0){return 1;}else{return 0;}
}
//檢查該塊的駐留時間
int memory::check_old()
{return time;
}
//檢查該塊中是否保存了頁a
int memory::check_exist(int a)
{if (page == a){return 1;}else{return 0;}
}
//時間++
void memory::run()
{if (page != 0){time++;}
}
//時間置0
void memory::refresh()
{time = 0;
}
//調度作業
int manage(memory *My_Memory, int ans, int a)
{//檢查內存塊是否已經保存了頁面afor (int i = 0; i < ans; i++){if (My_Memory[i].check_exist(a)){cout << "不發生中斷,頁面" << a << "已在內存塊" << i << "中" << endl;My_Memory[i].refresh();return 1;}}//檢查內存塊是否有空閑頁面for (int i = 0; i < ans; i++){if (My_Memory[i].check_full()){cout << "發生中斷," << "內存塊" << i << "空閑中,頁面" << a << "裝入" << endl;My_Memory[i].alter(a, 0);return 0;}}//找到駐留時間最大的塊,進行替換int max_time = 0;int num = -1;for (int i = 0; i < ans; i++){if (My_Memory[i].check_old()>max_time){max_time = My_Memory[i].check_old();num = i;}}cout << "發生中斷," << "內存塊" << num << "中頁面" << My_Memory[num].page << "被替換,頁面" << a << "裝入" << endl;My_Memory[num].alter(a, 0);return 0;
}
//顯示內存塊當前狀態
void show(memory *My_Memory, int ans)
{cout << "...................................." << endl;cout << "內存塊號";for (int i = 0; i < ans; i++){cout << "  |" << i;}cout << "\n頁面號  ";for (int i = 0; i < ans; i++){cout << "  |" << My_Memory[i].page;}cout << "\n駐留時間";for (int i = 0; i < ans; i++){cout << "  |" << My_Memory[i].time;}cout << "\n....................................\n" << endl;
}
int main()
{cout << "***************************" << endl;cout << "***   頁面置換算法LRU   ***" << endl;cout << "*** 1.設置存儲區塊數    ***" << endl;cout << "*** 2.頁面調度模擬      ***" << endl;cout << "*** 3.缺頁率統計        ***" << endl;cout << "*** 4.退出模擬器        ***" << endl;cout << "***************************" << endl;int ans, aans = 0, nohit = 0;memory My_Memory[100];int flag;while (true){cout << "\n請選擇功能:";cin >> flag;if (flag == 1){//設置存儲區塊數cout << "請輸入存儲區塊數:";cin >> ans;for (int i = 0; i < ans; i++){My_Memory[i].init();  }nohit = 0;aans = 0;}else if (flag == 2){//頁面調度模擬while (true){for (int i = 0; i < ans; i++){My_Memory[i].run();}cout << "請輸入要調入的頁面(輸入0結束):";int a;cin >> a;if (a == 0){break;}aans++;if (!manage(My_Memory, ans, a)){nohit++;}show(My_Memory, ans);}}else if (flag == 3){//缺頁率統計cout << "*****************" << endl;cout << "調度作業 " << aans << "次\n中斷     " << nohit << "次\n缺頁率   " << double(nohit) / aans * 100.00 << "%" << endl;cout << "*****************" << endl;}else if (flag == 4){//退出cout << "成功退出!\n" << endl;break;}}return 0;
}

運行ok的放心 =w=

2.實現思路?

LRU頁面調度算法的代碼實現思路

1. 定義了一個memory類,表示內存塊,包含了一些成員函數和變量用于處理內存塊的操作。

  1. init():初始化內存塊的頁和時間。
  2. alter(int a, int b):修改內存塊保存的頁和時間。
  3. check_full():檢查內存塊是否已被占用。
  4. check_old():返回內存塊的駐留時間。
  5. check_exist(int a):檢查內存塊中是否保存了特定頁。
  6. run():時間增加1。
  7. refresh():將時間置為0。
  1. manage()函數:用于調度作業,實現LRU頁面置換算法的核心邏輯。
  1. 檢查內存塊是否已保存了頁面a,如果是則不發生中斷。
  2. 檢查是否有空閑內存塊,若有則將頁面a裝入,否則找到駐留時間最長的內存塊進行替換。
  3. 返回0表示發生中斷,返回1表示不發生中斷。

3. show()函數:用于顯示內存塊的當前狀態,包括內存塊號、頁面號和駐留時間。

4. main()函數:主程序,包含了整個模擬器的交互邏輯。

  1. 提供了四個功能選項:設置存儲區塊數、頁面調度模擬、缺頁統計以及退出模擬器。
  2. 用戶選擇不同功能并輸入相應數據,程序會執行相應的操作并顯示結果。

5. 模擬過程:

  1. 用戶可以設置存儲區塊數,然后模擬頁面調度過程,輸入要調入的頁面來模擬LRU頁面置換算法。

設置存儲區塊數為4,依次調入1、2、3、4號頁面:

調入第五塊時,最久未被使用的頁面1被替換掉:

  1. 可以統計調度作業次數、中斷次數和缺頁率。

接著,依次訪問頁面3、頁面4、頁面3后,計算缺頁率:

訪問8次,中斷5次,缺頁率計算為62.5%:

6. 代碼通過類的方式封裝了內存塊的操作,提高了代碼的可讀性和可維護性。用戶可以交互式地進行頁面置換算法的模擬和統計。

  • 小總結與進一步改進設想

小總結:

以上代碼實現了LRU頁面置換算法的模擬器,可以幫助用戶理解LRU算法的工作原理和在操作系統中的應用。代碼結構清晰,邏輯比較簡單,可以通過用戶輸入進行模擬頁面調度,并統計缺頁率等信息。

進一步改進設想:

1. 引入更多的頁面置換算法:除了LRU算法,可以考慮實現其他常用的頁面置換算法,如FIFO算法、LFU算法等。這樣用戶可以選擇不同的算法進行比較和分析。

2. 添加可視化界面:可以考慮將模擬器的操作界面進行可視化設計,包括圖形化展示內存狀態、頁面調度過程等,讓用戶更直觀地了解算法的工作過程。

3. 支持更復雜的內存管理方案:目前代碼只實現了簡單的內存塊分配和頁面替換,可以考慮添加更復雜的內存管理機制,如頁表、地址轉換等,使模擬器更貼近實際操作系統的內存管理情景。

4. 增加性能優化:優化代碼邏輯、數據結構和算法,提高模擬器的性能和穩定性,使其能夠處理更大規模的頁面調度模擬。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82751.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Three.js 直線拐角自動圓角化(圓弧轉彎)

目錄 前言 計算圓心坐標 計算兩條直線的角平分線 計算dir1 dir2的夾角 計算圓心到直線交點的距離 計算圓心 計算從正X軸算起曲線開始、終止的角度 計算垂足與兩直線交點距離 計算垂足 計算垂線 計算兩垂線與x軸的夾角 ?編輯 計算圓弧是否按照順時針方向來繪制 成功…

【MYSQL】mysql單表億級數據查詢優化處理

1、實踐表明mysql單表數據超過一億后&#xff0c;數據進行交并差效率會非常慢&#xff0c;所以這時候就要進行表的優化。 我這里主要是使用索引。 2、表字段精量精簡 查索引&#xff0c;建索引&#xff0c;刪索引語法 --查看索引 -- SHOW INDEX FROM 表名; -- 刪除索引 --AL…

C++基礎:模擬實現vector(有存在深層次的淺拷貝問題)

目錄 引言 一、vector的基本框架 二、尾插push_back、reserve擴容、任意位置插入insert&#xff08;增&#xff09; 1.reserve擴容 2.push_back尾插 3.深層次的淺拷貝問題 4. 任意位置插入數據insert(會使迭代器失效) 三、構造、析構、拷貝構造函數 1.構造函數 1.1無…

【力扣】關于鏈表索引

怎么才能走到目標節點呢&#xff1f; 從9走到2&#xff0c;需要2步&#xff0c;他們的索引分別是&#xff1a;0&#xff0c;2 在for循環里&#xff1a;int i 0; i < 2; i i的范圍是【0&#xff0c;2&#xff09; 有&#xff1a;2 2 - 0 如果從虛擬頭節點開始走到2&#x…

C++ ODB框架詳解:現代C++對象關系映射解決方案

目錄 框架簡介安裝與配置基礎概念實體映射數據庫操作查詢操作高級功能性能優化最佳實踐 框架簡介 ODB&#xff08;Object-Relational Database&#xff09;是一個專為C設計的對象關系映射&#xff08;ORM&#xff09;框架&#xff0c;由CodeSynthesis公司開發。它提供了一種…

Ai書簽管理工具開發全記錄(一):項目總覽與技術藍圖

文章目錄 Ai書簽管理工具開發全記錄&#xff08;一&#xff09;&#xff1a;項目總覽與技術藍圖 ?1. 項目背景與核心價值 &#x1f4a1;1.1. 核心特點 2. 技術架構分析 &#x1f3d7;?功能架構全景圖典型工作流 3. 核心技術棧選擇 &#x1f6e0;?4. 預期使用功能說明 &#…

GUI 編程——python

GUI 編程核心概念 GUI&#xff08;圖形用戶界面&#xff0c;Graphical User Interface&#xff09; 是一種通過圖形元素&#xff08;窗口、按鈕、菜單等&#xff09;與用戶交互的應用程序形式&#xff0c;相比命令行界面更直觀易用。以下是學習 GUI 編程的基礎概念和流程&…

【Doris基礎】Apache Doris 基本架構深度解析:從存儲到查詢的完整技術演進

目錄 1 引言 2 Doris 架構全景圖 2 核心組件技術解析 2.1 Frontend 層&#xff08;FE&#xff09; 2.2 Backend 層&#xff08;BE&#xff09; 3 數據存儲與復制機制 3.1 存儲架構演進 3.2 副本復制策略 4 查詢處理全流程解析 4.1 查詢生命周期 5 高可用設計 5.1 F…

光電賦能低空場景,靈途科技助力無人機持續升級

2025 UASE 主題為“步入低空經濟新時代”的“2025第九屆世界無人機大會暨國際低空經濟與無人系統博覽會/第十屆深圳國際無人機展覽會”5月23日在深圳會展中心隆重開幕。本屆展會匯聚了全球800余家企業參展&#xff0c;展示5000多款無人機及系統設備&#xff0c;全面呈現低空經…

iOS QQ抽屜式導航的實現

QQ個人中心的側滑功能(通常稱為"抽屜式導航")可以通過以下幾種方式在iOS中實現&#xff1a; 主要實現方案 使用第三方庫 最快速的方式是使用成熟的第三方庫&#xff1a; SWRevealViewController&#xff1a;最流行的側滑菜單庫MMDrawerController&#xff1a;另一…

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行標簽或列標簽前添加指定前綴的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行標簽或列標簽后添加指定后綴的方法DataFram…

長短期記憶網絡 (LSTM) 詳解:從原理到應用

一、引言&#xff1a;序列數據處理的挑戰? 在自然語言處理、語音識別、時間序列分析等領域&#xff0c;數據通常以序列形式存在&#xff0c;前后數據點之間存在依賴關系。傳統循環神經網絡 (RNN) 雖然能捕捉序列依賴&#xff0c;但存在嚴重的梯度消失 / 爆炸問題&#xff0c;…

三天掌握PyTorch精髓:從感知機到ResNet的快速進階方法論

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。 一、分析式AI基礎與深度學習核心概念 1.1 深度學習三要素 數學基礎&#xff1a; f(x;W,b)σ(Wxb)(單層感知機) 1.2 PyTorch核心組件 張量操作示例…

Linux操作系統概述

一、操作系統的作用 1、五大基本功能 &#xff08;1&#xff09;進程和線程的管理&#xff1a;進程線程的狀態、控制、同步互斥、通信調度等 (2&#xff09;存儲管理&#xff1a;分配/回收、地址轉換、存儲保護等 (3&#xff09;文件管理&#xff1a;文件目錄、文件操作、磁盤…

Python爬蟲第22節- 結合Selenium識別滑動驗證碼實戰

目錄 一、引言 二、滑動驗證碼原理與反爬機制 2.1 驗證碼原理 2.2 反爬機制 三、工程實戰&#xff1a;滑動驗證碼識別全流程 3.1 工程準備 3.1.1 環境依賴 3.1.2 目標網站與驗證碼識別案例 3.2 核心破解流程 3.2.1 自動化打開網頁與登錄 3.2.2 獲取驗證碼圖片&#…

NSSCTF-[NISACTF 2022]huaji?

下載附件得到文件 放到kali里面看看 發現是一張圖片 用binwalk命令對其進行分離 發現需要密碼 用010打開圖片進行查看 對其進行解密 分別得到 ctf_NISA_2022 nisa_2022 發現ctf_NISA_2022是密碼 得到flag NSSCTF{Nls_FumYEnnOjy}

nt!CcGetVacbMiss函數分析之設置好nt!_VACB然后調用函數nt!SetVacb

第一部分&#xff1a;MmMapViewInSystemCache函數返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …

Uniapp+UView+Uni-star打包小程序極簡方案

一、減少主包體積 主包污染源&#xff08;全局文件依賴&#xff09;勁量獨立導入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷&#xff0c;未配置manifest.json中mp-weixin節點 "usingComponents" : true,"lazyCodeLoading" : "requiredC…

Teigha應用——解析CAD文件(DWG格式)Teigha在CAD C#二次開發中的基本應用

Teigha是一款專為開發者設計的工具&#xff0c;其核心技術在于強大的API和豐富的功能集&#xff0c;提供了一系列工具和方法&#xff0c;使開發者能夠輕松地讀取、解析和操作DWG文件。它支持多種操作系統&#xff0c;能在處理大型DWG文件時保持高效性能&#xff0c;還可用于構建…

JavaWeb:SpringBoot Bean管理

獲取Bean Bean作用域 解決循環依賴方式 1.粗暴刪除依賴 2.打破依賴配置 3.使用lazy注解 引入第三方Bean