OS学习笔记五:存储模型

一、地址重定位

1、已知内容

  • 程序装载到内存才可以运行

    • 通常,程序以可执行文件格式保存在磁盘上
  • 多道程序设计模型

    • 允许多个程序同时进入内存
  • 每个进程有自己的地址空间

    • 一个进程执行时不能访问另一个进程的地址空间

    • 进程对于内存空间不能执行不适合的操作

  • 进程中 的地址 不是 最终的物理 地址

  • 在进程运行 前无法计算出物理地址

    • 因为:不能确定进程被 加载到内存什么 地方

    • →→ 需要 地址重定位 的支持

    • 地址转换、地址变换、地址翻译、地址映射Translation 、Mapping

2、地址重定位RELOCATION(地址翻译、地址转换、地址映射)

  • 逻辑地址(相对地址,虚拟地址)

    用户 程序经过 编译、汇编后形成目标代码,目标代码通常采用相对地址的形式,其首地址为0 ,其余地址都相对于首地址而编址不能用逻辑地址在内存中读取信息

  • 物理地址(绝对地址,实地址)

    内存中存储单元的 地址 可直接寻址

为了保证CPU 执行指令时可正确 访问内存单 元, 需要将 用户程序中的逻辑地址转换为运行 时可由 机器直接寻址的物理地址,这一过程称为 地址重定位

3、静态重定位与动态重定位

  • 静态重定位:

    当 用户程序加载到内存时,一次性实现逻辑地址到物理地址的 转换

    一般 可以由软件完成

  • 动态重定位:

    在 进程执行过程中进行地址变换,即 逐条指令执行时 完成地址转换

    需要硬件部件支持

OS学习笔记五:存储模型

4、内存回收问题

内存回收算法

  • 当某一块归还后,前后空闲空间合并,修改内存空闲区表

  • 四种情况

    • 上相邻、 下相邻、上下都相邻、上下都不相邻

5、伙伴系统(BUDDY SYSTEM)

Linux 低层内存管理采用,一种特殊的“分离适配”算法

  • 一种经典的内存分配方案

  • 主要思想:将内存按2 的幂进行划分,组成若干空闲块链表;查找该链表找到能满足进程需求的最佳匹配块

  • 算法:

    • 首先将整个可用空间看作一块: 2^U

    • 假设进程申请的空间大小为 s ,如果 满足2^(U-1) < s <= 2^U ,则分配整个块;

    • 否则,将块划分为两个大小相等的伙伴,大小为2^(U-1)
    • 一直划分下去直到产生 大于或等于 s

OS学习笔记五:存储模型

6、页式存储管理方案

  • 设计思想

    • 用户 进程地址空间被划分 为大小 相等的 部分,称为 页(page )或页面 ,从0 开始编号

    • 内存 空间按同样大小 划分为大小相等的区域,称为 页 框(page frame ) ,从0 开始编号;也称为物理 页面 ,页 帧,内存 块

    • 内存 分配(规则)

    以 页为单位进行分配,并按 进程需要的页数来分配;逻辑 上相邻的页,物理上不一定 相邻

    • 典型页面尺寸:4K 或 4M

7、页式存储相关数据结构及地址转换

  • 页表

    • 页表项: 记录了逻辑页号与页框号的对应关系

    • 每个进程一个页表,存放 在 内存

    • 页表起始地址保存在何处?

  • 空闲内存管理

  • 地址转换(硬件 支持 )

    CPU 取到逻辑地址,自动划分为页号和页内地址;用页号查页表,得到页框号,再与页内偏移拼接成为物理地址

8、段式存储管理

具体内容参考讲义

9、段页式存储管理

具体内容参考讲义

10、交换技术(SWAPPING)

  • 设计思想

    内存 空间紧张时,系统将内存中某些进程暂时移到外存,把外存中某些进程换进内存,占据前者所占用的 区域(进程 在内存 与磁盘之间 的 动态调度)

  • 讨论:实现时遇到的问题

    • 进程的哪些内容要交换到磁盘?会遇到什么困难?

    • 在磁盘的什么位置保存被换出的进程?

    • 交换 时机?

    • 如何选择被换出的进程?

    • 如何处理进程空间增长?

  • 关于讨论的问题

    • 运行时创建或修改的内容:栈和堆

    • 交换区: 一般系统会指定一块特殊的磁盘区域作为交换空间(swap space ),包含连续的磁道,
      操作系统可以使用底层的磁盘读写操作(不经过文件系统)对其高效访问

    • 何时 需发生交换?

    只要 不用就换出(很少再用 );内存 空间不够或有不够的危险时换 出
    与调度器结合使用

    • 考虑进程的各种属性;不应换 出处于等待I/O 状态的

12、虚拟存储技术

  • 所谓虚拟存储技术是指:当进程 运行时,先将其一部分装入内存,另一部分暂留在磁盘,当要执行的指令或访问的数据不在内存时,由操作系统自动完成将它们从磁盘调入内存的 工作

  • 虚拟地址空间 即为 分 配给进程的虚拟 内 存

  • 虚拟地址 是 在 虚拟内存 中 指令或数据的 位置 ,该 位置可以被访问,仿佛它是内存的 一部分

  • 虚存提供了一 个比物理内存空间大得多的地址空间

  • 虚存的上限主要由:CPU的寻址空间及磁盘可用空间决定

13、地址保护

  • 确保每个进程有独立的地址空间

  • 确 保 进程访问合法 的地址范围

  • 确保进程的操作是合法的

OS学习笔记五:存储模型

14、虚拟页式(PAGING)

  • 虚拟存储技术 + 页式存储管理方案

    → 虚拟页式存储管理系统

  • 基本思想

    • 进程开始运行之前,不是装入全部页面,而是装入一个或零个页面

    • 之后,根据进程运行的需要,动态装入 其他页面

    • 当内存空间已满,而又需要装入新的页面时,则根据某种算法置换内存中的某个页面,以便装入新的 页面

  • 具体有两种 方式

    1 、请求调页 (demandpaging )

    2 、预先调页(prepaging )

  • 以CPU 时间 和磁盘空间换取昂贵内存空间,这是操作系统中的资源转换技术

二、页框及页表项的设计

OS学习笔记五:存储模型

1、页表表项设计

  • 页表由页表项组成

  • 页 框号、有效 位、访问位、修改 位、保护 位

    • 页框号(内存块号、物理页面号、页帧号)

    • 有效位(驻留位、中断位):表示该页是在内存还是在磁盘

    • 访问位:引用位

    • 修改位:此页在内存 中是否被 修改过

    • 保护位:读/ 可读写

通常,页表项是硬件设计的

2、引入反转(倒排)页表

  • 地址转换

    • 从虚拟地址空间出发:虚拟地址 → 查页表 → 得到页框号 → 形成物理地址

    • 每个进程一张页表

  • 解决思路

    • 从物理地址空间出发,系统建立一张页表

    • 页表项记录进程i 的某虚拟地址( 虚页号) 与页框号的映射关系

3、反转(倒排)页表设计

OS学习笔记五:存储模型

4、快表的引入

问题

  • 页表 → 两次或两次以上的内存访问

  • CPU 的指令处理速度与内存指令的访问速度差异大,CPU 的速度得不到充分利用

  • 如何加快地址映射速度,以改善系统性能?

  • 程序访问的局部性原理 → 引入快表(TLB)

5、快表

  • TLB — Translation Look-aside Buffers

    在CPU 中 引入的高速缓存 (Cache ),可以 匹配CPU 的处理速率和内存的访问 速度

    一种随机存取型存储器,除连线寻址机制外,还有接线逻辑,能按特定的匹配标志在一个存储周期内对所有的字同时进行

  • 相联存储器(associative memory )

    特点:按内容并行查找

  • 保存 正在运行进程的页表的子集( 部分页表项)

OS学习笔记五:存储模型

6、页错误PAGE FAULT

  • 又称 页面错误、页故障、页面失效

  • 地址转换过程中硬件产生的异常

  • 具体原因

    • 所 访问 的 虚拟 页面没有 调入物理内存
      → 缺页异常

    • 页面访问 违反权限(读/ 写、用户/ 内核)

    • 错误的访问地址

    • … …

7、缺页异常处理

  • 是 一种Page Fault

  • 在地址映射过程中,硬件检查页表时发现所要访问的页面不在内存,则产生该异常—— 缺页异常

  • 操作系统执行 缺页异常处理程序:获得磁盘地址,启动磁盘,将该页调入内存

    • 如果内存中有空闲页框,则分配一 个 页框,将新调入页装入,并修改页表中相应页表项的 有效 位及相应的页框号

    • 若内存中没有空闲页框,则要置换内存中某一页框;若该页框内容被修改过,则要将其写回磁盘

8、驻留集

  • 驻留集大小

    给每个进程分配多少页框?

9、置换策略

  • 决定置换当前内存中的哪 一个 页 框

  • 所有策略的目标

    → 置换 最近最不可能访问的页

  • 根据 局部性原理,最近的访问历史和最近将要访问的模式间 存在 相关性 , 因此,大多数策略都 基于过去的行为来预测将来的行为

  • 注意: 置换策略设计得越精致、越复杂,实现的软硬件开销就越大

  • 约束:不能置换被锁定的页框

10、页框锁定

为什么要锁定页面?

  • 采用虚存技术后

    开销 → 使进程运行时间变得不确定

  • 给每一页框增加一个锁定位

  • 通过设置相应的锁定位,不让操作系统将进程使用的页面换出内存,避免产生由交换过程带来的不确定的延迟

  • 例如:操作系统核心代码、关键数据结构、I/O缓冲区

Windows 中的VirtualLock 和VirtualUnLock

11、清除策略

  • 清除:从进程的驻留集中收回页框

  • 虚拟 页 式 系统工作 的 最佳状态 : 发生缺页 异常 时 ,系统中有大量的空闲页框

  • 结论:在系统中 保存一定数目的 空闲 页框供给比使用所有内存并在需要时搜索一个页框有更好的性能

1、设计一个分页守护进程(paging daemon ),多数时间睡眠着,可定期唤醒以检查内存的状态
2、如果空闲页框过少,分页守护进程通过预定的页面置换算法选择页面换出内存
3、如果页面装入内存后被修改过,则将它们写回磁盘分 页守护进程可保证所有的空闲页框是“干净”的

  • 当 进程 需要使用一个已 置换出 的页 框 时,如果该页框还没有被 新的内容 覆盖,将 它 从空闲页框 集合

  • 页缓冲技术:

    • 不 丢弃 置换出的页, 将它们放入 两个表之一:如果未被修改,则 放 到空闲页 链 表 中 ,如果修改了,则 放 到修改页 链 表 中

    • 被修改的 页 定期 写 回 磁盘( 不是一次只写一个,大大减少I/O 操作的数 量 ,从而减少了磁盘访问时间)

    • 被置换的页仍然保留在内存中, 一旦 进程 又要 访问该页,可以迅速 将它加入 该进程的驻留集合( 代价很小)

12、影响缺页次数的因素

  • 页面置换算法

  • 页面本身的大小 √

  • 程序的编制方法 √

  • 分配给进程的页框数量 √

颠簸 (Thrashing ,抖动 )

虚 存中,页面在内存 与磁盘之间 频繁调度 ,使得调度 页面所 需的时间 比进程实际运行的时间还多 ,这样导致系统 效率急剧下降,这种现象称为颠簸或抖动

13、页面淘汰(替换)算法

  1. 最佳页面置换算法(OPT)
  2. 先进先出算法(FIFO)
  3. 第二次机会算法(SCR)
  4. 时钟算法(CLOCK)
  5. 最近未使用算法(NRU)
  6. 最近最少使用算法(LRU)
  7. 最不经常使用算法(NFU)
  8. 老化算法(AGING)
    OS学习笔记五:存储模型
  9. 工作集
  10. 工作集时钟

1、2、3、4、5、6、7、9、10具体内容参考讲义

14、内存映射文件

  • 基本 思想

    进程通过一个系统 调用(mmap) 将 一个 文件( 或部分) 映射 到其虚拟地址空间的一部分 , 访问这个文件就象访问内存中的一个大数组,而不是对文件进行读写

  • 在多数实现中,在映射共享的页面时不会实际读入页面的内容,而是在访问页面时,页面才会被每次一页的读入,磁盘文件则被当作后备存储

  • 当进程退出或显式地解除文件映射时,所有被修改

本文整理自:《操作系统原理》北京大学_陈向群 讲义

个人微信公众号:
OS学习笔记五:存储模型

作者:jiankunking 出处:http://blog.****.net/jiankunking