虚拟内存
起因
内存不足,通过操作系统访问更大、更快、更便宜的储存空间
需要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) 编辑 收藏 举报