虚拟内存

起因

内存不足,通过操作系统访问更大、更快、更便宜的储存空间

需要MMU和操作系统内核共同实现

覆盖技术

手动把常用代码放在内存,不常用的代码放在硬盘

  • 必要部分(常用部分),代码和数据常驻内存
  • 可选部分(不常用功能),程序的其他模块,需要用时才装入内存
  • 不存在调用关系的模块不必同时装入内存,可以相互覆盖,共享同一块空间

利用程序调用逻辑实现

 

(图)

缺点:增加编程复杂度,以执行时间换执行空间

交换技术

自动将暂时不能执行的程序送到外存,注意是整个程序!开销较大

交换后的地址可能不同,需要动态映射

虚拟内存技术

以更小的页粒度导出和导入到内存中,只对进程的部分内容进行交换

程序局部性越好,执行效率越高

  • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都能集中在一个较短的时期内。
  • 空间局部性:当前指令和邻近的指令,当前的数据和临近的数据都集中在一个较小的区域内

 

 

 

虚拟页式内存管理

驻留位:1代表主存中有对应的地址信息,0代表存在外存,此时访问就会产生缺页中断

保护位:可读可写可执行?

修改位:1代表被写过,换入换出的时候需要覆盖硬盘中的数据,0代表内存和外存中的数据一致,可以直接被释放

访问位:1代表最近被访问过,一般会把最近没有访问过的页面置换到外存,操作系统定期清零

 

后备储存 Backing Store

换出到外存的分区如下:

一个虚拟地址空间的页面可以被映射到一个文件中的某个位置

代码段:映射到可执行的二进制文件

动态链接库:映射到动态调用的库文件

其他段:可能被映射到交换文件(swap 分区)

 

虚拟内存性能

 

 

局部页面置换算法

最优页面置换算法

当缺页中断发生时,需要调入新的页面的内存已满,选择内存中的页面进行置换

目标:尽可能减少页面的置换次数

页面锁定,必须常驻操作系统的关键部分/时间关键的应用程序,实现方法:在页表中添加锁定标志位

基本思路:选择未来等待时间最长的页面置换出去。

 

先进先出算法 FIFO

性能不一定好

Belady现象

采用FIFO算法时,分配物理页越多,缺页率反而提高。

原因时FIFO算法没有考虑内存访问的动态特征

 

最近最久未使用算法 LRU

根据过去访问情况推测未来的情况

开销较大,实际使用不合适

实现:

1.链表

头部代表最新使用,尾部代表最久远的使用。

每次访问一个页的时候,如果存在链表中就提到头部,如果不在链表中就插入头部

需要替换的时候,淘汰链表末尾界面。

2.堆栈

顶部代表最新使用,底部代表最久未使用

 

时钟界面置换算法 Clock

根据访问位进行粗略估计,减少LRU中查找并修改数据结构的开销,是对于LRU的近似

把各个页面组织成环形链表(类似于时钟),指针不断扫描链表

当发生一个缺页中断时,考察指针所指向的最古老的界面。如果访问位是0,则立即淘汰,如果访问位是1,则置零后往后移一格,直到找到要被淘汰的页面,然后把指针移到它的下一格。

 

二次机会法

同时利用访问位和修改位,确定数据是否为脏数据,减少对于硬盘的写入

允许脏页在时钟指针扫描第一次时被保留下来

 

最不常用算法 LFU

当发生缺页中断时,选择访问次数最少的界面,并且淘汰之。

相比LUR考察多久未访问,LFU考察的是访问频率

 

全局页面置换算法

 

 

posted on 2022-04-06 12:54  MIXTAPE_208  阅读(48)  评论(0编辑  收藏  举报

导航