操作系统内存管理

内存管理


内存基础知识

存放数据的硬件,程序执行前需要将数据放到内存里才能被CPU处理
逻辑地址-物理地址

进程运行基本原理

从代码到进程需要经过编译,链接,装入内存

链接方式

  1. 静态:链接成完整模块
  2. 装入时动态:运行前边装入边链接
  3. 运行时动态:只有需要的模块才需要装入链接

装入方式

  1. 绝对装入:编译时产生绝对地址
  2. 可重定位装入:装入时将逻辑地址改成物理地址
  3. 动态运行时装入:运行时将逻辑地址改成物理地址

内存管理概念

操作系统对内存管理需要实现的功能:

  1. 内存空间的分配与回收
  1. 连续分配:
    1. 单一连续分配:内存划分为系统区和用户区,并且只允许存放一道用户程序。实现简单,无外部碎片,有内部碎片,CPU利用率低
    2. 固定分区分配:内存的用户区划分为多个区域,大小可以相等可以不相等。(分区大小相等)缺乏灵活性,适合一台计算机控制多个对象的场合。(分区大小不相等)灵活性较高。需建立分区说明表,记录分区的地址、状态等。实现简单,无外部碎片,但又内部碎片,CPU利用率低,并且程序太大的时候不能满足需求
    3. 动态分区分配:装入内存时根据大小分配空间。需建立分区说明表,状态,分区大小,起始地址等都需要被记录。没有内部碎片,有外部碎片
    没想到这里好像还要加很多的内容,分区算法啥的写后面算了,goto动态分区分配算法
  2. 非连续分配 也放到后面了
  1. 提供某种技术从逻辑上对内存空间进行扩充
  1. 覆盖技术:将程序分为多个段,常用的段常驻内存,不常用的需要时再调入内存。在内存中设置固定区和覆盖区,固定区存放常驻的段。对用户不透明,增加编程负担
  2. 交换技术:将某些进程暂停换出外存,把外存中某些具备运行条件的进程调入内存(PCB常驻内存)
  3. 虚拟存储技术
  1. 实现逻辑地址到绝对地址的转换
  2. 内存保护

上下限寄存器,重定位寄存器和界地址寄存器

动态分区分配算法

  1. 首次适应算法
    每次从低地址开始查找,找到第一个满足大小的空闲分区
  2. 最佳适应算法
    优先选取大小最适合的区间。空间分区按照容量递增次序链接,每次从头查找,找第一个满足的分区。会导致留下越来越多很小的难以利用的内存块。
  3. 最坏适应算法
    优先使用最大的空闲分区
  4. 临近适应算法
    把地址按照递增的顺序排序,每次从上次查找结束的位置开始查找,找到的第一个可用分区就可。

非连续分配

分页存储管理(跟计组撞了)

基本地址变换机构

借助进程的页表将逻辑地址转化为物理地址。通常会设置页表寄存器,存放页表在内存中的起始地址和页表长度。当进程未执行时,页表开始地址和长度都存放在PCB中。
为了查询方便,一般使每个页面恰好装得下整个页表项

具有快表的地址变换机构

局部性原理

时间局部性:如果执行了某指令,该指令不久后很可能再次执行;如果访问了一个数据,该数据不久后很可能再次被访问
空间局部性:一旦程序访问了某储存单元,在不久之后其附近的储存单元也很可能被访问

快表TLB

快表/联想寄存器,是一种访问速度比内存块很多的高速缓冲寄存器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表也称慢表

两级页表

单级页表的问题:

  1. 页表必须连续存放,当页表很大的时候需要占用很多连续的内存框
  2. 没必要让整个页表常驻内存
原理和地址结构

将地址划分成三个部分,分别对应一级页号,二级页号,页内偏移量。用一个总表去记录二级页号的位置,搜索时从一级找到二级,再经过二级找到页内偏移量,这样二级页号就不需要连续存放。

一些细节
  1. 各级页表的大小不能超过一个页面
  2. 不止二级页表,可以三级四级一直套娃下去
  3. n级页表访问次数为n+1

基本分段储存管理

分段

按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址。以段为单位进行分配内存,每个段在内存中占连续空间,各个段可以不相邻。

段表

类似页表,作用一样
一行有三个数据:段号,段长,基址
各个段表项的长度是相同的

分段和分页的对比

  1. 分页对用户不可见,分段对用户可见
  2. 分页的地址空间是一维的,分段的地址空间是二维的
  3. 分段更容易实现信息的共享和保护
  4. 分页和分段访问一个逻辑地址都需要两次访存,分段也可以引入快表机制

段页式管理方式

定义

将进程按逻辑模块划分,再将各分段进行分页,再将内存空间分为大小相同的内存块。进程运行前将各页面分别装入各内存块中。

地址结构

段号+页号+页内偏移量
把程序分段可见,把段分页不可见

段表和页表

段表是总表,包含段号、页表长度、页表存放块号,指向页表。页表包含页号和内存块号,指向内存中的数据的地址。

虚拟内存

定义和特征

基于局部性原理,在程序装入内存时,可以将程序中很快用到的部分装入内存,暂时用不到的部分留在外存。在程序执行过程中,当所访问的信息不再内存中时,由操作系统将所需信息从外存调入内存。若内存空间不够,由操作系统将内存中暂时用不到的信息换到外存
特征:

  1. 多次性:不需要一次装入内存
  2. 对换性:无需常驻内存
  3. 虚拟性:大于实际容量

请求分页管理方式

页表机制

页表结构:页号,内存块号,状态位,访问字段,修改位,外存地址
状态位记录是否已经调入内存
访问字段记录最近被访问次数或者上一次被访问的时间,用于置换算法
修改位记录是否被修改过

缺页中断机构

当要访问的页面不存在与内存中时,发送缺页中断,操作系统挂起当前进程,然后去外存里面找缺少的页面。如果内存中有空位,直接把要的页面放入内存,如果没有的话就用淘汰算法淘汰一个页面再写入。
缺页中断属于内中断

地址变换机构

检查页面是否在内存中,如果不在就请求调页,若内存空间不够,换出页面,页面调入内存后修改相应的页表项

页面置换算法

  1. 最佳置换算法OPT
    淘汰以后永远不会使用或最长时间内不在被访问的页面
    无法实现,不知道之后的运行序列
  2. 先进先出置换算法FIFO
    淘汰最早进入的页面
    belady异常:当为进程分配的物理块数增大时,缺页次数不减反增。只有FIFO会造成belady异常
  3. 最近最久未使用置换算法LRU
    淘汰最久未使用的页面。记录页面上一次访问时间就行
  4. 时钟置换算法CLOCK
    每个页面设置一个访问位,将内存中的页面通过指针连成一个环。页面被访问时访问位设置为1。当需要淘汰页面时,按照指针顺序遍历,遇到访问位为1的就设置为0,是0就换出
  5. 改进时钟置换算法
    设置访问位修改位,先找访问位修改位全为0的淘汰,该轮不会修改数据。如果寻找失败,第二轮扫描寻找01的页面,如果都没有,把访问位设置为0。然后再找00,失败再找01

页面分配策略

一些名词定义

驻留集:请求分页存储管理中给进程分配的物理块的集合
固定分配:驻留集不变
可变分配:驻留集可变
局部置换:只能置换本进程的物理块
全局置换:可以置换任何物理块

几种组合策略

固定分配全局置换
可变分配全局置换
可变分配局部置换

调入页面策略
  1. 预调页策略
    根据局部性原理一次调入若干页面
    预测成功率不高,应用于首次调入,程序员指定调入某些部分
  2. 请求调页策略
    缺的时候再调入,I/O开销大
抖动现象

进程分配的物理块不够

### 缺率与面置换算法的关系 在虚拟存储管理中,当进程访问不在内存中的面时会发生缺中断。缺率是指单位时间内发生的缺次数占总访存次数的比例[^1]。 不同的面置换算法直接影响到缺率的高低。例如: - **FIFO (先进先出)** 面置换算法可能会导致 Belady 异常现象,即增加分配给程序的物理面数反而使缺率上升。 - **LRU (最近最少使用)** 置换策略通常能更好地预测未来使用的面情况,从而降低缺频率。 - **OPT (最佳替换)** 虽然是理论上的理想模型,在实际应用不可实现,但提供了最优解作为评估其他算法的标准[^2]。 ### 计算方法 #### 缺率计算公式 \[ \text{缺率} = \frac{\text{缺次数}}{\text{总的访问次数}} \] 对于一个具体的例子来说,如果某段时间内发生了 10 次缺而总共进行了 100 次面请求,则该时间段内的缺率为 10%。 #### 面置换率定义及其影响因素 面置换率指的是每秒钟发生多少次面被移入或移出的情况。这不仅取决于所采用的具体面调度机制,还受到工作集大小变化的影响——当应用程序的工作模式发生变化时(比如从I/O密集型转为CPU密集型),其所需保持驻留于RAM里的活动数据量也会随之改变,进而引起更高的面交换需求[^3]。 ```python def calculate_page_fault_rate(page_requests, page_faults): """计算缺率""" return page_faults / len(page_requests) page_requests = ['A', 'B', 'C', 'D', 'E'] page_faults = 2 # 假设在这五个面请求中有两次缺 print(f"缺率: {calculate_page_fault_rate(page_requests, page_faults):.2f}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值