用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

LRU页面置换算法模拟

2012-10-13 作者: feng举报

[c++]代码库

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
 
using namespace std;
DWORD  WINAPI Thread1(LPVOID lpPara); //线程1
DWORD  WINAPI Thread2(LPVOID lpPara); //线程2
HANDLE hmove=CreateSemaphore(NULL,1,1,"yw_zh"); //同步信号量
 
int xl[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
int i=0,d=32768;
int zy=0; //记录寄存器需要首位置1的物理块号
 
struct phyblk
{
    unsigned int regit; //存放16位寄存器数值
    int psave; //记录存放的页面
    bool state;
    phyblk(){regit=0;psave=0;state=0;}
};
 
phyblk pb[3]; //3个物理块
 
int main()
{
    DWORD ThreadId1, ThreadId2;
    cout<<"请输入页面访问序列的文件名:3.txt"<<endl
        <<"最近最久未使用页面置换算法(LRU)页面置换序列:";
    HANDLE mthread = CreateThread(NULL,0,Thread1,NULL,0,&ThreadId1);
    if(mthread == NULL)
        return -1;
    HANDLE vthread = CreateThread(NULL,0,Thread2,NULL,0,&ThreadId2);
    if(vthread == NULL)
        return -1;
    system("pause");
}
DWORD  WINAPI Thread1(LPVOID lpPara)
{
    int a=0,b=0,c=0,qy=0;
    while(i<20)
    {
        Sleep(80);
        WaitForSingleObject(hmove,INFINITE);
        for(a=0;a<3;a++)
            if(pb[a].psave==xl[i]&&pb[a].state==1)  //判断页面是否已经在内存中
            {
                zy=a;
                goto outcyc;     //跳出for循环     
            }
        for(a=0;a<3;a++)
        {
            if(pb[a].state==0)   //寻找空物理块
            {
                pb[a].psave=xl[i];
                zy=a;
                pb[a].state=1;
                goto outcyc;
            }
            if(pb[a].regit<d)   //找出寄存器数值最小的物理块的块号
            {
                d=pb[a].regit;
                b=a;
            }
        }
        zy=b;
        cout<<pb[b].psave<<" ";
        pb[b].state=1;
        pb[b].psave=xl[i];
        qy++;      //记录缺页数
        d=32768;
         
        outcyc:
        i++;
             
    }
    cout<<endl<<"总缺页数:"<<qy<<endl;
    return 0;  
}
 
DWORD  WINAPI Thread2(LPVOID lpPara)
{
    int a=0,b=0,c=0;
    while(i<20)
    {
        Sleep(100);
        for(a=0;a<3;a++)
            pb[a].regit>>=1;   //向右移1位
        pb[zy].regit+=32768;   //首位置1
        ReleaseSemaphore(hmove,1,NULL);
    }
}



网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...