内存管理之分段与分页

2023-10-27

内存管理之分段与分页

转载自多名技术分享者,仅供参考!


第一篇

要理解分段和分页,那么得理解为什么会出现分段和分页的技术。

首先,这两个技术都是为了利用和管理好计算机的资源–内存

在分段这个技术还没有出现之前,程序运行是需要从内存中分配出足够多的连续的内存,然后把整个程序装载进去。举个例子,某个程序大小是10M,然后,就需要有连续的10M内存空间才能把这个程序装载到内存里面。如果无法找到连续的10M内存,就无法把这个程序装载进内存里面,程序也就无法得到运行。

上面这种直接把整个程序装载进内存的方式是有一定的问题的。例如:

1、地址空间不隔离

如何理解地址空间不隔离?

举个例子,假设我有两个程序,一个是程序A,一个是程序B。程序A在内存中的地址假设是0x000000000x00000099,程序B在内存中的地址**假设**是0x00000100x00000199。那么假设你在程序A中,本来想操作地址0x00000050,不小心手残操作了地址0x00000150,那么,不好的事情或许会发生。你影响了程序A也就罢了,你把程序B也搞了一顿。

2、程序运行时候的地址不确定

如何理解程序运行时候的地址不确定?

因为我们程序每次要运行的时候,都是需要装载到内存中的,假设你在程序中写死了要操作某个地址的内存,例如你要地址0x00000010。但是问题来了,你能够保证你操作的地址0x00000010真的就是你原来想操作的那个位置吗?很可能程序第一次装载进内存的位置是0x000000000x00000099,而程序第二次运行的时候,这个程序装载进内存的位置变成了0x000002000x00000299,而你操作的0x00000010地址压根就不是属于这个程序所占有的内存。

3、内存使用率低下

如何理解内存使用率低下呢?

举个例子,假设你写了3个程序,其中程序A大小为10M,程序B为70M,程序C的大小为30M你的计算机的内存总共有100M。

这三个程序加起来有110M,显然这三个程序是无法同时存在于内存中的。

并且最多只能够同时运行两个程序。可能是这样的,程序A占有的内存空间是0x00000000~0x00000009,程序B占有的内存空间是0x00000010~0x00000079。假设这个时候程序C要运行该怎么做?可以把其中的一个程序换出到磁盘上,然后再把程序C装载到内存中。假设是把程序A换出,那么程序C还是无法装载进内存中,因为内存中空闲的连续区域有两块,一块是原来程序A占有的那10M,还有就是从0x00000080~0x00000099这20M,所以,30M的程序C无法装载进内存中。那么,唯一的办法就是把程序B换出,保留程序A,但是,此时会有60M的内存无法利用起来,很浪费对吧。

然后,人们就去寻求一种办法来解决这些问题。

有一句话说的好:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

(这种思想在现在也用的很广泛,例如很多优秀的中间层:Nginx、Redis等等)

所以,分段这种技术就出现了。

为了实现分段的这个技术,需要引入虚拟地址空间的概念。那么什么是地址空间呢?简单的说就是可以寻址的一片空间。如果这个空间是虚拟的,我们就叫做虚拟地址空间;如果这个空间是真实存在的,我们就叫做物理地址空间。虚拟地址空间是可以任意的大的,因为是虚拟的。而物理地址空间是真实存在的,所以是有限的。

然后,分段这个技术做了一件什么事情呢?

把虚拟地址空间映射到了物理地址空间,并且你写的程序操作的是虚拟地址。假设,程序A的虚拟地址空间是0x00000100~0x00000200。此时,不仅需要一块连续的物理内存来存放程序A,还需要把程序A的虚拟地址空间映射到(转换为)物理地址空间。可能,程序A的虚拟地址空间从0x00000100~0x00000200映射到了物理地址空间0x00000000~0x00000100。

那么分段的技术可以解决什么问题呢?可以解决上面1、2两个问题。

在问题1中,假设程序A的虚拟地址空间是0x000000000x00000099,映射到的物理地址空间是0x000006000x00000699,程序B的虚拟地址空间是0x000001000x00000199,映射到的物理地址空间是0x000003000x00000399。假设你还是手残,在程序A中操作了地址0x00000150,但是英文此时的地址0x00000150是虚拟的,而虚拟化的操作是在操作系统的掌控中的,所以,操作系统有能力判断,这个虚拟地址0x00000150是有问题的,然后阻止后续的操作。所以,体现出了隔离性。(另一种体现隔离性的方式就是,操作同一个虚拟地址,实际上可能操作的是不同的物理地址)

(注意,实际上,很可能程序A和程序B的虚拟地址都是0x00000000~0x00000099。这里的举例只是为了方便理解。)

问题2也很好的解决了。正是因为这种映射,使得程序无需关注物理地址是多少,只要虚拟地址没有改变,那么,程序就不会操作地址不当。

但是问题3仍然没有解决

因为第三个问题是换入换出的问题,这个问题的关键是能不能在换出一个完整的程序之后,把另一个完整的程序换进来。而这种分段机制,映射的是一片连续的物理内存,所以问题3得不到解决。

而问题出在哪呢?就是完整和连续

而分页技术的出现就是为了解决这个问题的。分页这个技术仍然是一种虚拟地址空间到物理地址空间映射的机制。但是,粒度更加的小了。单位不是整个程序,而是某个“页”,一段虚拟地址空间组成的某一页映射到一段物理地址空间组成的某一页。(如何理解这个“页”的概念,这个问题下的其他同学回答过)

分页这个技术,它的虚拟地址空间仍然是连续的,但是,每一页映射后的物理地址就不一定是连续的了。正是因为有了分页的概念,程序的换入换出就可以以页为单位了。那么,为什么就可以只换出某一页呢?实际上,不是为什么可以换出某一页,而是可以换出CPU还用不到的那些程序代码、数据。但是,把这些都换出到磁盘,万一下次CPU就要使用这些代码和数据怎么办?又得把这些代码、数据装载进内存。性能有影响对吧。所以,我们把换入换出的单位变小,变成了“页”。(实际上,这利用了空间局部性)

所以,同学们想想,问题3是不是就解决了呢?

所以,分段和分页的区别在于:粒度


作者:匿名用户

出处:知乎

链接:https://www.zhihu.com/question/50796850/answer/522734117


第二篇

内存的分段和分页管理方式和由此衍生的一堆段页式等都属于内存的不连续分配。什么叫不连续分配?就是把程序分割成一块一块的装入内存,在物理上不用彼此相连,在逻辑上使用段表或者页表将离散分布的这些小块串起来形成逻辑上连续的程序。

在基本的分页概念中,我们把程序分成等长的小块。这些小块叫做“页(Page)”,同样内存也被我们分成了和页面同样大小的”**页框(Frame)“,**一个页可以装到一个页框里。在执行程序的时候我们根据一个页表去查找某个页面在内存的某个页框中,由此完成了逻辑到物理的映射。

分段和分页有很多类似的地方,但是最大的区别在于分页对于用户来说是没什么逻辑意义的,分页是为了完成离散存储,所有的页面大小都一样,对程序员来说这就像碎纸机一样,出来的东西没有完整意义。但是分段不一样,分段不定长,分页由系统完成,分段有时在编译过程中会指定划分,因此可以保留部分逻辑特征,容易实现分段共享。


作者:刚吃饱饭的人民

出处:知乎

链接:https://www.zhihu.com/question/50796850/answer/256353435


第三篇

首先分段和分页都是操作系统发展过程中为了更好的使用内存资源,按照一路发展的过程理解比较好理解操作系统厂商和CPU厂商带来的系列变化

保护模式

为什么要有保护模式

实模式是有很大弊端的,首先,直接操作物理内存,这样的话每次只能运行一个程序,并且不安全;另外,内存最大使用到1M,限制太大。

保护模式下,程序不能直接访问物理地址,程序的虚拟地址需要被转换为物理地址后再去访问,地址转换是由处理器和操作系统协作完成的,处理器在硬件上提供地址转换部件,操作系统提供转换过程中需要的页表。

保护模式的寄存器扩展

除段寄存器外,通用寄存器,指令指针寄存器,标志寄存器等都从16位升到了32位,因为段寄存器保留原来的16位也够用。

模式转换

bits伪指令用于指定处理器的运行模式,这一点是编译器和处理器约定的,操作数大小翻转前缀0x66和寻址方式反转前缀0x67用于将当前运行模式下的操作数大小和寻址方式转换成另一种模式。

内存寻址

地址转换

内存控制单元(MMU) 通过一种称为分段单元的硬件电路把一个逻辑地址转换成线性地址,接着,通过第二个称为分页单元的硬件电路把线性地址转换成物理地址。

graph LR
逻辑地址-->线性地址-->物理地址

全局描述符表

最初的操作系统是无法对内存段做访问限制,有了这样的需求以后,CPU厂商决定采用段描述符来实现相关的功能,在硬件一级上添加GDTR和LDTR来支持全局描述符表和局部描述符表,并由硬件负责周边的安全检测。当初的CPU厂商也并不是凭空制造出了这样一个概念,是与操作系统厂商共同协商后才有了一套硬件方面的支持。

如今x86架构的OS,大都都把分段视为是兼容性的考虑(类似于对实模式的处理),在系统初始化阶段象征性地初始化GDT,之后的运行就没分段啥事儿了。地址空间的保护模型都来自分页,像ARM体系结构就不支持分段,仅靠MMU进行保护。

imgimg

内存分页

为什么要分页

分段的内存碎片太大,是计算中发展过程中尝试过的方案,现在的方案是内存分页,通过某种方式,将虚拟地址映射到物理地址,映射的关系是通过一张表实现的,也就是页表。

imgimg

分页机制

分页机制的思想是:通过映射,可以使连续的线性地址与物理地址相关联,逻辑上连续的线性地址对应的物理地址可以不连续。 分页的作用 - 将线性地址转换为物理地址 - 用大小相同的页替换大小不同的段

imgimg

一级页表

我们把一页的大小定义为4K,那么4G就有1M个页,在32位的保护模式下,地址都是32位二进制表示的,用20位二进制定位页表,剩余的12位表示4K里面的偏移。

分页机制打开前要将页表地址加载到控制寄存器CR3中,这个过程是打开页表之前,所以存储的是物理实际地址,每个页表项对应一个物理页,通过页表项就可以访问到实际的物理地址。由于这个过程是固定的,CPU中集成了这个硬件模块,即MMU中的页部件。

imgimg

二级页表
为什么要二级页表

每个进程1M个页表,每个4字节,进程多了占用的内存还是很多的。

一般进程使用的内存是远低于全部虚拟内存的。二级模式只为进程实际使用的那些虚拟内存区分配页表,既提升了效率,也减少了内存的使用量。

imgimg

页目录项结构

imgimg

页表项结构

imgimg

REF

  • 深入理解Linux内核
  • x86保护模式

作者:长安

出处:知乎

链接:https://www.zhihu.com/question/50796850/answer/654281605


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存管理之分段与分页 的相关文章

  • CentOS 7 关闭网络限制

    1 安装CentOS 7 3操作系统mini版本即可 2 设置关闭Selinux 编辑 etc selinux config vi etc selinux config SELINUX disabled 重启机器 查看selinux状态 s
  • Client-Server问题

    1 实验内容与要求 需要创建客户Client和服务器Server两个进程 它们通过管道进行通信 Client进程派生3个生产者线程 一个管道线程 共享一个20个slots的缓冲区 每个生产者线程随机产生一个数据 打印出来自己的id 进程 线
  • ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 就是执行ps命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用top命令 要对进程进行监
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • 03LinuxC线程学习之线程共享和非共享

    1 线程共享和非共享 1 1 线程共享资源 1 文件描述符表 由于线程间共享进程间的内容 而文件描述符表在主线程的PCB当中 各个线程可以直接去请求访问 所以线程间通信就不需要像进程那样通过管道这些方式通信 2 每种信号的处理方式 即当某个
  • 操作系统 段页式存储管理

    一 引入 分页系统是以页面作为内存分配的基本单位 能有效地提高内存利用率 但信息共享等不方便 分段系统是以段作为内存分配的基本单位 它能够更好地满足用户多方面的需要 信息共享 动态链接等 但采用分区方式管理物理内存 仍然存在碎片问题 段页式
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • Windows运行常用命令(win+R)

    1 calc 启动计算器 2 notepad 打开记事本 3 write 写字板 4 mspaint 画图板 5 snippingtool 截图工具 支持无规则截图 6 mplayer2 简易widnows media player 7 S
  • 计算机网络4--Internet结构

    本页内容 1 基本结构 2 结构图解 3 层次结构图解 1 基本结构 a 端系统通过接入ISP access ISPs 连接到Internet b 接入ISP必须进一步互连 保证任意两个主机可以互相发送分组 c 构成复杂的网络互连的网络 2
  • 使用inet_ntop转换IPv6地址时在macOS和linux上的行为不一样

    下面这段python代码在macOS和linux时运行的结果是不同的 import socket ip socket inet pton socket AF INET6 1 2 3 0 5 6 7 8 print socket inet n
  • Linux常用命令记录

    文章目录 1 软件安装 安装软件 来自源服务器 安装 deb软件 来自本地 deb文件 修复依赖关系 卸载软件 2 文件 文件夹操作 删除文件夹 移动文件 文件重命名 3 程序查看 处理 进程查看 查看端口占用情况 强制终止程序 4 解压文
  • 《深入理解计算机系统》实验四Architecture Lab

    前言 深入理解计算机系统 实验四Architecture Lab下载和官方文档机翻请看 深入理解计算机系统 实验四Architecture Lab下载和官方文档机翻 我觉得这个文档对整个实验很有帮助 如果你的Y86 64环境还没安装好可以看
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器
  • chatgpt赋能python:Python打包发布完整指南:从基础知识到实践操作

    Python打包发布完整指南 从基础知识到实践操作 作为一名有着十年python编程经验的工程师 我清楚地知道打包发布Python应用程序是非常重要的 它能帮助我们方便地分享和分发程序 并且能够让其他人通过使用我们的程序来提高自己的工作效率
  • 反斜杠“\”与斜杠“/” 的区别

    与 的区别为 用途不同 系统不同 网址不同 一 用途不同 1 只能用来表示目录 2 技能作为除法符号或者间隔符号使用 也能用来表示目录 二 系统不同 1 用作目录时 适用于windows系统 2 用作目录时 适用于unix系统 也可用于wi
  • 网络安全技术有哪些

    前言 网络安全技术是保障网络安全的重要手段 以下是一些常见的网络安全技术 防火墙技术 防火墙是一种网络安全设备 可以对网络流量进行过滤和控制 防止未经授权的访问和攻击 入侵检测系统 IDS 入侵检测系统可以监测网络流量 发现和报告网络攻击和
  • 300万的人才缺口,为什么网络安全成为2024中职春招最热门的专业

    前言 随着互联网的普及和信息技术的飞速发展 网络安全问题日益凸显 网络安全产业也因此迎来了前所未有的发展机遇 根据 2023年中国网络安全产业人才发展报告 显示 我国网络安全产业人才市场供需失衡 实战型人才短缺尤为突出 在这样的背景下 中职
  • 300万的人才缺口,为什么网络安全成为2024中职春招最热门的专业

    前言 随着互联网的普及和信息技术的飞速发展 网络安全问题日益凸显 网络安全产业也因此迎来了前所未有的发展机遇 根据 2023年中国网络安全产业人才发展报告 显示 我国网络安全产业人才市场供需失衡 实战型人才短缺尤为突出 在这样的背景下 中职
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位
  • 八股文打卡day20——操作系统(3)

    面试题 线程同步的方式有哪些 我的回答 多线程同时访问和修改某个数据的话 会造成数据的不一致和冲突问题 所以就需要线程同步 线程同步的方式有 1 互斥锁 互斥锁就是 当一个资源被访问和操作时 会对这个资源加锁 把这个资源锁定 其他线程不能对

随机推荐

  • 状态机总结(简洁)

    一 概念 状态机简写为 FSM Finite State Machine 也称为同步有限状态机 我们一般简称为状态机 之所以说 同步 是因为状态机中所有的状态跳转都是在时钟的作用下进行的 而 有限 则是说状态的个数是有限的 状态机的每一个状
  • PCL1.12+VTK9.1+QT6编译部署

    本文讲解使用的环境是vs2019 pcl1 12 0 vtk9 1 qt6 0 最后再展示一个示例程序 1 编译VTK vtk下载地址如下 https vtk org download 然后用cmake构建 修改一下几个地方 然后打开生成的
  • 【解决】CentOS_7 usb安装盘制作,修改安装目录后依然dracut-initqueue timeout

    1 正常流程进centos install 报错dracut initqueue timeout 2 进入dracut时 cd dev ls grep sdb 没有文件 3 拔插U盘后 ls grep sdb 显示 sdb4 sdb 4 重
  • 教妹学Java(十三):if-else 语句详解

    大家好 我是沉默王二 一个和黄家驹一样身高 和刘德华一样颜值的程序员 本篇文章通过我和三妹对话的形式来谈一谈 if else 语句 教妹学 Java 没见过这么有趣的标题吧 语不惊人死不休 没错 本篇文章的标题就是这么酷炫 接受不了的同学就
  • ETL工具

    这些年 几乎都与ETL打交道 接触过多种ETL工具 现将这些工具做个整理 与大家分享 一 ETL工具 国外 1 datastage 点评 最专业的ETL工具 价格不菲 使用难度一般 下载地址 ftp ftp seu edu cn Pub D
  • 一步一步写STL:空间配置器 (1)

    侯捷说 追踪一流程序 并从中吸取养分 模仿着他写的程序 比那些自以为靠自己努力写出来的下三流程序价值高得多 至少我这么认为 世界上99 999 的程序 在STL面前都是下三流水平 侯捷老师这句话对STL的评价太高了 以前只是熟练使用STL
  • Tensorflow运行机制

    TensorFlow是一种基于数据流图的编程框架 它使用数据流图来描述计算过程 其中节点表示操作 边表示数据流 从而实现了高效的分布式计算和自动求导 在TensorFlow中 计算过程分为两个阶段 构建阶段和执行阶段 在构建阶段 我们使用T
  • 达梦数据库-分区表维护

    分区表的维护主要有增加分区 删除分区 交换分区 合并分区 拆分分区 1 增加分区 添加一个新的分区 2 删除分区 删除一个就分区 3 交换分区 将分区数据跟普通表交换 2张表结构必须一样 4 合并分区 将临近的两个分区合并为一个分区 目前仅
  • 绘图中的渐变

    绘图渐变 指的就是在指定区域内 指定开始位置到指定结束为止 一种颜色颜色逐渐变成另一种颜色的图 qt中的渐变分为三个类别 1线性类别 QLinearGradient 2 角度渐变 QConicalGradient 3 辐射渐变 QRadia
  • Android Studio 给方法添加注释自动生成参数的快捷设置

    没有废话 直接上图 Android Studio gt File gt Setting gt Keymap gt 发现框输入comment gt 选择Other的Fix doc comment 2 选择 Add keyboard short
  • Videos from Embedded Linux Conference 2014

    本文转载至 http free electrons com blog elc2014 videos As the summer is coming to an end we finally managed to publish the vi
  • Kubernetes详解(二十)——ReplicaSet控制器

    今天继续给大家介绍Linux运维相关知识 本文主要内容是ReplicaSet控制器 一 ReplicaSet控制器概述 ReplicaSet控制器是Pod类控制器的一种实现 该控制器用于确保其管控的Pod对象副本数量在任意时刻都能够满足用户
  • XXE-lab(全踩坑)实录

    在bWAPP中有一关是XML External Entity Attacks XXE 传送门 比较简单的了解了一下XXE 师傅的博客 浅谈XML实体注入漏洞 XXE漏洞全称XML External Entity Injection即xml外
  • 解决Windows系统下VNC Viewer无法连接到远程主机上的VNC Server的问题

    问题如下 笔记本 IP 10 100 172 194 上装了VNC Viewer 台机 IP 10 100 100 103 上装了VNC Server 原本笔记本连接无线网 可以通过VNC远程连接到办公网的台机的桌面 自从台机重装了系统后
  • 去掉suse里ls默认显示隐藏文件的特性

    以root权限suse终端时 执行ls命令 隐藏文件 文件名以 开头 也都显示出来了 这一点 我是不太喜欢 既然是隐藏文件 一般情况下就不要出现 尤其是 root目录 一堆隐藏文件 很影响我查找文件 要去掉这个特性 先执行alias命令 一
  • arxiv文章下载很慢怎么办?

    对于我们这样的深度学习屌丝来说 没钱 没资源 没数据 没时间 只能看看别人的论文生存了 经常会到arxiv上下载一些文章 比如cvpr的文章 但是 由于国内封锁 下载很慢 甚至接连几天打不开arxiv的网站 咋办 强烈推荐使用中科院arxi
  • usb描述符以及传输方式

    lsusb命令 Bus 002 表示第2个usb主控制器 Device 002 表示系统给usb鼠标分配的设备号 ID 8087 8002 Intel Corp 表示usb设备的ID 这个ID由芯片制造商设置 可以唯一表示该设备 8087
  • 洛谷P5731 【深基5.习6】蛇形方阵

    include
  • 电脑itunes,iTunes

    Music TV and podcasts take center stage iTunes forever changed the way people experienced music movies TV shows and podc
  • 内存管理之分段与分页

    内存管理之分段与分页 转载自多名技术分享者 仅供参考 第一篇 要理解分段和分页 那么得理解为什么会出现分段和分页的技术 首先 这两个技术都是为了利用和管理好计算机的资源 内存 在分段这个技术还没有出现之前 程序运行是需要从内存中分配出足够多