【操作系统/OS笔记05】非连续内存分配:分段、分页、页表
本次笔记内容:
4.1 非连续内存分配:分段
4.2 非连续内存分配:分页
4.3 非连续内存分配:页表
文章目录
- 为什么需要非连续内存分配
- 非连续分配的优劣
- 分段(segment)
- 分段寻址方案
- 分页(paging)
- 基本规定
- 帧(Frame)
- 页
- 页表
- TLB
- 二级、多级页表
- 反向页表(inverted page table)
- 办法一:基于页寄存器(Page Registers)的方案
- 基于关联内存(associative memory)的方案
- 基于哈希(hash)查找的方案
为什么需要非连续内存分配
连续分配有碎片等缺点。
非连续分配的优劣
优点:
- 一个程序的物理地址空间是非连续的;
- 更好的内存利用和管理;
- 允许共享代码与数据(共享库etc.);
- 支持动态加载和动态链接。
缺点:
- 如何建立虚拟地址和物理地址之间的转换
- 软件方案(开销巨大)
- 硬件方案(主要考虑的方案)
硬件方案: 分段、分页。
分段(segment)
根据程序的段的性质,分离出来管理。
堆、运行栈、程序数据、程序text段分开管理,确保了效率、安全问题。
分段技术是一种映射。使用 硬件支持 来寻址,是一种较好方案。
分段寻址方案
s: segment number,段号;
addr: address,地址。
x86为段寄存器+地址寄存器实现方案。
上图中,左上角应用程序P通过CPU执行每条指令;CPU去寻址,这里采用单地址实现方案。段号保存在 段表 (存储:逻辑地址与物理地址映射关系;每个段起始地址、长度限制)里,段号决定段表中的索引。段表是操作系统在寻址之前就建立好的。
段表如何建立在实验部分展开讲解。
分页(paging)
分页为较为常用方式。分页机制中,“段”的尺寸不可变,即为页。
基本规定
- 划分物理内存至固定大小的帧:大小是2的幂,e.g.,512,4096,8192。
- 划分逻辑地址空间至相同大小的页:大小是2的幂,e.g.,512,4096,8192。
- 建立方案:转换逻辑地址为物理地址(pages to frames)
- 页表
- MMU/TLB
帧(Frame)
物理内存被分割为 大小相等的帧 。帧存在帧号(frame number)与偏移(offset),相当于段中的段号与偏移。 帧号占了F这么多位,本身大小占了S这么多位。
上图示例中,(f,o)=(3,6),分别代表段号与本身所表示值。
思考(不一定对): 如果f=1(第一个页),o=3,则物理地址为29+32^9 + 329+3。物理地址的1到16为是倒着的,则物理地址代表本物理内存存在元素的所在的最大一位。则对于(1,3),是填满第一页的1到3位,物理地址指向第3位。
页
逻辑地址中,用页表示。
在页中, 页号大小可能不等于帧号大小,但是偏移大小一定相等。
有了页号,查出帧号是多少。(p,o)→(f,o)。页表由操作系统建立。
分页机制,每页偏移大小固定,没有分段中存在的异常问题。一般来讲,逻辑地址空间大于物理内存地址空间,会产生问题,解决办法在虚拟内存中讨论。
页表
页表其实是一个大数组。
每个运行的程序都有一个页表。
上图中可以看到,页表项中存在一些bit,用于表示页的性质,如该页是否真实存在等等。
resident bit(驻留位),1代表页存在;Frame num是00100,对应物理地址f是4。
问题:
访问一个内存单元需要2次访问(空间开销大)。
- 一次用于获取页表项;
- 一次用于访问数据。
eg. 64位机器如果每页1024字节,那么一个页表大小是264/1024=2542^{64} / 1024 = 2^{54}264/1024=254,过大。如果这样,计算机连一个页表都存不下。
并且,CPU的cache很小(几M),放不下多个应用程序的多个列表。
如何解决这些问题?
- 缓存(Caching);
- 间接(Indirection)访问。
TLB
常用页放在TLB中,直接映射到物理地址,也避免了对内存中页表的访问。如果TLB访问不到(TLB miss),CPU回去查页表。TLB缺失不会很大,因为写程序时,尽量保证了访问的局部性。
二级、多级页表
一级页表中不存在的索引,二级页表中也没有必要存在,因此节省了空间。
多级页表中,存在“树”状关系。像64位系统中,使用5级页表进行存储。 尽管访问级数越高,时间开销越大,但是节省了空间。而时间的开销又可以通过TLB机制缓解。
反向页表(inverted page table)
- 有大地址空间(64-bits,64位寻址空间),前向映射页表变得繁琐(如5级页表)。
- 不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对应。
- 逻辑(虚拟)地址空间增长速度快于物理地址空间。
因此,以物理页的页帧号作为index,来查找逻辑页的页号。
办法一:基于页寄存器(Page Registers)的方案
寄存器中,以帧号为索引。寄存器大小只与物理地址有关。占的空间很少。
页寄存器一个例子:
- 物理内存大小:4096×4096=4K×4KB=16MB4096 \times 4096 = 4K \times 4KB = 16MB4096×4096=4K×4KB=16MB
- 页面大小:4096bytes=4KB4096 bytes = 4 KB4096bytes=4KB
- 页帧数:4096=4K4096 = 4K4096=4K
- 页寄存器使用的空间(假设8 bytes/register):8×4096=32Kbytes8 \times 4096 = 32 Kbytes8×4096=32Kbytes
- 页寄存器带来的额外开销:32K/16M=0.2%32K/16M = 0.2\%32K/16M=0.2%
- 虚拟内存大小:任意
但是在查找时,是根据Page number来查找Frame number。因此,页寄存器该如何查找?
基于关联内存(associative memory)的方案
关联存储器虽然解决了查找问题,但是设计复杂,需要放到CPU中(放到内存中存在访问开销问题),开销代价巨大。
基于哈希(hash)查找的方案
哈希计算一般使用硬件辅助计算加速。加入PID(程序ID)参数及哈希规则,有效缓解映射开销。
- 存在哈希碰撞问题,需要使用PID缓解这种冲突;
- 反向页表还是要放到内存中,还是需要TLB把其缓存起来。
- 这种机制(反向页表、不受制于虚拟地址空间限制)在高端CPU中才存在。
【操作系统/OS笔记05】非连续内存分配:分段、分页、页表相关推荐
- OS学习笔记-6(清华大学慕课) 非连续内存分配管理
非连续内存分配的需求 有可能找不到连续的一块内存空间满足进程需求 连续分配存在内碎片,外碎片,内存利用率比较低 非连续内存分配目标:提高内存利用效率以及管理灵活性 于是由于非连续内存块的大小分成了:段 ...
- 操作系统 非连续分配_操作系统中的连续和非连续内存分配
操作系统 非连续分配 In this article, we will learn about the different types of memory management techniques ...
- 清华大学《操作系统》(六):非连续内存分配 段式、页式、段页式存储管理
背景 连续内存分配给内存分配带来了很多不便,可能所有空闲片区大小都无法满足需求大小,这个分配就会失败.基于这种现状,就有了非连续内存分配的需求.非连续分配成功的几率更高,但也面对更多的问题,比如分配时 ...
- 操作系统-- 连续内存分配、非连续内存分配
文章目录 一.连续内存分配 1.内存碎片的问题 (1)外部碎片 (2)内部碎片 2.连续内存分配算法 (1)首次适配 (2)最优适配 (3)最差适配 3.碎片整理方法 4.连续内存分配的缺点 二.非连 ...
- 连续内存分配与非连续内存分配
连续内存分配 首次适配:空闲分区以地址递增的次序链接.分配内存时顺序查找,找到大小能满足要求的第一个空闲分区. 最优适配:空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区. 最坏适配:空闲 ...
- 操作系统五: 非连续内存分配
如何建立虚拟地址和物理地址之间的转换? 分段(Segmentation) 程序的分段地址空间 分段寻址方案 分页(Paging) 逻辑地址空间被划分为页 页表(Page Table)
- 【操作系统/OS笔记04】内存分层体系、地址生成、连续内存分配概论
本次笔记内容: 3.1 计算机体系结构及内存分层体系 3.2 地址空间和地址生成 3.3 连续内存分配:内存碎片与分区的动态分配 3.4 连续内存分配:压缩式与交换式碎片整理 文章目录 物理内存 计算 ...
- 《操作系统》OS学习(五):连续内存分配 内存碎片、动态分配、碎片整理、伙伴系统
内存碎片 在没有其他方式辅助的情况下,我们分配给一个进程的内存是连续的.在分配时候我们需要有动态分配与碎片处理.如何理解呢?就是每个进程需要一块内存,我们要选取合适的位置的内存分配给它.当有的进程先结 ...
- 【清华大学】操作系统 陈渝 Part3 ——物理内存管理 之 连续内存分配
[清华大学]操作系统 陈渝 Part3 --物理内存管理 之 连续内存分配 3.1计算机体系结构及内存分层 计算机体系机构 内存体系层次 管理内存方法 3.2地址空间 & 地址生成 地址空间定 ...
最新文章
- Windows上VS2017单步调试FFmpeg源码的方法
- iOS SQLite解密之SQLCipher
- ExecutorService(任务调度器)详解
- 使用7z命名行备份VS项目
- mysql大表join小表速度很慢_mysql多表join中,为什么子查询会那么慢,怎么解决-问答-阿里云开发者社区-阿里云...
- linux下ip协议(V4)的实现(四)
- 只怪自己当时年纪太小,一心只看那只泼猴了
- win10共享文件夹设置,本地组策略配置全攻略
- 深度学习领域最新的技术(CV、NLP)
- 【深度优先搜索】复原IP地址
- bootstrap3 侧边导航栏
- python如何收集数据库_python 整理web数据库
- ps用画笔工具设计水墨圆环
- 基于Simulink的高速跳频通信系统抗干扰性能
- 选择结构——判断3或7的倍数
- 华为网络精英挑战赛初赛
- c4d fbx大小_C4D设计模型大全,多达23.7GB
- 波士顿矩阵图的制作--基于Excel
- 【JDBC】JDBC快速入门
- 单片机原理与应用技术(三)———动态数码管显示汇编语言
热门文章
- 【MySQL】RPM包安装
- 【Oracle】非RMAN恢复数据文件、控制文件
- Mac下新安装的MySQL无法登陆root用户解决方法
- win7 32位操作系统 ie8浏览器问题解决办法
- js解决浏览器打印自动分页的问题
- spring使用@Value标签读取*.properties文件的中文乱码问题的解决
- php抛出异常Exception和\Exception使用区别
- .NET Core,.NET Framework和Xamarin有什么区别?
- Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类
- HTML+CSS详解