【操作系统】虚拟存储管理-页面置换算法

文章目录

  • 一. 实验目的
  • 二. 实验内容
  • 三. 实验步骤
  • 四. 实验结果
  • 五. 实验总结
  • 附:系列文章

一. 实验目的

(1)理解虚拟内存管理的原理和技术;
(2)掌握请求分页存储管理中的页面置换算法;
(3)理解请求分页中的按需调页机制。

二. 实验内容

设计一个虚拟存储区和一个内存工作区,并使用先进先出(FIFO)算法来计算命中率。要求如下:
(1) 通过随机数产生一个指令序列,里面共320条指令;
(2) 将指令序列转换成页面序列。假设:页面大小为1KB,用户内存容量为4~32页,用户虚存容量为32KB。在用户虚存中,按每页存放10条指令排列虚存低值,320条指令将存放在32个页面中。
(3) 计算出置换算法在不同内存容量下的访问命中率。
(4) 访问命中率=1-(页面失效次数/页面访问总数)

三. 实验步骤

(1)编写C程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> 
#define TRUE 1
#define FALSE 0
#define INVALID -1
#define total_instruction 321
#define total_vp 32
//这里是 页表项 的 数组
typedef struct {int pn; //页号int pfn; //内存块号int counter;int time;
} p1_type;p1_type p1[total_vp];//这里是 页表项 的 链表
typedef struct pfc_struct {int pn;int pfn;struct pfc_struct *next;
} pfc_type;pfc_type pfc[total_vp];pfc_type *freepf_head;
pfc_type *busypf_head;
pfc_type *busypf_tail;int diseffect;int a[total_instruction]; //指令流数组
int page[total_instruction]; //每条指令 所属页号
int offset[total_instruction];void initialize();
void FIFO(int total_pf);int main() {int s,i,j;int pid=getpid();printf("pid=%d\n",pid);srand(10*pid);s=(float)319*rand()/32767/32767/2+1;printf("initialize s==%d\n",s);for(i=0; i<total_instruction; i+=4) {if(s<0 || s>319) {printf("When i==%d, Error, s==%d\n",i,s);exit(0);}a[i]=s;a[i+1]=a[i]+1;//a[i+2]=(float)a[i]*rand()/32767/32767/2;a[i+2]=(float)a[i]*rand()/32767/2;//printf("a[%d+2]=%d\n",i,a[i+2]);a[i+3]=a[i+2]+1;//s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;s=(float)(318-a[i+2])*rand()/32767/2+a[i+2]+2;//printf("s==%d\n",s);if((a[i+2]>318) ||(s>319))printf("a[%d+2], a number which is %d and s==%d\n",i,a[i+2],s);}//for(i=0; i<total_instruction; i+=4) {for(j=0; j<4; j++)printf("%d ",a[i+j]);printf("\n");}for(i=0; i<total_instruction; i++) {page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4; i<=32; i++) {printf("%2d page frames",i);FIFO(i);printf("\n");}} //end mainvoid initialize(int total_pf) {int i;diseffect=0;for(i=0; i<total_vp; i++) {p1[i].pn=i;p1[i].pfn=INVALID;p1[i].counter=0;p1[i].time=-1;}for(i=0; i<total_pf-1; i++) {pfc[i].next=&pfc[i+1];pfc[i].pfn=i;}pfc[total_pf-1].next=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0];
}void FIFO(int total_pf) {int i,j;pfc_type *p;initialize(total_pf);busypf_head=busypf_tail=NULL;for(i=0; i<total_instruction; i++) {if(p1[page[i]].pfn==INVALID) {diseffect+=1;if(freepf_head==NULL) {p=busypf_head->next;p1[busypf_head->pn].pfn=INVALID;//释放第一个页面freepf_head=busypf_head;freepf_head->next=NULL;busypf_head=p;}p=freepf_head->next;freepf_head->next=NULL;freepf_head->pn=page[i];p1[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head;else {busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;} else//printf("mingzhong p1[page[%d]].pfn==%d\n",i,p1[page[i]].pfn);;}printf(" FIFO:%6.4f",1-(float)diseffect/320);
}

该程序主要实现了FIFO算法来模拟页面置换过程。

首先,定义了几个常量和结构体,包括页表项和页表项链表的结构。

初始化函数initialize用于初始化页表项和页表项链表,并设置了空闲页面帧和正在使用的页面帧的头节点。

FIFO函数实现了FIFO算法的页面置换过程。该算法的思想是,若所需页面不在内存中,则将内存中的最早进入的页面置换出去,并将所需页面加入内存中。具体实现过程如下:

  1. 初始化页面帧和页面帧链表。
  2. 遍历指令流数组,判断是否所需页面在内存中。
  3. 若所需页面不在内存中,则发生缺页中断,需要进行页面置换。
  4. 若空闲页面帧不为空,则将所需的页面加入内存中。更新页表项的页面帧号,并将该页面帧从空闲页面帧链表中移除,加入正在使用的页面帧链表中。
  5. 若空闲页面帧为空,则选择最早进入的页面帧进行置换。首先释放该页面帧对应的页表项,然后将最早进入的页面帧从正在使用的页面帧链表中移除,加入空闲页面帧链表中,最后将所需的页面加入内存中。更新页表项的页面帧号,并将该页面帧从空闲页面帧链表中移除,加入正在使用的页面帧链表中。
  6. 统计页面缺失次数。
  7. 输出FIFO算法的缺页率。

最后,在main函数中,生成了指令流数组,并通过FIFO函数模拟了不同页面帧数下的页面置换过程,并输出了相应的缺页率。

四. 实验结果

页面置换算法

五. 实验总结

页面置换算法是操作系统中用来解决内存管理问题的一种重要技术。在计算机中,内存是有限的资源,而进程需要占用内存来运行。当内存不足时,操作系统需要进行页面置换,将部分进程从内存中调出,以便为新的进程腾出空间。

页面置换算法的目标是尽可能地提高内存利用率和进程的执行效率。常见的页面置换算法包括最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU)等。

最佳置换算法(OPT)是一种理想的页面置换算法,它假设可以预测未来的访问序列。它会将最久未被使用到的页面替换出去,以便给未来有可能被使用的页面腾出空间。然而,由于无法准确预测未来的访问序列,实际上很难实现最佳置换算法。

先进先出置换算法(FIFO)是一种简单而常用的页面置换算法。它按照进程进入内存的先后顺序进行页面置换。当内存不足时,最先进入内存的页面会被置换出去。然而,先进先出置换算法存在一种缺点,即它无法考虑页面的访问频率和重要性。

最近最久未使用置换算法(LRU)是一种基于页面访问历史的置换算法。它假设过去被访问得最近的页面最有可能在未来被再次访问。因此,最近最久未使用置换算法会选择最久未被访问的页面进行置换。相比于先进先出置换算法,LRU算法更加智能化,能够更好地适应不同的页面访问特征。

除了上述几种页面置换算法外,还有一些其他的算法,如时钟算法、工作集算法等。这些算法都有各自的特点和适用场景。

页面置换算法是操作系统中内存管理的关键技术之一。通过合理地选择和使用页面置换算法,可以提高内存利用率和进程执行效率,从而提升系统的整体性能。

附:系列文章

序号文章目录直达链接
1初识Linuxhttps://want595.blog.csdn.net/article/details/133018477
2进程的控制和通信https://want595.blog.csdn.net/article/details/133900024
3多线程同步与互斥https://want595.blog.csdn.net/article/details/134135476
4处理机调度https://want595.blog.csdn.net/article/details/135327578
5死锁处理-银行家算法https://want595.blog.csdn.net/article/details/135327618
6虚拟存储管理-页面置换算法https://want595.blog.csdn.net/article/details/135327651

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zlib.decompressFile报错 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:方案1方案2此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了zlib.decompressFile报错 的问题。 问题: zlib.decompressFile报错,怎么解…

软件设计模式 --- 类,对象和工厂模式的引入

Q1&#xff1a;什么是软件设计模式&#xff1f; A&#xff1a;软件设计模式&#xff0c;又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上&…

【Java系列】文件操作详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

高精度定位赛道爆发前夜 谁在强势崛起?|高工微报告

伴随着以NOA为代表的高阶智驾功能加速渗透&#xff0c;高精度定位赛道正进入快速增长通道。 整体技术链路上&#xff0c;高精度定位为高阶智驾的刚需&#xff1a;在“重地图、轻感知”阶段&#xff0c;其结合高精地图发挥作用&#xff1b;在“轻地图、重感知”阶段&#xff0c…

Django 学习教程- Django模板(Template)

系列 Django 学习教程-介绍与安装-CSDN博客 Django 学习教程- Hello world入门案例-CSDN博客 前言 在上一章节中我们使用django.http.HttpResponse() 来输出 "Hello World&#xff01;"。该方式将数据与视图混合在一起&#xff0c;不符合 Django 的 MTV 思想。 本…

JavaScript history对象常用方法【通俗易懂】

✨前言✨   本篇文章主要在于了解及使用JavaScript中history对象常用方法 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 文章目录 一&…

技嘉B460M AORUS成功安装Win7

重要说明&#xff1a;本文适合有win7安装经验的读者&#xff0c;安装win7具体步骤没有提及&#xff0c;只说明了技嘉B460M AORUS要安装win7时&#xff0c;需要的额外设置。 1. 背景介绍 2023年组装了一台电脑&#xff0c;机械硬盘&#xff0c;安装了windows 10&#xff0c; 几…

004、变量与可变性

1. 变量与可变性 在Rust中&#xff0c;变量默认是不可变的&#xff0c;这一设计是为了让你安全方便地写出复杂、甚至是并行的代码。 当然&#xff0c;Rust也提供了可使用的可变变量的方法&#xff0c;这个待会讨论。 当一个变量是不可变时&#xff0c;一旦它被绑定到某个值上面…

手机摄影学习

手机摄影学习 基础知识1&#xff0c;成像基本原理2&#xff0c;什么是焦距3&#xff0c;快门&#xff08;简称s&#xff09;4&#xff0c;上面功能之间的相互影响5&#xff0c;焦点6&#xff0c;过爆、欠曝7&#xff0c;cmos&#xff08;感光芯片&#xff09;、测光、聚焦&…

【索引的数据结构】第1章节:B+Tree存储结构

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 BTree 存储结构。 什么是索引 可以简单理解为索引好比一本书的目录&#xff0c;通过目录我们可以快速定位到我们要查看的章节。 MySQL 中的数据同样也是根据索引分类&…

【MATLAB】鲸鱼算法优化混合核极限学习机(WOA-HKELM)时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 鲸鱼算法优化混合核极限学习机&#xff08;WOA-HKELM&#xff09;是一种时序预测算法&#xff0c;它结合了鲸鱼算法和混合核极限学习机&#xff08;HKELM&#xff09;的优点。以下是该算法…

win10连上了wifi热点但是无法上网

我的情况是能正常连接wifi热点&#xff08;手机连接这个热点能上网&#xff0c;说明这个wifi热点是正常的&#xff09; 但是没法上网 打开cmd窗口发现能ping通百度&#xff0c;掘金&#xff0c;csdn这些网址。这就更奇怪了&#xff01;于是根据上面的提示&#xff0c;检查了代…