操作系统--内存管理策略知识详解


目标
为了提供组织存储器硬件的各种方式的详细描述
讨论各种内存管理技术,包括分页和分段
提供英特尔奔腾处理器的详细说明,该处理器支持纯分段和带分页的分段

背景

程序必须(从磁盘)放入内存,并放在进程中才能运行
主存和寄存器是CPU可以直接访问的唯一存储
一个中央处理器时钟(或更少)内的寄存器访问
主内存可能需要许多周期
高速缓存位于主内存和中央处理器寄存器之间
需要保护存储器以确保正确操作

基本和极限寄存器
一对基本寄存器和限制寄存器定义了逻辑地址空间指令和数据到内存的绑定
指令和数据到内存地址的地址绑定可能发生在三个不同的阶段
编译时:如果内存位置先验已知,可以生成绝对代码;如果起始位置改变,必须重新编译代码
加载时间:如果编译时内存位置未知,则必须生成可重定位的代码

执行时间:如果进程在执行期间可以从一个内存段移动到另一个内存段,则绑定会延迟到运行时。需要对地址映射的硬件支持(例如,。基本和极限寄存器)

用户进程的多步处理

逻辑vs . 物理地址空间
逻辑地址空间的概念与一个单独的物理地址空间绑定,这是正确的内存管理的核心
逻辑地址——由CPU生成;也称为虚拟地址
物理地址——存储单元看到的地址
逻辑和物理地址在编译时和加载时地址绑定方案中是相同的;逻辑(虚拟)和物理地址在执行时地址绑定方案上有所不同

内存管理单元

将虚拟地址映射到物理地址的硬件设备
在内存管理单元方案中,重定位寄存器中的值被添加到用户进程在发送到内存时生成的每个地址中
用户程序处理逻辑地址;它永远看不到真正的物理地址

使用重定位寄存器的动态重定位

动力载荷

例程在被调用之前不会被加载
更好的内存空间利用率;从不加载未使用的例程
当需要大量代码来处理不经常发生的情况时很有用
不需要操作系统的特殊支持

动态连接

链接推迟到执行时间
一小块代码,存根,用于定位适当的内存驻留库例程
存根用例程的地址替换自己,并执行例程
操作系统需要检查例程是否在进程的内存地址中
动态链接对库特别有用
系统也称为共享库

交换

进程可以暂时从内存中交换到后备存储中,然后再放回内存中继续执行
后备存储—足够大的快速磁盘,可容纳所有用户的所有内存映像副本;必须提供对这些内存映像的直接访问
转出、转入–用于基于优先级的调度算法的交换变体;
低优先级流程被换出,因此高优先级流程可以被加载和执行

交换

交换时间的主要部分是转移时间;总传输时间与交换的内存量成正比
在许多系统上都可以找到交换的修改版本(即。UNIX、Linux和Windows)
系统维护一个就绪队列,该队列包含磁盘上有内存映像的准备运行的进程

连续的内存分配

主存通常分为两个分区:
常驻操作系统,通常用中断向量保存在低内存中
然后,用户进程被保存在高内存中
重定位寄存器用于保护用户进程相互隔离,并防止操作系统代码和数据发生变化
基址寄存器包含最小物理地址的值
限制寄存器包含逻辑地址范围–每个逻辑地址必须小于限制寄存器
MMU maps logical address dynamically

动态存储分配问题

如何满足自由洞列表中n号洞的要求?
第一次安装:分配第一个足够大的孔
最适合:分配足够大的最小孔;必须搜索整个列表,除非按大

小排序

产生最小的剩余孔
最不适合:分配最大的孔;还必须搜索整个列表
产生最大的剩余孔
就速度和存储利用率而言,第一适合和最佳适合优于最差适合

分页

外部碎片-总内存空间满足一个请求,但它不是连续的
内部碎片——分配的内存可能略大于请求的内存;这种大小差异是分区内部的内存,但没有被使用
通过压缩减少外部碎片
无序播放内存内容,将所有空闲内存放在一个大块中
只有当重新定位是动态的,并且在执行时发生输入/输出问题时,压缩才是可能的
工作在内存中,同时它参与
Do I/O only into OS buffers

分页

进程的物理地址空间可以是不连续的;只要物理内存可用,就为进程分配物理内存
分页避免了外部碎片和压缩需求。
将物理内存分成称为帧的固定大小的块
(大小是2的幂,介于512 - 8,192字节之间)
将逻辑内存分成大小相同的块,称为页面
跟踪所有空闲帧
要运行一个大小为n页的程序,需要找到n个空闲帧并加载程序
建立一个页表,将逻辑地址转换为物理地址
内部碎片

分页硬件

分页示例

32字节内存和4字节页面

自由框架

页表的实现
页表保存在主存中
页表基址寄存器指向页表
页表长度寄存器(PRLR)指示页表的大小
在该方案中,每个数据/指令访问需要两次存储器访问。一个用于页表,一个用于数据/指令。
这两个内存访问问题可以通过使用一种特殊的快速查找硬件缓存来解决,这种缓存称为关联内存或翻译后备缓冲区
有些顶级域名在每个TLB条目中存储地址空间标识符,唯一地标识每个进程,为该进程提供地址空间保护
相联存储器
联想记忆–提供并行搜索
p = 6 / F# = 5
地址翻译(p,d)
如果p在关联寄存器中,则取出帧号
Otherwise get frame # from page table in memory

有效访问时间
关联查找= 时间单位
假设存储器周期时间是1微秒
命中率–在关联寄存器中找到页码的次数百分比;与关联寄存器数量相关的比率
命中率= 
有效访问时间
eat =(1+)+(2+)(1–)
= 2 +  – 
存储保护
通过将保护位与每个帧相关联来实现内存保护
页表中每个条目的有效-无效位:
 “有效”表示相关页面在进程的逻辑地址空间中,因此是合法页面
“无效”表示页面不在进程的逻辑地址空间中

页表的结构

分层页表

现代计算机系统支持232到264的大逻辑地址空间。页表本身变得过大。
对于32位逻辑地址空间和4K的页面大小,页表由100万个条目组成(232/212 = 220 = 100万)。
将逻辑地址空间分解成多个页表
一种简单的技术是两级页表

两级分页示例

逻辑地址(在32位机器上,页面大小为1K)分为:
由22位组成的页码
由10位组成的页面偏移量
Since the page table is paged, the page number is further divided into:

第一亲代 d

12位页码 页码 页面偏移量
10位页面偏移量
因此,逻辑地址如下 12 10 10
其中p1是外部页表的索引,p2是外部页表的页内位移

散列页表

常见于地址空间> 32位
虚拟页码被散列到页表中
该页表包含散列到相同位置的元素链
在这个链中比较虚拟页码以寻找匹配
如果找到匹配,则提取相应的物理帧
散列页表

倒置页表

一个条目对应一个真实的内存页面
该页表由所有进程共享
条目由存储在真实存储位置的页面的虚拟地址组成,带有
关于拥有该页面的进程的信息
减少了存储每个页表所需的内存,但增加了在发生页引用时搜索表所需的时间
使用哈希表将搜索限制为一个(或最多几个)页表条目

分割

分段架构

逻辑地址由二元组组成:
<段号,偏移量>,
段表——映射二维物理地址;每个表条目都有:
base–包含段驻留在内存中的起始物理地址
限制–指定线段的长度
段表基址寄存器指向段表在内存中的位置
段表长度寄存器(STLR)表示程序使用的段数;如果s < STLR,段号s是合法的

例如:英特尔奔腾

奔腾分段

一个段允许高达4GB (32位),每个进程的最大段数为16K。
逻辑地址空间分为两个分区:
第一个分区最多有8K个专用于该进程的段。
第二个分区最多有8K个数据段,由所有进程共享。
本地描述符表(LDT):关于第一个分区的信息
全局描述符表(GDT):关于第二分区的信息。
LDT和GDT的每个条目都是一个特定段的8字节描述符。
奔腾分段

逻辑地址是一对(选择器,偏移量),其中选择器是16位数字,偏移量是32位数字:

该机器有六个段寄存器,允许一个进程同时寻址六个段。
线性地址长32位,格式如下。

Linux中的线性地址
Linux中的线性地址分为四个部分:

Linux中的每个任务都有自己的一组页表,CR3寄存器指向当前正在执行的任务的全局目录。
在上下文切换期间,CR3寄存器的值在上下文切换所涉及的任务的TSS段中被恢复。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑白极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值