操作系统课程链接:https://www.bilibili.com/video/BV1a54y1D7R8?p=10
一 内存分配与回收
随着计算机和程序越来越复杂,使得存储成为必要。
存储管理解决的问题:
1. 确保计算机有足够的内存处理数据
2. 确保程序可以从可用内存中获取一部分内存使用
3. 确保程序可以归还使用后的内存以供其他程序使用
内存分配的过程
1. 单一连续分配是最简单的内存分配方式,只能在单用户,单进程的操作系统中使用。
2. 固定分区分配是支持多道程序的最简单分配方式
将内存空间分为固定大小的区域,每个区域只分给一个程序使用,互不干扰。
3. 动态分区分配
根据进程需要,动态分配内存空间。涉及到相关数据结构,分配算法。
动态分区空闲表数据结构
0表示还没有被使用,1表示已经被使用
动态分区空闲链数据结构
使用双向链表来保存内存中的空闲区域
将空闲节点首尾相连
节点记录可存储的容量
动态分区分配算法
1. 首次适应算法(FF算法)
每次分配算法从头部开始,使得头部地址空间不断被划分。
改进:循环适应算法,每次开始是从上次结束的位置开始分配。
2. 最佳适应算法(BF算法)
该算法可以避免一些大材小用的情况。
3. 快速适应算法(QF算法)
内存回收的过程
内存回收的情况:
第一种情况:
第二种情况:
第三种情况:
第四种情况:
为回收区创建新的空闲节点,将节点插入到相应的空闲区链表中
二 段页式存储管理
从进程角度理解进程的存储管理
操作系统如何管理进程的空间?
三个方面:
页式存储管理
页面:相对于逻辑空间的定义
内存碎片:
有空闲列表如上,现有页面大小比节点1大,比节点2-3小,会产生如下结果:
所以页面大小应该适中,过大难以分配,过小内存碎片过多
页面大小通常是以512B~8K大小
通过页面我们可以将进程逻辑的页面·放入到对应的物理块中但是我们不知道进程页面分配的具体情况,
所以在这里我们需要一个索引,也就是页表。
页表是记录进程逻辑空间与物理空间的映射。
为了减少这种情况,所以产生了多级页表的概念。
可以按需取页表,节省内存空间。在运行的时候,只需要将根页表加入到内存空间,如果说我们调用哪一个字块,这个耳机页表不在的话,我们临时加载,所以节省空间。
但是页式会有的问题:有一段连续的逻辑分散在多个页面中,会大大降低执行效率。
段式存储管理
同样也有段号和段内偏移。
二者比较:
段页式存储管理
分页可以有效提高内存利用率,虽然存在内存碎片。
分段可以更好满足用户需求。
所以两者结合形成段页式存储管理
三 虚拟内存
虚拟内存概述
程序局部性原理
局部性原理是指CPU访问存储器时,无论存取指令还是存取数据,所访问的存储单元都趋向于聚集在一个较小的连续区域中。
所以:
虚拟内存实际是对物理内存的一个补充,速度接近于内存,成本接近于辅存。
虚拟内存的置换算法
1. 先进先出算法(FIFO)
2. 最不经常使用算法(LFU)
3. 最近最少使用算法(LRU)
页面置换算法链接:http://blog.sina.com.cn/s/blog_631d3a630101mhup.html
感觉这里讲清楚了。
计算机组成原理高速缓存置换。
箭头先向右,再向左。
箭头先向右,再向左。
两种替换的比较:
四 Linux的内存分配
Buddy内存管理算法的思想就是,努力让内存分配与相邻内存合并能快速进行。
Buddy内存分配原则
(1) 向上取整为2的幂大小
(2) 伙伴系统,伙伴是指内存的伙伴,一片连续内存的伙伴是相邻的另一片大小一样的连续内存
算法具体流程:
1.
回收内存的过程:
该算法是基于计算机处理二进制的优势,有极高的效率
该算法的目的是为了解决内存外碎片的问题
该算法将内存外碎片问题转移为内存内碎片问题
Linux交换空间:
交换空间是冷启动的依赖
系统睡眠依赖
大进程空间依赖