技术标签: 算法
此处主要讨论内存-辅存层次的页面置换算法,其是实现虚拟内存的关键之一
进程运行时,如果其访问的页面不在内存中,则需要将其从外存调入
如果调入之前,内存中已经没有空闲的时候,就需要从内存中调出一页程序或数据,送入磁盘的对换区
页面置换算法:选择调出页面的算法
最佳置换算法选择的被淘汰页面
在最长时间内不再被访问的页面(包括以后永不使用的页面),以便保证获得最低的缺页率。
假设长度为n(访问次数)的有序(区分顺序的)访问序列为 L = 0 , 1 , ⋯ , n − 1 L=0,1,\cdots,n-1 L=0,1,⋯,n−1
假设第i次访存 ( i ∈ [ 0 , n − 1 ) ) (i\in[0,n-1)) (i∈[0,n−1))时发现
分配给进程p的s=3个页架中都有内容,且分别记为
设 v = v ( i ) v=v(i) v=v(i)表示第i次想要访问的页面是v
子序列 L ( i ) = i , ⋯ , n − 1 L(i)=i,\cdots,n-1 L(i)=i,⋯,n−1,相当于L的后缀(从第i个元素到最后一个元素)
序列 L v ( i ) = v ( i ) , ⋯ , v ( n − 1 ) Lv(i)=v(i),\cdots,v(n-1) Lv(i)=v(i),⋯,v(n−1),表示L(i)包含的各个访存操作要访问的页面号
记 δ = δ ( i , v j ) = N e x t ( i , v j ) \delta=\delta(i,v_{j})=Next(i,v_{j}) δ=δ(i,vj)=Next(i,vj)表示:进程p第i次要求访存,从要发生页面置换的时刻算起,下一次(最近)再访问到页面 v j v_j vj需要的等待时间(跳数,或间隔数)
在OPT算法中
j ∈ [ 1 , s ] ; j\in[1,s]; j∈[1,s];
v j 是 页 架 中 已 经 存 在 的 页 面 v_j是页架中已经存在的页面 vj是页架中已经存在的页面
δ ( i , v j ) \delta{(i,v_j)} δ(i,vj)的计算,
在实际笔算的过程中,可通过列表(二维)来求解
计算 M = m a x ( δ ( v j ) ) , j ∈ [ 1 , s ] M=max(\delta(v_j)),j\in[1,s] M=max(δ(vj)),j∈[1,s]
具体步骤是,分别计算并统计 δ ( v j ) , j ∈ [ 1 , s ] \delta{(v_j)},j\in[1,s] δ(vj),j∈[1,s],比较出最大的值,作为M
假设 v m v_m vm满足 δ ( v m ) = M \delta{(v_m)}=M δ(vm)=M
被替换的页面就是 v m v_m vm
然而,由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,
因而该算法无法实现。
但可利用该算法去评价其他算法
该算法可以对某一个给定的页面访问序列做模拟替换操作(实际上访问序列是难以确定)
假定页面访问序列为
进程p运行时,先将7,0,1三个页面依次装入内存。
由于最初分配个进程p的3个内存页面全为空,因此第一次访问一定会发生缺页
本例中,头3次访问的页面都是互不相同的,因此前三次都发生缺页
从第4次访存开始,3个页面都已经有内容了,如果发生缺页,就会调用置换算法执行页面置换
本例中,第4次访存将执行页面置换
采用OPT算法,
n次访问的页面序列Lv(i) | Note | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 1 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
b1 | 7 | 7 | 7 | 2 | 2 | 3 | 3 | 3 | 2 | |
b2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
b2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||
v 1 , v 2 , v 3 v_1,v_2,v_3 v1,v2,v3 | 7,0,1 | 2,0,1 | 3,0,1 | |||||||
( δ ( v 1 ) , δ ( v 2 ) , δ ( v 3 ) ) ; (\delta(v_1),\delta(v_2),\delta(v_3)); (δ(v1),δ(v2),δ(v3)); δ ( v j ) , j ∈ [ 1 , s ] {\delta(v_j)},j\in[1,s] δ(vj),j∈[1,s] |
( ∞ \infin ∞,2,5) | ( ∞ , 2 , 3 \infin,2,3 ∞,2,3) | ( ∞ \infin ∞, ∞ \infin ∞, ∞ \infin ∞) | |||||||
$v_m | 使得max(\delta(v_j))$ | 7 | 2 | |||||||
是否缺页 | 1表示缺页 | 1 | 1 | 1 | 1 | 1 | 1 | |||
是否执行OPT算法 | 1表示需要执行 | 1 | 1 | 1 | ||||||
Note | @1 |
当首次扫描中,检查到队列中的最后一个页面时,若其访问位仍为1,则返回到队首去循环检查。
由于该算法是循环地检查各个页面的使用情况,故称CLOCK算法。
但是,因为该算法只有一位访问位,而置换时将未使用过的页面换出,故又称最近未用(NRU)算法。
假设页面访问顺序为7,0,1,2,0,3,0,4,2,3,0,3,2,1,3,2,
将一个页面换出时
可见,对于修改过的页面,替换代价更大。
在改进型CLOCK算法中,除考虑页面使用情况外,还增加了置换代价位,即修改位。
由访问位A和修改位M可以组合成下面四种类型的页面:
内存中的每页必定都是这四类页面之一。
在进行页面置换时,可采用与简单CLOCK算法类似的算法,差别在于该算法要同时检查访问位和修改位。
算法执行过程如下:
1)从指针的当前位置开始,扫描循环队列,
2)若第1)步失败,则进行第二轮扫描,寻找A=0且M=1的2类页面。
3)若第2)步也失败,则将指针返回到开始的位置,并将所有帧的访问位置为0。
改进型CLOCK算法优于简单CLOCK算法的地方在于,可减少磁盘的I/O操作次数。
简单的CLOCK算法只考虑页面是否被访问过;
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法