操作系统的存储管理

内存分配与回收
为什么要进行内存分配与回收?
◆ 确保计算机有足够的内存处理数据
◆ 确保程序可以从可用内存中获取一部分内存使用
◆ 确保程序可以归还使用后的内存以供其他程序使用
 
内存分配的过程
分类
单一连续分配: 单一连续分配是最简单的内存分配方式,只能在单用户、单进程的操作系统中使用
固定分区分配: 固定分区分配是支持多道程序的最简单存储分配方式,内存空间被划分为若干固定大小的区域,每个分区只提供给一个程序使用,互不干扰。
动态分区分配:根据进程实际需要,动态分配内存空间,相关数据结构、分配算法。
动态分区空闲表数据结构:

 

 0表示没有被使用,1表示已经被使用

动态分区空闲链数据结构:

 

 所有空闲节点连接形成链表,2-3连续所以可以看做一个节点,减少空闲节点数目。节点需要记录可以存储的容量

动态分区分配算法:

首次适应算法(FF算法):分配内存从头开始顺序遍历寻找内存区,如果遍历整个链表没有空闲区,则该次分配失败。每次从头部开始,使得头部空间不断被划分,会有碎片出现。
最佳适应算法(BF算法):空闲链表按容量排序,遍历空闲链表找到最佳合适空闲区。遍历时从小到大,匹配到的空闲区一定是最适合的空闲区。
快速适应算法(QF算法):要求有多个链表,每个空闲区链表存储一种容量的空闲区如1、4 2-3,5-6。
 
内存回收的过程

 

 不需要要新建空闲链表节点,把空闲区1的容量增大就行。

将回收区与空闲区1合并,新的空闲区使用回收区的地址。

 

 三个区域合并,使用空闲区1的地址。

 

 为回收区创建新的空闲节点,插入到相应的空闲区链表中。

段页式存储管理

页式存储管理:

页面的概念是相对于逻辑空间的定义,是进程逻辑空间的一块区域。

将进程的逻辑空间等分成若干大小的页面,相应的把物理内存空间分成与页面大小相同的物理块。

以页面为单位,把进程空间装进物理内存中的物理块去。
页面大小应该适中,过大难以分配,过小内存碎片过多,页面大小通常是512B-8K
页表:记录进程逻辑空间和物理空间映射。

 

 多级页表:逻辑空间的页面映射物理空间的字块的页表,对应一个二级页表,这个二级页表反映的是真正的映射关系,如下图所示

按需取表,节省空间。

 

如果有连续的逻辑分布在多个页面中,将大大降低执行效率。

 段式存储管理:

将进程的逻辑空间划分为若干段,这个段是非等分的。

段的长度由连续逻辑长度决定。

保存映射的表是段表,包括段号,基址和段长。

 

 段式存储和页式存储的异同:

相同点:段式存储和页式存储都离散地管理了进程的逻辑空间。

不同点:

页是物理单位,段是逻辑单位
分页是为了合理利用空间,分段是满足用户要求
页大小由硬件固定,段长度可动态变化
页表信息是一维的,段表信息是二维的
 
段页式存储:
先将逻辑空间按段式存储分成若干不等段,再把段内空间等分成若干页。
段号-段内页号-页内地址。

 

 虚拟内存:

如果进程需要内存很大,超过物理内存容量,多道程序设计使得内存更加稀缺。

把进程使用内存划分,将部分暂时不用的内存放在辅存。也就是先放在磁盘。

程序的局部性原理指的是CPU访问存储器的时候,存取指令还是存取数据,所访问的存储单元都趋于聚集在一块较小的区域。

程序运行时,先把部分内存装入主存,如果访问页不存在,则发出缺页中断,发起页面置换。置换后继续运行进程。从用户来看就是虚拟内存。

虚拟内存置换算法:

先进先出算法(FIFO)
最不经常使用算法(LFU)
最近最少使用算法(LRU)
替换策略发生在
Cache-主存层次、主存-辅存层次
Cache-主存层次的替换策略主要是为了解决速度问题
主存-辅存层次主要是为了解决容量问题
 
 

 

 

 

linux存储管理

   Buddy内存管理算法

◆ Buddy算法是经典的内存管理算法
◆ 算法基于计算机处理二进制的优势具有极高的效率
◆ 算法主要是为了解决内存外碎片的问题
 
页内碎片:指的是已经被分配出去的物理内存空间大于请求所需要的内存空间,不能被利用的空间就叫页内碎片。
页外碎片:指的是还没有分配出去的物理内存,由于大小无法分配给申请内存空间的新进程的内存空闲块。
buddy算法内存分配原则:
◆ 向上取整为2的幂大小,比如需要70k内存,那么分配的就是2^7=128k
伙伴算法指的是一片连续内存的伙伴是相邻的大小相同的内存片。
首先 创建一系列空闲块链表,每一种都是2的幂

 

 比如要分配100k内存,向上取2的幂就是128k

例子:

那么假设这一系列链表的最大是1mb,先查询128k有没有空闲块,如果没有就找到256k,再没有找512k,一直找到1mb发现有空闲块了,那么就把这个分配出去,之后拆下512k放在512k的空闲链表,其余的分配出去,之后拆下256k放在256k的空闲链表,其余分配出去.....一直到分配到128k的链表。

回收:

1. 判断刚才分配的内存伙伴在空闲链表上吗?

2. 在!移除伙伴,合并为256k空闲内存,判断
3. 在!移除伙伴,合并为512k空闲内存,判断
4. 在!移除伙伴,合并为1M空闲内存
5. 插入1M空闲链表,回收完成
 
算法基于二进制,拥有极高的处理效率。算法解决了页外碎片的问题,实际上把问题从页外碎片转成了页内碎片问题。
 
linux交换空间
◆ 交换空间(Swap)是磁盘的一个分区
◆ Linux物理内存满时,会把一些内存交换至Swap空间
◆ Swap空间是初始化系统时配置的
swap空间使用作用:
◆ 冷启动内存依赖
◆ 系统睡眠依赖
◆ 大进程空间依赖
swap与虚拟内存的异同
相同点:都是存在于磁盘,工作时和主存发生置换。
不同点:swap是操作系统的概念,虚拟内存是进程概念。swap是为了解决系统物理内存不足问题,虚拟内存是解决进程物理内存不足的问题。
 
 
posted @ 2022-05-05 21:29  wangao96  阅读(260)  评论(0编辑  收藏  举报