OS学习笔记五:存储模型

来源:互联网 发布:linux oracle 监听 编辑:程序博客网 时间:2024/06/10 12:11

一、地址重定位

1、已知内容

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 静态重定位:

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

    一般 可以由软件完成

  • 动态重定位:

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

    需要硬件部件支持

这里写图片描述

4、内存回收问题

内存回收算法

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

  • 四种情况

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

5、伙伴系统(BUDDY SYSTEM)

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

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

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

  • 算法:

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

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

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

这里写图片描述

6、页式存储管理方案

  • 设计思想

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

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

    • 内存 分配(规则)

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

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

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

  • 页表

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

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

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

  • 空闲内存管理

  • 地址转换(硬件 支持 )

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

8、段式存储管理

具体内容参考讲义

9、段页式存储管理

具体内容参考讲义

10、交换技术(SWAPPING)

  • 设计思想

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

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

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

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

    • 交换 时机?

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

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

  • 关于讨论的问题

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

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

    • 何时 需发生交换?

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

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

12、虚拟存储技术

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

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

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

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

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

13、地址保护

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

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

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

这里写图片描述

14、虚拟页式(PAGING)

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

    → 虚拟页式存储管理系统

  • 基本思想

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

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

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

  • 具体有两种 方式

    1 、请求调页 (demandpaging )

    2 、预先调页(prepaging )

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

二、页框及页表项的设计

这里写图片描述

1、页表表项设计

  • 页表由页表项组成

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

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

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

    • 访问位:引用位

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

    • 保护位:读/ 可读写

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

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

  • 地址转换

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

    • 每个进程一张页表

  • 解决思路

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

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

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

这里写图片描述

4、快表的引入

问题

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

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

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

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

5、快表

  • TLB — Translation Look-aside Buffers

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

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

  • 相联存储器(associative memory )

    特点:按内容并行查找

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

这里写图片描述

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)
    这里写图片描述
  9. 工作集
  10. 工作集时钟

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

14、内存映射文件

  • 基本 思想

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

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

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

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

个人微信公众号:
这里写图片描述

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

原创粉丝点击