OS学习笔记五:存储模型
一、地址重定位
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、页面淘汰(替换)算法
- 最佳页面置换算法(OPT)
- 先进先出算法(FIFO)
- 第二次机会算法(SCR)
- 时钟算法(CLOCK)
- 最近未使用算法(NRU)
- 最近最少使用算法(LRU)
- 最不经常使用算法(NFU)
- 老化算法(AGING)
- 工作集
- 工作集时钟
1、2、3、4、5、6、7、9、10具体内容参考讲义
14、内存映射文件
-
基本 思想
进程通过一个系统 调用(mmap) 将 一个 文件( 或部分) 映射 到其虚拟地址空间的一部分 , 访问这个文件就象访问内存中的一个大数组,而不是对文件进行读写
在多数实现中,在映射共享的页面时不会实际读入页面的内容,而是在访问页面时,页面才会被每次一页的读入,磁盘文件则被当作后备存储
当进程退出或显式地解除文件映射时,所有被修改
个人微信公众号:
作者:jiankunking 出处:http://blog.****.net/jiankunking