页面置换算法_Octoberone的博客-程序员宅基地

#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <string.h>
#include <SDKDDKVer.h>
#ifndef _UNISTD_H
#define _UNISTD_H
#include <IO.H>
#include <PROCESS.H>
#endif
#define TRUE 1
#define FALSE 0
#define INVALID -1
#define  total_instruction  320     //指令流长
#define  total_vp  32               //虚页长
#define  clear_period  50           //清周期
typedef struct                      //页面结构
{
 int pn,//页面序号
  pfn,//页面所在内存区的帧号
  counter,//单位时间内访问次数
  time;//上次访问的时间
}pl_type;
pl_type pl[total_vp];               //页面结构数组
struct pfc_struct {                  //页面控制结构
 int pn,//页面号
  pfn;//内存区页面的帧号
 struct pfc_struct *next;//页面指针,用于维护内存缓冲区的链式结构
};
typedef struct pfc_struct pfc_type;  //主存区页面控制结构别名
pfc_type pfc[total_vp], //主存区页面控制结构数组
*freepf_head, //主存区页面控制结构的空闲页面头指针
*busypf_head, //主存区页面控制结构的忙页面头指针
*busypf_tail; //主存区页面控制结构的忙页面尾指针
int diseffect; //页错误计数器,初次把页面载入主存时也当做页错误
int a[total_instruction]; //随即指令流数组
int page[total_instruction]; //指令对应的页面号
int offset[total_instruction]; //指令所在页面中的偏移量
int  initialize(int);//初始化页面结构数组和页面控制结构数组
int  FIFO(int);//先进先出算法
int  LRU(int);//最近最久未使用算法
int main()
{
 int rand(void);
 int s;//随机数
 int i;
 srand(10 * _getpid()); /*每次运行时进程号不同,用来作为初始化随机数队列的"种子"*/
 s = (int)((float)(total_instruction - 1)*(rand() / (RAND_MAX + 1.0)));
 printf("\n------------随机产生指令流------------\n");
 for (i = 0; i<total_instruction; i += 4) //产生指令队列
 {
  a[i] = s; //任选一指令访问点m
  a[i + 1] = a[i] + 1; //顺序执行一条指令
  a[i + 2] = (int)((float)a[i] * (rand() / (RAND_MAX + 1.0))); //执行前地址指令m'
  a[i + 3] = a[i + 2] + 1; //顺序执行一条指令
  printf("%6d%6d%6d%6d\n", a[i], a[i + 1], a[i + 2], a[i + 3]);
  s = (int)((float)((total_instruction - 1) - a[i + 2])*(rand() / (RAND_MAX + 1.0))) + a[i + 2];
 }
 printf("--------------------------------------\n");
 for (i = 0; i<total_instruction; i++) //将指令序列变换成页地址流
 {
  page[i] = a[i] / 10;//页号page=INT[A/L],A:逻辑地址空间中的地址;L:页面的大小
  offset[i] = a[i] % 10;//位移量,即页内地址d=[A] MOD L
 }
 printf("\n--不同页面工作区各种替换策略的命中率表--\n");
 printf("Page\t FIFO\t LRU\t ");
 for (i = 4; i <= 32; i++)   //用户内存工作区从个页面到个页面
 {
  printf("\n %2d \t", i);
  FIFO(i);
  LRU(i);
  printf("\n");
 }
 system("pause");
 return 0;
}

//初始化页面结构数组和页面控制结构数组
//total_pf;  用户进程的内存页面数
int initialize(int total_pf)
{
 int i;
 diseffect = 0;
 for (i = 0; i<total_vp; i++)
 {
  pl[i].pn = i;//页号
  pl[i].pfn = INVALID;          //页面所在内存区的帧号,置页面所在主存区的帧号为-1.表示该页不在主存中
  pl[i].counter = 0;//置页面结构中的访问次数为
  pl[i].time = -1;//置页面结构中的上次访问的时间为-1
 }
 for (i = 0; i<total_pf - 1; i++)
 {
  pfc[i].next = &pfc[i + 1];  //建立pfc[i-1]和pfc[i]之间的链接
  pfc[i].pfn = i;  //初始化主存区页面的帧号
 }
 pfc[total_pf - 1].next = NULL;
 pfc[total_pf - 1].pfn = total_pf - 1;
 freepf_head = &pfc[0];//主存区页面控制结构的空闲页面头指针指向pfc[0]
 return 0;
}
//先进先出算法版本
//int total_pf;       用户进程的内存页面数
int FIFO(int total_pf)
{
 int i;
 int use[total_vp];
 int swap = 0;
 initialize(total_pf);
 pfc_type *pnext, *head;
 pnext = freepf_head;
 head = freepf_head;
 for (i = 0; i<total_vp; i++) { use[i] = 0; }
 diseffect = 0;
 for (i = 0; i<total_instruction; i++)
 {
  if (pl[page[i]].pfn == INVALID)         //页面失效,不在主存中
  {
   diseffect++;
   if (freepf_head == NULL)               //无空闲页面
   {
    while (use[pnext->pfn] == 1)
    {
     use[pnext->pfn] = 0;
     pnext = pnext->next;
     if (pnext == NULL) pnext = head;
    }
    //换出被替换的页
    pl[pnext->pn].pfn = INVALID;
    swap = 1;
   }
   if (use[pnext->pfn] == 0) {  //如果使用位为,则换入相应的页
    pl[page[i]].pfn = pnext->pfn;     //页面结构中要标记帧号
    pnext->pn = page[i];              //页面控制结构中要标记页号
    use[pnext->pfn] = 1;//重置使用位为
    pnext = pnext->next;
    if (pnext == NULL) pnext = head;
    if (swap == 0) { freepf_head = freepf_head->next; }
   }
  }
 }
 printf("%6.3f\t", 1 - (float)diseffect / 320);
 return 0;
}
//最近最久未使用算法
//int total_pf;       用户进程的内存页面数
int LRU(int total_pf)
{
 int MinT;//最小的访问时间,即很久没被访问过
 int MinPn;//拥有最小的访问时间的页的页号
 int i, j;
 int CurrentTime;//系统当前时间
 initialize(total_pf);//初始化页面结构数组和页面控制结构数组
 CurrentTime = 0;
 diseffect = 0;
 for (i = 0; i<total_instruction; i++)
 {
  if (pl[page[i]].pfn == INVALID)             //页面失效
  {
   diseffect++;//页错误次数加
   if (freepf_head == NULL)               //无空闲页面
   {
    MinT = 100000;
    for (j = 0; j<total_vp; j++) {            //找出time的最小值,表明该页很久没被访问过
     if (MinT>pl[j].time&&pl[j].pfn != INVALID)
     {
      MinT = pl[j].time;
      MinPn = j;
     }
    }
    freepf_head = &pfc[pl[MinPn].pfn];   //最久没被访问过的页被释放
    pl[MinPn].pfn = INVALID; //最久没被访问过的页被换出主存
    pl[MinPn].time = -1;//最久没被访问过的页的访问时间置为无效
    freepf_head->next = NULL;
   }
   pl[page[i]].pfn = freepf_head->pfn;      //有空闲页面,把相应的页面换入主存,并把pfn改为相应的帧号
   pl[page[i]].time = CurrentTime;//令访问时间为当前系统时间
   freepf_head = freepf_head->next;        //减少一个空闲页面
  }
  else
   pl[page[i]].time = CurrentTime;        //命中则刷新该单元的访问时间
  CurrentTime++;                           //系统当前时间加
 }
 printf("%6.3f\t", 1 - (float)diseffect / 320);
 return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38855717/article/details/80410960

智能推荐

Win10上的媒体断开连接错误消息(找不到ip地址)_weixin_30768175的博客-程序员宅基地

使用管理员权限打开命令提示符并执行以下命令:ipconfig /all这将列出所有连接的媒体,即以太网和Wifi及其状态。结果全部显示:媒体断开连接如下图:如果是这种情况,我们需要解决互联网问题以及PC上的适配器问题。如果您的适配器都不在列表中,则首先需要解决无线适配器的问题。解决方法:重置WINSOCK和IP堆栈打开具有管理员权限的命令提...

jquery 全选反选 .prop('checked',!$(this).is(':checked'));_weixin_30878361的博客-程序员宅基地

//废话不说直接上代码$("#").click(function(){ $("#content-div label input[type='checkbox']").each(function(){ $(this).prop("checked",!$(this).is(":checked")); }); ...

APP分享h5页面(vue cli)到微信不能正常请求接口的问题_通用属性的博客-程序员宅基地

APP分享h5页面(vue cli)到微信不能正常请求接口的问题当APP中分享h5链接到微信中时,微信会自动拼接一些参数在h5链接的后面,此时可能会影响vue cli写的h5中请求接口的触发成功,以及相关的其他功能操作;我的处理方法逻辑比较简单,就是判断地址是否被添加了微信的参数,然后获取url取其中自己需要的,在给到location.replace();微信自动拼接的通常为朋友圈 &amp;...

iPhone8开售:苹果店排队围栏无用武之地_weixin_33859504的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

技术之美[程序人生]大学三年软件工程专业学习感受_高校让学生感受程序之美的句子_终点的博客-程序员宅基地

转眼间,三年过去了,再过2个月就要迎来大学最后的一年。回想一下这3年的学习,总结一点,就是走了很多弯路,好在现在已经认识到了。为什么会走弯路呢?因为自己对某些知识存在很多错误的认识,比如说当年认为C语言不怎么重要,结果就没怎么好好学。以致于现在疯狂的往回补。弯路走的多了,自然就有经验了。在我看来,优秀的程序员=扎实的计算机基础知识+良好的数据结构和算法思想+自己最擅长的技术。很多同学,一直热衷于疯

OSChina 周一乱弹 ——发现了老公养的田螺姑娘_weixin_34217711的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

随便推点

springboot(十六):使用Jenkins部署Spring Boot_weixin_34381666的博客-程序员宅基地

jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boot项目jenkins搭建 部署分为三个步骤;第一步,jenkins安装第二步,插件安装和配置第三步,Push SSH第四步,部署项目第一步 ,jenkins安装准备环境:JDK:1.8Jenkins:2.83Centos:7.3...

panda3d学习 (9):使用C++编译_c++调用panda_立花道雪0509的博客-程序员宅基地

今天开始用C++来使用panda3d,本来以为只是改一种语言应该没有太大问题,结果发现还是有挺多坑的。。编译器用的是VS2017,也是panda3d手册上所推荐的。但是第一个设置就是从debug必须改成release模式,不然程序就会莫名其妙崩溃。这个是真的坑,本来就不太熟悉VS的调试,现在还连debug都用不了了。Include DirectoriesC:\Panda3D-1.9.4\inclu...

路径规划A*算法_asasasaababab的博客-程序员宅基地

A*算法是在Dijkstra算法上进行改进,毕竟,我们是知道终点和起点的位置信息的,Dijkstra算法完全是四面八方全都找,然而我们既然已经知道,比方说重点在起点的北方,那么完全可以直接往北方搜索。所以算法综合了Best-First Search和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数)。在此算法中,如果以g(n)表示从起点到任意顶点

在VS2008中配置WDK7600驱动开发环境_vs2008 ddk7600_汪宁宇的博客-程序员宅基地

网上这类资料多如牛毛,也许很多人都是转来转去,却很有人去真正的测试,有时候感觉确实对他人也是一种误导。 这里是我自己在VS2008 + WDK7600.16385.0 + DDKWizard配置自己的IDE开发环境的设置过程: 1、首先安装DDKWizard 官方网页:http://ddkwizard.assarbad.net/ 从官方网页下载这三个

Spring Data Jpa简化Jpa开发_lzdujing1的博客-程序员宅基地

本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例;接着重构该示例,并引入 Spring 框架,这两部分不会涉及过多的篇幅,如果希望能够深入学习 Spring 和 JPA,可以根据本文最后提供的参考资料进一步学习。自 JPA 伴随 Java EE 5 发布以来,受到了

Eurake和Zookeeper的区别_念兰的博客-程序员宅基地

拉取方式zookeeper通知消费者来拿Eurake是定时去拿集群方式zookeeper分主从eureka没有主从之分设计角度不同capc 一致性 a 可用性 p 分区容错区 如果zookeeper的主集群挂掉之后那么整个zookeeper的集群就无法对外提供服务,大多数情况可以容忍一段时间的脏数据但是不能接收整个注册中心无法对外提供服务。所以在设计时zookeeper强调cp(c在官网的解释是一致性,底层有一个queu...

推荐文章

热门文章

相关标签