作業系統課程設計——頁式虛擬儲存系統設計
語言:C#
工具:VS2017
程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { int[] Memory = new int[100005]; int[] vist = new int[10005]; int[,] process = new int[10005, 10005]; int[] proPageNum = new int[10005]; int[,] runad = new int[10005, 10005]; int[,] processhave = new int[10005, 10005];//暫時分配的頁數 int[] visid = new int[10005]; int[] que = new int[10005]; int[] Mpr = new int[10005]; int frameSize; int frameNum; string []binaryAd=new string[100]; int tot,ad; int ans = 0; int par=0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string kas = textBox1.Text; if (kas.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } frameSize = int.Parse(kas); kas = textBox2.Text; if (kas.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } int b = int.Parse(kas); if (frameSize == 0) { MessageBox.Show("非法!"); return; } else { for(int i=0;i<10005;i++) { for(int j=0;j<10005;j++) { process[i, j] = -1; } } frameNum = b / frameSize; tot = frameNum; MessageBox.Show("記憶體初始化完成,主存共有" + frameNum + "個物理框。"); ad = 0; int qd = frameSize; while(qd!=0) { ad++; qd /= 2; } ad--; } progressBar1.Maximum =b;//設定最大長度值 } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { string s = textBox3.Text; if (s.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } int id = int.Parse(s); string ss = textBox4.Text; if (ss.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } int size = int.Parse(ss); if (frameSize==0) { MessageBox.Show("非法!"); } else { size = (int)Math.Ceiling((double)size/ frameSize); int icv = size; if (visid[id] == 1) { MessageBox.Show("程序號唯一,請重新輸入作業號(從1開始)"); return; } else if (size > tot) { MessageBox.Show("主存剩餘空間不能裝下該作業,請求失敗."); return; } else { for(int i=0;i<10005;i++) { process[id, i] = -1; } tot -= size; visid[id] = 1; MessageBox.Show("分配成功!將順序為此程序分配" + size + "個物理框"); proPageNum[id] = size; for (int i = 0, k = 0; i < frameNum && k < size; i++) { if (Memory[i] == 0) { process[id, k] = i; Memory[i] = id; k++; } } } if (progressBar1.Value + icv <= progressBar1.Maximum) { progressBar1.Value += icv*frameSize; ;//設定當前值 } } } private void label5_Click(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { string s = string.Empty; for (int i = 0; i < frameNum; i++) { if (Memory[i] == 0) s += " N "; else { s+=" "+Memory[i].ToString()+" "; } if ((i+1 )% 5 == 0) { s += "\r\n"; } } textBox5.Text = s; } private void button4_Click(object sender, EventArgs e) { int processid; string s = textBox7.Text; if (s.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } processid = int.Parse(s); string rs = string.Empty; if (visid[processid] == 0) { MessageBox.Show("沒有該程序!"); } else { rs = " 頁號 物理框號\r\n\r\n"; for (int i = 0; i <10005; i++) { if (process[processid, i] == -1) continue; rs += " "+i+" " + process[processid, i].ToString() + "\r\n"; } textBox6.Text = rs; } } private void 跑程序_Click(object sender, EventArgs e) { } private void button5_Click(object sender, EventArgs e) { if(radioButton1.Checked==true) { //MessageBox.Show("FIFO"); Mpr = new int[1000]; vist = new int[1000]; string s = string.Empty; if (textBox8.Text.Equals("")|| textBox9.Text.Equals("")||textBox10.Text.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } int number = int.Parse(textBox8.Text);//程序號 if(visid[number]==1) { MessageBox.Show("程序號唯一,請重新輸入。"); return; } int fnum =int.Parse( textBox9.Text);//物理框數 if(fnum>tot) { MessageBox.Show("主存剩餘空間不能裝下該作業,請求失敗."); return; } visid[number] = 1; for (int i = 0; i <10005; i++) { process[number, i] = -1; } for (int i = 0, k = 1; i < frameNum && k <= fnum; i++) { if (Memory[i] == 0) { processhave[number,k] = i; k++; } } string os = textBox10.Text; runad = new int[1000, 1000]; int a = 0; int cnt = 0; for (int i = 0; i < os.Length; i++) { if (os[i] != ' ') { a = a * 10 + os[i] - '0'; } else { if (a > 0) { runad[number, ++cnt] = a; } a = 0; } } if (a > 0) runad[number, ++cnt] = a; int cntt = cnt; s += "物理框號 "; for (int i = 1; i <= fnum; i++) { s+=processhave[number,i].ToString()+" "; } s += " 狀態\r\n\r\n"; int cas = 0; int top = 0; int tail = 0; int ming = 0; for (int i = 1; i <= cnt; i++) { cas = 0; s += " " + runad[number, i].ToString() + "| "; if (vist[runad[number,i]]==1) { for (int j = 1; j <= fnum; j++) { s+= Mpr[processhave[number,j]].ToString()+ " "; } s +=" 命中\r\n"; ming++; continue; } for (int j = 1; j <= fnum; j++) { //cout<<j<<"++"<<number<<"++"<<Memory[processhave[number][j]]<<" "; if (processhave[number, j]!=-1&&Memory[processhave[number,j]] == 0) { process[number,runad[number,i]] = processhave[number,j]; Memory[processhave[number,j]] = number; que[tail++] = runad[number,i]; Mpr[processhave[number,j]] = runad[number,i]; vist[runad[number,i]] = 1; break; } else cas++; } int toppage=0; if (cas == fnum) { toppage = que[top++]; // cout<<"++"<<toppage<<endl; vist[toppage] = 0; process[number,runad[number,i]] = process[number,toppage]; vist[runad[number,i]] = 1; Mpr[process[number,toppage]] = runad[number,i]; que[tail++] = runad[number,i]; process[number,toppage] = -1; //cout<<"淘汰的頁面"<<endl; } for (int j = 1; j <= fnum; j++) { s+=Mpr[processhave[number,j]].ToString()+ " "; } if (cas == fnum) s += " 置換" + toppage.ToString(); else { s += " 直接調頁"; } s += "\r\n"; } int maxl =0; for(int i=0;i<10005;i++) { if (process[number, i] != -1) maxl++; } proPageNum[number] =maxl; double hide = Convert.ToDouble(ming)/Convert.ToDouble(cnt); MessageBox.Show(s+"\r\n利用FIFO置換演算法,其中命中"+ming+"次"+",命中率為"+hide.ToString("0.00")); progressBar1.Value += frameSize * fnum; tot -= fnum; } else if(radioButton2.Checked==true) { //MessageBox.Show("LRU"); /*fkdsnfgkodsg*/ Mpr = new int[1000]; vist = new int[1000]; string s = string.Empty; if (textBox8.Text.Equals("") || textBox9.Text.Equals("") || textBox10.Text.Equals("")) { MessageBox.Show("請輸入有效值!"); return; } int number = int.Parse(textBox8.Text);//程序號 if (visid[number] == 1) { MessageBox.Show("程序號唯一,請重新輸入。"); return; } int fnum = int.Parse(textBox9.Text);//物理框數 if (fnum > tot) { MessageBox.Show("主存剩餘空間不能裝下該作業,請求失敗."); return; } visid[number] = 1; for (int i = 0; i < 10005; i++) { process[number, i] = -1; } for (int i = 0, k = 1; i < frameNum && k <= fnum; i++) { if (Memory[i] == 0) { processhave[number, k] = i; k++; } } string os = textBox10.Text; runad = new int[1000, 1000]; int a = 0; int cnt = 0; for (int i = 0; i < os.Length; i++) { if (os[i] != ' ') { a = a * 10 + os[i] - '0'; } else { if (a > 0) { runad[number, ++cnt] = a; } a = 0; } } if (a > 0) runad[number, ++cnt] = a; int cntt = cnt; s += "物理框號 "; for (int i = 1; i <= fnum; i++) { s += processhave[number, i].ToString() + " "; } s += " 狀態\r\n\r\n"; int cas = 0; int ming = 0; for (int i = 1; i <= cnt; i++) { cas = 0; s += " " + runad[number, i].ToString() + "| "; if (vist[runad[number, i]] == 1) { for (int j = 1; j <= fnum; j++) { s += Mpr[processhave[number, j]].ToString() + " "; } s += " 命中\r\n"; ming++; continue; } for (int j = 1; j <= fnum; j++) { //cout<<j<<"++"<<number<<"++"<<Memory[processhave[number][j]]<<" "; if (processhave[number, j] != -1 && Memory[processhave[number, j]] == 0) { process[number, runad[number, i]] = processhave[number, j]; Memory[processhave[number, j]] = number; Mpr[processhave[number, j]] = runad[number, i]; vist[runad[number, i]] = 1; break; } else cas++; } int toppage = 0; if (cas == fnum) { int pos = i; int knum = 0; while(knum<fnum) { if (runad[number, pos] != runad[number, pos - 1]) knum++; if (knum == fnum) { toppage = runad[number, pos-1]; break; } pos--; } vist[toppage] = 0; process[number, runad[number, i]] = process[number, toppage]; vist[runad[number, i]] = 1; Mpr[process[number, toppage]] = runad[number, i]; process[number, toppage] = -1; //cout<<"淘汰的頁面"<<endl; } for (int j = 1; j <= fnum; j++) { s += Mpr[processhave[number, j]].ToString() + " "; } if (cas == fnum) s += " 置換" + toppage.ToString(); else { s += " 直接調頁"; } s += "\r\n"; } int maxl = 0; for (int i = 0; i < 10005; i++) { if (process[number, i] != -1) maxl++; } proPageNum[number] = maxl; double hide = Convert.ToDouble(ming) / Convert.ToDouble(cnt); MessageBox.Show(s + "\r\n利用LRU置換演算法,其中命中" + ming + "次" + ",命中率為" + hide.ToString("0.00")); progressBar1.Value += frameSize * fnum; tot -= fnum; } } private void Form1_Load(object sender, EventArgs e) { } private void progressBar1_Click(object sender, EventArgs e) { } private void label6_Click(object sender, EventArgs e) { } private void button6_Click(object sender, EventArgs e) { Application.Exit(); } private void panel1_Paint(object sender, PaintEventArgs e) { } private Point mousePoint = new Point(); private void panel1_MouseMove(object sender, MouseEventArgs e) { base.OnMouseMove(e); if (e.Button == MouseButtons.Left) { this.Top = Control.MousePosition.Y - mousePoint.Y; this.Left = Control.MousePosition.X - mousePoint.X; } } private void panel1_MouseDown(object sender, MouseEventArgs e) { base.OnMouseDown(e); this.mousePoint.X = e.X; this.mousePoint.Y = e.Y; } private void button6_Click_1(object sender, EventArgs e) { this.WindowState = FormWindowState.Minimized; } private void button7_Click(object sender, EventArgs e) { DialogResult result = MessageBox.Show("是否退出?", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { //this.Dispose(); Application.Exit(); } } private void button8_Click(object sender, EventArgs e) { int id = int.Parse(textBox12.Text); int sub = proPageNum[id]; for (int i = 0; i <10005; i++) { if(process[id,i]!=-1) Memory[process[id,i]] = 0; process[id,i] = -1; } visid[id] = 0; tot += proPageNum[id]; proPageNum[id] = 0; MessageBox.Show("回收完畢!"); progressBar1.Value -= sub * frameSize; } private void button9_Click(object sender, EventArgs e) { Dictionary<string, string> M = new Dictionary<string, string>(); //新增鍵值對資料,鍵必須唯一,值可重複 M.Add("0000", "0"); M.Add("0001", "1"); M.Add("0010", "2"); M.Add("0011", "3"); M.Add("0100", "4"); M.Add("0101", "5"); M.Add("0110", "6"); M.Add("0111", "7"); M.Add("1000", "8"); M.Add("1001", "9"); M.Add("1010", "A"); M.Add("1011", "B"); M.Add("1100", "C"); M.Add("1101", "D"); M.Add("1110", "E"); M.Add("1111", "F"); binaryAd['0'] = "0000"; binaryAd['1'] = "0001"; binaryAd['2'] = "0010"; binaryAd['3'] = "0011"; binaryAd['4'] = "0100"; binaryAd['5'] = "0101"; binaryAd['6'] = "0110"; binaryAd['7'] = "0111"; binaryAd['8'] = "1000"; binaryAd['9'] = "1001"; binaryAd['A'] = "1010"; binaryAd['B'] = "1011"; binaryAd['C'] = "1100"; binaryAd['D'] = "1101"; binaryAd['E'] = "1110"; binaryAd['F'] = "1111"; int number=int.Parse(textBox13.Text); string s, ds = ""; s = textBox11.Text; int adlen = 10 + ad; int totalen = (s.Length - 1) * 4; for (int i = 0; i < s.Length - 1; i++) { ds += binaryAd[s[i]]; } int pagenum = 0; int two = 1; string ss = ""; for (int i = totalen - adlen - 1; i >= 0; i--) { if (i != totalen - adlen - 1) two *= 2; pagenum += two * (ds[i] - '0'); ss += ds[i]; } //cout<<ss<<endl; textBox14.Text = pagenum.ToString(); //cout << "程式頁號:" << pagenum << endl; string res = ds.Substring(totalen - adlen, adlen); textBox16.Text = res; //cout << "偏移地址:" << res << endl; if (process[number,pagenum] == -1) { MessageBox.Show("該程式此頁沒有調入主存。"); return; // cout << "此頁沒有調入主存內。" << endl; } else { int mappage = process[number,pagenum]; int mappage2 = mappage; textBox15.Text = mappage2.ToString();//物理框號 ss = ""; while (mappage!=0) { ss += mappage % 2 ; mappage /= 2; } string sss = ""; for(int i=ss.Length-1;i>=0;i--) { sss += ss[i]; } ss = sss; MessageBox.Show(ss); // Reverse(ss.begin(), ss.end()); ss += res; //MessageBox.Show(ss); res = ""; int ads = ss.Length % 4; if(ads>0) { ads = 4 - ads; } for (int i = 1; i <=ads; i++) { res += '0'; } res += ss; //cout << res << endl; //MessageBox.Show(res); string ans = ""; string ws; for (int i = 0; i < res.Length; i++) { ws= ""; ws+= res[i]; ws+= res[i + 1]; ws+= res[i + 2]; ws+= res[i + 3]; i += 3; ans += M[ws]; } textBox17.Text = ans+"H"; // cout << ans << endl; } } } }
實現結果:
相關推薦
作業系統課程設計——頁式虛擬儲存系統設計
語言:C# 工具:VS2017 程式碼: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawi
作業系統儲存管理之分段式與段頁式虛擬儲存系統
分段式虛擬儲存系統 分段式虛擬儲存系統把作業的所有分段的副本都存放在輔助儲存器中,當作業被排程投入執行時,首先把當前需要的一段或幾段裝入主存,在執行過程中訪問到不在主存的段時再把它們裝入。因此,在段表中必須說明哪些段已在主存,存放在什麼位置,段長是多少。哪些段
作業系統 頁式虛擬儲存地址變換
#include "stdio.h" #define n 64 /*模擬實驗中假定的頁表長度,即最多允許程式含有多少頁;假定頁面大小為1K*/ #define length 10 struct { int lnumber;/*頁號*/ int flag; /*表示該頁
頁式虛擬儲存管理
頁式儲存的基本原理 將程式的邏輯地址空間劃分為固定大小的頁(page),而實體記憶體劃分為同樣大小的頁框(pageframe)。程式載入時,可將任意一頁放人記憶體中任意一個頁框,這些頁框不必連續,從而
資料結構課程設計之銀行活期儲存系統(設計報告)
C作為系統描述語言,既可以用來編寫系統軟體,也可以用來編寫應用軟體。C語言誕生後,許多原來用匯編語言編寫的軟體,現在都可以用C語言編寫;C++是一種靜態資料型別檢查的,支援多重程式設計正規化的通用程式設計語言。它支援過程化程式設計、資料
主存-輔存結構儲存體系(頁式虛擬儲存器)與Cache-主存結構儲存體系的不同
1.目的不同 主存-輔存是為了增加容量,cache-主存是為了提高速度 2.與cpu訪問方式不同 cpu只能訪問主存不能訪問輔存,cpu能訪問cache和主存 3.對映方式不同 主存-輔存是全相聯對映
阿里雲總監課,儲存系統設計——NVMe SSD效能影響因素一探究竟
目錄 1 儲存介質的變革 2 NVME SSD成為主流 2.1 NAND FLASH介質發展 2.2 軟體層面看SSD——多佇列技術 2.3 深入理解SSD硬體 3 影響NVME SSD的效能因素 3.1 GC對效能的影響 3.2 IO PATTERN對效能的
分散式儲存系統設計—— 資料分片
轉自:http://www.cnblogs.com/glacierh/p/5653512.html 在分散式儲存系統中,資料需要分散儲存在多臺裝置上,資料分片(Sharding)就是用來確定資料在多臺儲存裝置上分佈的技術。資料分片要達到三個目的: 分佈均勻,即每臺裝置上的資料量要儘可
linux核心設計與實現——虛擬檔案系統
虛擬檔案系統 虛擬檔案系統(有時也稱作虛擬檔案交換,更常見的是簡稱VFS)作為核心子系統,為使用者空間程式提供了檔案和檔案系統相關的介面。 之所以可以使用這種通用介面對所有型別的檔案系統進行操作,是因為核心在它的底層檔案系統介面上建立了一個VFS抽象層,該抽
作業系統原理讀書筆記之虛擬儲存技術
虛擬儲存技術 是指:當程序執行時,先將其中一部分裝入記憶體,另一部分暫留在磁碟,當要執行的指令或訪問的資料不在記憶體時,由作業系統自動完成將他們從磁碟調入記憶體的工作 虛存與儲存體系的關係 虛存構建在儲存體系之上,把記憶體和磁碟有機的結合起來使用,從而得到一個容量很大的記
LINUX虛擬儲存系統
linux為每個程序維持了一個單獨的虛擬地址空間,這個虛擬地址空間包括程式碼,資料,堆,共享庫以及棧段。這部分虛擬地址儲存器位於使用者棧之上。 核心將虛擬儲存器組織成一些區域(也較段)的集合,一個區域就是已經分配的虛擬儲存器的連續片。例如:程式碼段,資料段,共享庫段以及使用者棧都是不同的區域。 核心為每
找java設計,基於ssh,j2ee管理系統,設計,管理系統的設計思路與技巧
ava 畢設 框架 僅供參考 andro 培訓 中一 畢業 遠程 關於基於ssh,ssm,javaee等等管理系統的設計思路與框架搭建,很多同學都是一知半解,甚至是知之甚少。為了大家能快速的開發設計一套這樣的java設計,我們提供下面的一些方法僅供參考。不足之處大家可以相互
c++ 計算機作業系統虛擬頁式儲存管理系統模擬實現
本系統裸機上模擬硬體開始,進行了對計算機虛擬頁式儲存管理系統的模擬,通過對記憶體、外存、儲存管理部件、缺頁中斷機構等硬體的模擬,以及對程序的PCB,頁表等軟體結構的模擬,以請求分頁的方式,實現了先來先服
作業系統(4)虛擬儲存--覆蓋與交換、區域性性原理、虛擬頁式儲存、虛擬段式儲存、缺頁異常
文章目錄 1. 虛擬儲存的需求背景 2. 覆蓋和交換技術 (過時技術) 3. 區域性性原理(虛擬儲存的可實現前提) 4. 虛擬儲存概念 4. 虛擬頁式儲存 5. 缺頁異常 1. 虛擬儲存的需
作業系統:虛擬頁式儲存管理(缺頁中斷、頁面置換演算法)
1、基本工作原理 1、基本工作原理 在程序開始執行之前,不是全部裝入頁面,而是裝入一個或者零個頁面,之後根據程序執行的需要,動態裝入其他頁面;當記憶體已滿,而又需要裝入 新的頁面時,則根據某種演算法淘
易學筆記-系統分析師考試-第3章 作業系統基本原理/3.3 記憶體管理/3.3.4 虛擬儲存管理
虛擬儲存管理 背景:固定式、分頁式、分段式儲存一個共同的特點是要求的儲存空間必須足夠大裝載入作業的全部資訊,但由於作業在執行過程中,作業中所有的記憶體不是一次全部使用的,甚至有些記憶體塊根本就不是使用,這樣就造成了記憶體資源的極度浪費 虛擬儲存工作過程:當作業載入到記憶體時
易學筆記-系統分析師考試-第3章 作業系統基本原理/3.3 記憶體管理/3.3.3 段頁式管理
分頁式儲存管理 概念:為了避免分割槽式管理產生儲存碎片和管理複雜的問題,分頁式管理把作業的邏輯地址劃分成若干個相等的區域(稱為頁),記憶體空間也劃分成若干個與頁長度相等的區域(也稱為頁幀或塊),然後把頁裝載到頁幀中 特點 頁幀可以是連續的,也可以是不連續的
作業系統 第四章 3 分頁、分段、段頁式儲存管理 +作業題
一、分頁儲存管理方式 1、(物理)塊:記憶體劃分成多個小單元,每個單元K大小 頁面:作業也按K單位大小劃分成片 物理劃分塊的大小 = 邏輯劃分的頁的大小
作業系統課程設計(一):linux核心編譯及新增系統呼叫
1.實驗目的 通過實驗,熟悉Linux作業系統的使用,掌握構建與啟動Linux核心的方法;掌握使用者程式如何利用系統呼叫與作業系統核心實現通訊的方法,加深對系統呼叫機制的理解;進一步掌握如何向作業系統核心增加新的系統呼叫的方法,以擴充套件作業系統的功能。 2.實
作業系統儲存管理之頁式儲存管理深入淺出
用分割槽方式管理的儲存器,每道程式總是要求佔用主存的一個或幾個連續儲存區域,作業或程序的大小仍受到分割槽大小或記憶體可用空間的限制,因此,有時為了接納一個新的作業而往往要移動已在主存的資訊。這不僅不方便,而且開銷不小。採用分頁儲存器既可免去移動資訊的工作,又可儘