1. 程式人生 > >作業系統頁面排程問題(這裡只給出了FIFO、LRU、OPT) 純c++陣列模擬 略low

作業系統頁面排程問題(這裡只給出了FIFO、LRU、OPT) 純c++陣列模擬 略low

目前在上實驗課,理論以後在進行補充。以下只放上純模擬的程式碼。

其實模擬還是很好模擬的,三者僅僅只是發生缺頁時排程方法不同,尤其是LRU和OPT兩者程式碼只有一個地方不同,區別之處就在於LRU是向前找,而OPT演算法則是向後找。以下以序列{2,3,2,1,5,2,4,5,3,2,5,2} 12個數為例。想要使用者輸入可以在主函式裡寫個輸入,定義一個全域性的陣列長度即可。系統記憶體的塊則用的陣列b來代表,也可自己設定陣列b的長度,大體同上。

//欒兆威 16171120
#include <bits/stdc++.h>
using namespace std;
int a[]={2,3,2,1,5,2,4,5,3,2,5,2}; //12個
int b[3]={-1,-1,-1};  //只分配了三個塊

void LRU(){
    int cnt = 0,kk = 0;
    memset(b,-1,sizeof(b));
    for(int i=0;i<12;i++){
        if(kk<3){ //前三個頁調入記憶體
            bool flag = false;
            for(int j = 0;j < i ;j++){ //看看記憶體塊中是否已經存在
                    if(a[i]==b[j]){
                        flag = true;
                        break;
                    }
            }
            if(flag==false){
            b[kk] = a[i];
            cnt++;
            kk++;
            }
        }
        else{
            bool flag = false;
            for(int j = 0;j < 3;j++){
                if(a[i]==b[j]){
                        //cout<<"~~~~~~~"<<a[i]<<endl;
                    flag = true;
                    break;
                }
            }
            //造成缺頁
            if(flag == false){
                int tmp = 0;
                bool vis[3];
                memset(vis,false,sizeof(vis));
                for(int j = i;j >=0;j--){//向前找
                    for(int k=0;k<3;k++){
                        if(a[j]==b[k]){
                            vis[k]=true;
                            tmp++;
                            break;
                        }
                    }
                    if(tmp==2)
                        break;
                }
                for(int j = 0;j<3;j++){
                    if(vis[j]==false){
                        cnt++;
                        b[j]=a[i];
                        break;
                    }
                }
            }
        }
        cout<<a[i]<<": [";
        for(int j=0;j<3;j++){
            if(b[j]==-1)
                cout<<"* ";
            else
                cout<<b[j]<<" ";
        }
        cout<<"]"<<endl;
    }
    cout<<"缺頁數為:  "<<cnt<<endl;
}
void OPT(){
   int cnt = 0,kk = 0;
    memset(b,-1,sizeof(b));
    for(int i=0;i<12;i++){
        if(kk<3){
            bool flag = false;
            for(int j = 0;j < i ;j++){
                    if(a[i]==b[j]){
                        flag = true;
                        break;
                    }
            }
            if(flag==false){
            b[kk] = a[i];
            cnt++;
            kk++;
            }
        }
        else{
            bool flag = false;
            for(int j = 0;j < 3;j++){
                if(a[i]==b[j]){
                        //cout<<"~~~~~~~"<<a[i]<<endl;
                    flag = true;
                    break;
                }
            }
            //造成缺頁
            if(flag == false){
                int tmp = 0;
                bool vis[3];
                memset(vis,false,sizeof(vis));
                for(int j = i+1;j <12;j++){//向後找
                    for(int k=0;k<3;k++){
                        if(a[j]==b[k]){
                            vis[k]=true;
                            tmp++;
                            break;
                        }
                    }
                    if(tmp==2)
                        break;
                }
                for(int j = 0;j<3;j++){
                    if(vis[j]==false){
                        cnt++;
                        b[j]=a[i];
                        break;
                    }
                }
            }
        }
        cout<<a[i]<<": [";
        for(int j=0;j<3;j++){
            if(b[j]==-1)
                cout<<"* ";
            else
                cout<<b[j]<<" ";
        }
        cout<<"]"<<endl;
    }
    cout<<"缺頁數為:  "<<cnt<<endl;

}
void FIFO(){
    int cnt = 0,t = 0;
    for(int i = 0;i <12 ;i++){
        bool flag = false;
        for(int j = 0;j < 3;j++){
            if(a[i]==b[j]){
                flag=true;
                break;
            }
        }
        if(flag==false){//缺頁
            cnt++;
            b[t]=a[i];
            t++;
            if(t==3)
                t=0;
        }
        cout<<a[i]<<": [";
        for(int j=0;j<3;j++){
            if(b[j]==-1)
                cout<<"* ";
            else
                cout<<b[j]<<" ";
        }
        cout<<"]"<<endl;
    }
     cout<<"缺頁數為:  "<<cnt<<endl;
}
int main(){
    cout<<"先進先出淘汰演算法:"<<endl;
    cout<<"*********************"<<endl;
    FIFO();
    cout<<"*********************"<<endl;
    cout<<endl;
    cout<<"最近最久未用淘汰演算法:"<<endl;
    cout<<"*********************"<<endl;
    LRU();
    cout<<"*********************"<<endl;
    cout<<endl;
     cout<<"最佳淘汰演算法淘汰演算法:"<<endl;
    cout<<"*********************"<<endl;
    OPT();
    cout<<"*********************"<<endl;
    cout<<endl;

    return 0;
}

相關推薦

作業系統頁面排程問題這裡FIFOLRUOPT c++陣列模擬 low

目前在上實驗課,理論以後在進行補充。以下只放上純模擬的程式碼。 其實模擬還是很好模擬的,三者僅僅只是發生缺頁時排程方法不同,尤其是LRU和OPT兩者程式碼只有一個地方不同,區別之處就在於LRU是向前找,而OPT演算法則是向後找。以下以序列{2,3,2,1,5,2,4,5,3

頁面置換演算法FIFOLRUOPTc模擬

/* * memory.c * * Created on: Jun 9, 2010 * Author: WangYun */ #include<stdio.h> #define PAGE_NUM 20 #define BLOCK 3

頁面排程演算法 FIFOLRUOPT,及C++程式碼

頁面排程演算法 FIFO,LRU,OPT 介紹了三種頁面排程演算法,給出了C++程式碼 1.FIFO 先來先去演算法這個非常好理解,給出分析圖 可以看出,缺頁次數為8次,缺頁中斷率為8/12=66.7%,依次置換的頁面為:1,2,5,3,4 C

作業系統頁面置換演算法之先進先FIFO演算法

import java.util.LinkedList; import java.util.List; public class FIFO {public static void main(String[] args) {int framesize = 5;   //幀數量int[] s = { 1, 2,

布隆過濾器Bloom Filter兩個檔案,分別有100億個字串,我們只要1g的記憶體,如何找到兩個檔案的交集?分別精確演算法和近似演算法?

  給兩個檔案,分別有100億個字串,我們只要1g的記憶體,如何找到兩個檔案的交集?分別給出精確演算法和近似演算法? 精確演算法:   我們可以建立1000個檔案,運用雜湊函式先將檔案1的字串儲存在對應的檔案中,之後再檔案2中取元素,通過雜湊函式計算出雜湊地址

作業系統頁面排程演算法

演算法由python實現 1.先進先出置換演算法     該演算法是置換最早出現在stack裡的頁面,是最簡單的頁面置換演算法,沒有考慮程式的區域性性原理    在這裡設定stack的大小為3,為了模

帶超時時間的telnet該怎麼玩?------檢測tcp是否可連線時經常用到本文僅linux版本,之前部落格也有Windows版本的

        前面說過, 利用ping命令探測網路是否可通, 但很多時候, 服務端或者防火牆禁止了ping命令, 也就是說, ping不通, 不表示網路不通, 所以仍有可能能建立tcp連線。怎麼檢測tcp連線是否可通呢? 用telnet命令就可以搞起, 但問題是, 很多時

谷歌為什麽退出中國?李彥宏一部分真相

tle 2010年 領域 頂級 back 認識 ali 遊戲 .cn 於1月 29 日發行的《時代》周刊中,百度公司創始人兼CEO李彥宏成為封面人物,成為中國互聯網登《時代》的第一人。而專訪中的一段話,卻讓一段往事再次成為了輿論熱議的焦點。專訪中,李彥宏表示,谷歌當年退出中

插入排序----希爾排序-----(本文另一種直接插入排序)

希爾排序原理如下(純手打): 假設有下面一個數組 99, 38, 65, 82, 26, 13, 27, 49, 55, 1 第一趟排序 首先設定一個增量inc,比如說最開始的增量為陣列長度的一半即 arr.length/2 = 5,則上面的陣列可以分成如下幾組(相同顏色的為

在右側我們一個已經基本完成的程式,讀入一個字串,呼叫一個叫str_len的函式來計算這個字串的長度,並輸出。 聰明的你應該已經發現,這個叫str_len的函式並沒有完成

在右側我們給出了一個已經基本完成的程式,讀入了一個字串,呼叫了一個叫str_len的函式來計算這個字串的長度,並輸出。 聰明的你應該已經發現了,這個叫str_len的函式並沒有完成,在不修改函式原型的情況下,請完成str_len函式,實現我們上述的功能吧。 樣例輸入 複製 abc

創客教育如何好玩又好用?這次盛會答案! —2019北京創科教育展

創客教育如何好玩又好用?這次盛會給出了答案! —2019北京創科教育展 3D列印、玩轉機器人、學習創客知識、動手程式設計設計…… 人工智慧和資訊化的驅動,"創客教育"讓學生們的課堂和課餘生活變得更加精彩。 第二十一屆科博會青少兒創客教育展於5月17-20在北京中國國際展覽中心圓滿落幕,現場人氣爆棚

面板元件一般用於彈的登入框或者註冊框

面板元件(一般用於彈出的登入框或者註冊框) <div class="panel panel-default"> <div class="panel-heading">Panel heading without title</div> <

中國品牌在國外過得還好嗎?這份報告答案

  一位美國人在一檔視訊節目中說起一件趣聞:不少在海外市場賣得火爆的中國品牌,早先都被中國人誤認為是“洋貨”。   比如,美國亞馬遜上有一款銷量第一的Anker充電寶,就一直被不少人誤認為是“洋貨”,甚至有一些中國人還將它海淘回國,最後發現是國產品牌,鬧了個大烏龍。   可見,隨著開放的深入

分支界限法 | 裝載問題先入先隊列式分支限界法

typedef 和集 \n n) 分享圖片 type amp nap include 輸入要求 有多組數據。每組數據包含2行。第一行包含2個整數 C(1 <= C <= 1000)、和 n(1 <= n <= 10),分別表示的輪

交叉字串 三個字串:s1s2s3,判斷s3是否由s1和s2交叉構成。

交叉字串給出三個字串:s1、s2、s3,判斷s3是否由s1和s2交叉構成。 您在真實的面試中是否遇到過這個題? Yes 樣例 挑戰 標籤 相關題目 筆記 比如 s1 = "aabcc" s2 =

作業系統——實驗一先來先服務演算法和短作業優先演算法

作業系統實驗報告一[實驗題目]先來先服務FCFS和短作業優先SJF排程演算法[實驗目的]通過本次實驗,加深對程序概念的理解,進一步掌握對程序狀態轉變、程序排程策略及對系統性能的評價方法。[實驗內容]程式設計實現如下內容:1.先來先服務演算法; 2.短程序優先演算法;3.根據排

FIFOLRUOPT頁面排程演算法及例子

網上很多介紹3種頁面置換演算法的例子和過程是不正確的, 本文根據《作業系統概念》第七版對三種演算法做介紹,並給出正確的例子以驗證演算法。 一、FIFO先進先出頁面置換演算法,建立一個FIFO佇列來管

asp.net專案中根據的相對地址獲取網站絕對地址的C#程式碼

這段C#程式碼在ASP.NET的專案中可以根據給定的相對地址獲取絕對訪問地址,例如:給出 /codes/index.aspx 可以返回http://www.sharejs.com/codes/index.aspx的絕對地址結果。 /// <summary>

自定義ExpandableListView下拉重新整理功能簡單實現這裡主要說自定義可下拉的功能

      ExpandableListView 筆記 ExpandableListVivew 是 ListView 的子類,它在普通 ListView 的基礎上進行了擴充套件, 它把應用中的列表項分為幾組,每組裡又可包含多個列表項。 ExpandableListViv

作業系統缺頁中斷FIFOLRUOPT演算法實現對於頁框數量可以由使用者調控

在之前,筆者隨意的用針對固定的三個頁框的情況下寫了一份兒基本程式碼,也就是熟悉一下演算法原理,大家可以忽略。 這一次寫的是實現使用者對於頁框數量實現自由的調控。 注意的是筆者使用的是C/C++的陣列,所以為了避免麻煩,在程式碼開始寫了一個#define max 5,當然對