山东大学操作系统实验七

vmrp.h

/*
 *  Filename        : vmrp.h
 *  copyright       : (C) 2006 by zhonghonglie
 *  Function        : 澹版槑铏氭嫙鍐呭瓨椤电疆鎹㈢被
 */

#ifndef VMRP_H
#define VMRP_H

#include <iostream>
#include <iomanip>
#include <malloc.h>

using namespace std;

class Replace {
public:
    Replace();
    ~Replace();
    
    void InitSpace(char *MethodName);  // 鍒濆鍖栭〉鍙疯褰?
    void Report(void);                 // 鎶ュ憡绠楁硶鎵ц鎯呭喌
    void Fifo(void);                   // 鍏堣繘鍏堝嚭绠楁硶
    void Lru(void);                    // 鏈€杩戞渶鏃ф湭鐢ㄧ畻娉?
    void Clock(void);                  // 鏃堕挓(浜屾鏈轰細)缃崲绠楁硶
    void Eclock(void);                 // 澧炲己浜屾鏈轰細缃崲绠楁硶
    void Lfu(void);                    // 鏈€涓嶇粡甯镐娇鐢ㄧ疆鎹㈢畻娉?
    void Mfu(void);                    // 鏈€缁忓父浣跨敤缃崲绠楁硶
void GenerateRandomRef(int size, int max_page); // 鏂板闅忔満鐢熸垚鏂规硶
private:
    int *ReferencePage;   // 瀛樻斁瑕佽闂埌鐨勯〉鍙?
    int *EliminatePage;   // 瀛樻斁娣樻卑椤靛彿
    int *PageFrames;      // 瀛樻斁褰撳墠姝e湪瀹炲瓨涓殑椤靛彿
    int *Referencebit;    // 寮曠敤浣嶆暟缁?
    int *Modifybit;       // 淇敼浣嶆暟缁?
    int *count;           // 浣跨敤璁℃暟鏁扮粍
    int maxPage; // 鏂板鏈€澶ч〉鍙锋垚鍛?
    int PageNumber;       // 璁块棶椤垫暟
    int FrameNumber;      // 瀹炲瓨甯ф暟
    int FaultNumber;      // 澶辫触椤垫暟(缂洪〉鏁?
};

#endif // VMRP_H

prac7.h

#include "vmrp.h"
#include <cstdlib>
#include <ctime>

Replace::Replace() {
    int i;
    srand(time(NULL)); 
    
    cout << "Please input page numbers (0 for random): ";
    cin >> PageNumber;
    
    if(PageNumber == 0) {
        cout << "Input max page number: ";
        cin >> maxPage;
        cout << "Input page frames: ";
        cin >> FrameNumber;
        
        PageNumber = 10 + rand() % 11;
        GenerateRandomRef(PageNumber, maxPage);
    } else {
        ReferencePage = new int[sizeof(int) * PageNumber];
        EliminatePage = new int[sizeof(int) * PageNumber];
        
        cout << "Please input reference page string: ";
        for(i = 0; i < PageNumber; i++)
            cin >> ReferencePage[i];
            
        cout << "Please input page frames: ";
        cin >> FrameNumber;
    }
    
    PageFrames = new int[sizeof(int) * FrameNumber];
    Referencebit = new int[sizeof(int) * FrameNumber];
    count = new int[sizeof(int) * FrameNumber];
    Modifybit = new int[sizeof(int) * FrameNumber];
}

Replace::~Replace()
{
    delete[] ReferencePage;
    delete[] EliminatePage;
    delete[] PageFrames;
    delete[] Referencebit;
    delete[] count;
    delete[] Modifybit;
}
//随机生成 
void Replace::GenerateRandomRef(int size, int max_page) {
    PageNumber = size;
    maxPage = max_page;
    ReferencePage = new int[sizeof(int) * PageNumber];
    EliminatePage = new int[sizeof(int) * PageNumber];
    
    cout << "Generated reference string: ";
    for(int i = 0; i < PageNumber; i++) {
        ReferencePage[i] = 1 + rand() % max_page;
        cout << ReferencePage[i] << " ";
    }
    cout << endl;
}
void Replace::InitSpace(char * MethodName)
{
    int i;
    cout << endl << MethodName << endl;
    FaultNumber=0;

    for (i = 0; i < PageNumber; i++)
        EliminatePage[i] = -1;
    for(i = 0; i < FrameNumber; i++)
    {
        PageFrames[i] = -1;
        Referencebit[i]=0;
        count[i]=0;
        Modifybit[i]=0;
    }
}

void Replace::Report(void)
{
    //鎶ュ憡娣樻卑椤甸『搴?
    cout << endl << "Eliminate page:";
    for(int i=0; EliminatePage[i]!=-1; i++) 
        cout << EliminatePage[i] << " ";
    //鎶ュ憡缂洪〉鏁板拰缂洪〉鐜?
    cout << endl << "Number of page faults = " << FaultNumber << endl;
    cout << setw(6) << setprecision(3);
    cout << "Rate of page faults = " << 100*(float)FaultNumber/(float)PageNumber << "%"<<endl;
}

void Replace::Lru(void)
{
    int i,j,k,l,next;
    InitSpace("LRU");
    //寰幆瑁呭叆寮曠敤椤?
    for(k=0,l=0; k < PageNumber; k++)
    {
        next=ReferencePage[k];
        //妫€娴嬪紩鐢ㄩ〉褰撳墠鏄惁宸插湪瀹炲瓨
        for (i=0; i<FrameNumber; i++)
        {
            if(next == PageFrames[i])
            {
                //寮曠敤椤靛凡鍦ㄥ疄瀛樺皢鍏惰皟鏁村埌椤佃褰曟爤椤?
                next= PageFrames[i];
                for(j=i; j>0; j--) 
                    PageFrames[j] = PageFrames[j-1];
                PageFrames[0]=next;
                break;
            }
        }
        if(PageFrames[0] == next)
        {
            //濡傛灉寮曠敤椤靛凡鏀炬爤椤讹紝鍒欎负涓嶇己椤?
            for(j=0; j<FrameNumber; j++)
                if(PageFrames[j]>=0) 
                    cout << PageFrames[j] << " ";
            cout << endl;
            continue;
        }
        else
            FaultNumber++;
        //鏍堝簳椤靛彿璁板叆娣樻卑椤垫暟缁勪腑
        EliminatePage[l] = PageFrames[FrameNumber-1];
        //鍚戜笅鍘嬫爤
        for(j=FrameNumber-1; j>0; j--) 
            PageFrames[j]= PageFrames[j-1];
        PageFrames[0]=next;
        //鎶ュ憡褰撳墠瀹炲瓨涓〉鍙?
        for(j=0; j<FrameNumber; j++)
            if(PageFrames[j]>=0) 
                cout << PageFrames[j] << " ";
        //鎶ュ憡褰撳墠娣樻卑鐨勯〉鍙?
        if(EliminatePage[l]>=0)
            cout << "->" << EliminatePage[l++] << endl;
        else
            cout << endl;
    }
    Report();
}

void Replace::Fifo(void)
{
    int i,j,k,l,next;
    InitSpace("FIFO");
    //寰幆瑁呭叆寮曠敤椤?
    for(k=0,j=l=0; k < PageNumber; k++)
    {
        next=ReferencePage[k];
        //濡傛灉寮曠敤椤靛凡鍦ㄥ疄瀛樹腑
        for (i=0; i<FrameNumber; i++) 
            if(next==PageFrames[i]) 
                break;
        if (i<FrameNumber)
        {
            for(i=0; i<FrameNumber; i++) 
                cout << PageFrames[i] << " ";
            cout << endl;
            continue;
        }
        FaultNumber++;
        EliminatePage[l]= PageFrames[j];
        PageFrames[j]=next;
        j = (j+1)%FrameNumber;
        //鎶ュ憡褰撳墠瀹炲瓨椤靛彿鍜屾窐姹伴〉鍙?
        for(i=0; i<FrameNumber; i++)
            if(PageFrames[i]>=0) 
                cout << PageFrames[i] << " ";
        if(EliminatePage[l]>=0)
            cout << "->" << EliminatePage[l++] << endl;
        else
            cout << endl;
    }
    Report();
}

void Replace::Clock(void)
{
    int i,k,l,next;
    InitSpace("Clock");
    int pointer = 0;
    
    for(k=0,l=0; k < PageNumber; k++)
    {
        next=ReferencePage[k];
        //妫€娴嬪紩鐢ㄩ〉褰撳墠鏄惁宸插湪瀹炲瓨
        for (i=0; i<FrameNumber; i++)
            if(next==PageFrames[i])
            {
                Referencebit[i]=1;
                break;
            }
        if (i<FrameNumber)
        {
            for(i=0; i<FrameNumber; i++) 
                cout << PageFrames[i] << " ";
            cout << endl;
            continue;
        }
        
        FaultNumber++;
        //瀵绘壘鍙浛鎹㈢殑椤甸潰
        while(Referencebit[pointer] == 1) {
            Referencebit[pointer] = 0;
            pointer = (pointer + 1) % FrameNumber;
        }
        
        EliminatePage[l]=PageFrames[pointer];
        PageFrames[pointer]=next;
        Referencebit[pointer]=1;
        
        for(i=0; i<FrameNumber; i++)
            if(PageFrames[i]>=0) 
                cout << PageFrames[i] << " ";
        if(EliminatePage[l]>=0)
            cout << "->" << EliminatePage[l++] << endl;
        else
            cout << endl;
            
        pointer = (pointer + 1) % FrameNumber;
    }
    Report();
}

void Replace::Eclock(void)
{
    int i,k,l,next;
    InitSpace("EClock");
    int pointer = 0;
    
    for(k=0,l=0; k < PageNumber; k++)
    {
        next=ReferencePage[k];
        //妫€娴嬪紩鐢ㄩ〉褰撳墠鏄惁宸插湪瀹炲瓨
        for (i=0; i<FrameNumber; i++)
            if(next==PageFrames[i])
            {
                Referencebit[i]=1;
                // 50%姒傜巼璁剧疆淇敼浣?
                if(rand() % 2) Modifybit[i] = 1;
                break;
            }
        if (i<FrameNumber)
        {
            for(i=0; i<FrameNumber; i++) 
                cout << PageFrames[i] << " ";
            cout << endl;
            continue;
        }
        
        FaultNumber++;
        // 瀵绘壘鍙浛鎹㈢殑椤甸潰 (鎸夌収(0,0),(0,1),(1,0),(1,1)鐨勯『搴?
        int found = 0;
        for(int pass = 0; pass < 2 && !found; pass++) {
            for(i = 0; i < FrameNumber && !found; i++) {
                int idx = (pointer + i) % FrameNumber;
                if(Referencebit[idx] == pass && Modifybit[idx] == 0) {
                    pointer = idx;
                    found = 1;
                    break;
                }
            }
            
            if(!found) {
                for(i = 0; i < FrameNumber && !found; i++) {
                    int idx = (pointer + i) % FrameNumber;
                    if(Referencebit[idx] == pass) {
                        pointer = idx;
                        found = 1;
                        break;
                    }
                }
            }
        }
        
        EliminatePage[l]=PageFrames[pointer];
        PageFrames[pointer]=next;
        Referencebit[pointer]=1;
        Modifybit[pointer]=0;
        
        for(i=0; i<FrameNumber; i++)
            if(PageFrames[i]>=0) 
                cout << PageFrames[i] << " ";
        if(EliminatePage[l]>=0)
            cout << "->" << EliminatePage[l++] << endl;
        else
            cout << endl;
            
        pointer = (pointer + 1) % FrameNumber;
    }
    Report();
}

void Replace::Lfu(void)
{
    int i,k,l,next;
    InitSpace("Lfu");
    
    for(k=0,l=0; k < PageNumber; k++)
    {
        next=ReferencePage[k];
        for (i=0; i<FrameNumber; i++)
            if(next==PageFrames[i])
            {
                count[i]++;
                break;
            }
        if (i<FrameNumber)
        {
            for(i=0; i<FrameNumber; i++) 
                cout << PageFrames[i] << " ";
            cout << endl;
            continue;
        }
        FaultNumber++;
        int min=count[0];
        int index=0;
        for(i=1; i<FrameNumber; i++)
        {
            if(count[i]<min)
            {
                min=count[i];
                index=i;
            }
        }
        EliminatePage[l]= PageFrames[index];
        PageFrames[index]=next;
        count[index]=1;
        for(i=0; i<FrameNumber; i++)
            if(PageFrames[i]>=0) 
                cout << PageFrames[i] << " ";
        if(EliminatePage[l]>=0)
            cout << "->" << EliminatePage[l++] << endl;
        else
            cout << endl;
    }
    Report();
}

void Replace::Mfu(void)
{
    int i,k,l,next;
    InitSpace("Mfu");
    for(i=0; i<FrameNumber; i++)
        count[i]=1;
        
    for(k=0,l=0; k < PageNumber; k++)
    {
        next=ReferencePage[k];
        for (i=0; i<FrameNumber; i++)
            if(next==PageFrames[i])
            {
                count[i]++;
                break;
            }
        if (i<FrameNumber)
        {
            for(i=0; i<FrameNumber; i++) 
                cout << PageFrames[i] << " ";
            cout << endl;
            continue;
        }
        FaultNumber++;
        int max=count[0];
        int index=0;
        for(i=1; i<FrameNumber; i++)
        {
            if(count[i]>max)
            {
                max=count[i];
                index=i;
            }
        }
        EliminatePage[l]= PageFrames[index];
        PageFrames[index]=next;
        count[index]=0;
        for(i=0; i<FrameNumber; i++)
            if(PageFrames[i]>=0) 
                cout << PageFrames[i] << " ";
        if(EliminatePage[l]>=0)
            cout << "->" << EliminatePage[l++] << endl;
        else
            cout << endl;
    }
    Report();
}

int main(int argc,char *argv[])
{
    Replace * vmpr = new Replace();
    vmpr->Lru();
    vmpr->Fifo();
    vmpr->Clock();
    vmpr->Eclock();
    vmpr->Lfu();
    vmpr->Mfu();
    delete vmpr;
    return 0;
}

Makefile

CXX = g++
CXXFLAGS = -Wall -g -std=c++11

HEADER = vmrp.h
SRC = prac7.c
OBJ = prac7.o
TARGET = prac7

all: $(TARGET)

$(TARGET): $(OBJ)
	$(CXX) $(CXXFLAGS) -o $@ $^

$(OBJ): $(SRC) $(HEADER)
	$(CXX) $(CXXFLAGS) -c $<

clean:
	rm -f $(OBJ) $(TARGET)

.PHONY: all clean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值