侧边栏壁纸
博主头像
一定会去到彩虹海的麦当

说什么呢?约定好的事就一定要做到啊!

  • 累计撰写 63 篇文章
  • 累计创建 16 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

[操作系统]——内存管理

一定会去到彩虹海的麦当
2022-02-15 / 0 评论 / 0 点赞 / 143 阅读 / 1,981 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

📚笔记整理自小林coding的《图解系统》,作者写的很不错,我自己整理一下方便后期复习

虚拟内存

定义

为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套虚拟地址空间

  • 每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。

  • 作为程序,也不用关心物理地址的事情。

image-20220215123046138

  • 我们程序所使⽤的内存地址叫做虚拟内存地址(Virtual Memory Address)
  • 实际存在硬件⾥⾯的空间地址叫物理内存地址(Physical Memory Address)。

内存交换

每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)

映射方式

1、内存分段

(1)定义

内存分段是根据程序的逻辑角度,分成了栈段、堆段、数据段、代码段等,这样可以分离出不同属性的段,同时是一块连续的空间。

(2)分段机制

分段机制下的虚拟地址由两部分组成,段选择因⼦段内偏移量

虚拟地址是通过段表与物理地址进⾏映射的,分段机制会把程序的虚拟地址分成 几个个段, 每个段在段表中有⼀个项,在这⼀项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址

image-20220215123914955

(3)问题

  • 内存碎片

    每个段的大小不一,就容易导致产⽣了多个不连续的⼩物理内存,导致新的程序⽆法被装载,可以通过内存交换来解决

  • 内存交换效率低

    硬盘访问速度比内存慢太多,如果内存交换的时候,交换的是⼀个占内存空间很⼤的程序,这样整个机器都会显得卡顿

2、内存分页

(1)定义

分⻚是把整个虚拟和物理内存空间切成⼀段段固定尺⼨的⼤⼩。这样⼀个连续并且尺⼨固定的内存空间, 我们叫⻚(Page)。在 Linux 下,每⼀⻚的⼤⼩为 4KB 。

虚拟地址与物理地址之间通过⻚表来映射,内存管理单元 (MMU)就做将虚拟内存地址转换成物理地址的⼯作

image-20220215124455293

⽽当进程访问的虚拟地址在⻚表中查不到时,系统会产⽣⼀个缺⻚异常,进⼊系统内核空间分配物理内 存、更新进程⻚表,最后再返回⽤户空间,恢复进程的运⾏

image-20220215124824505

(2)优点

  • 采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存

  • ⼀次性写⼊磁盘的也只有少数的⼀个⻚或者⼏个⻚,不会花太多时间,内存交换的效率就相对⽐较 ⾼

  • 只有在 程序运⾏中,需要⽤到对应虚拟内存⻚⾥⾯的指令和数据时,再加载到物理内存⾥⾯去

(3)分页机制

在分⻚机制下,虚拟地址分为两部分,⻚号和⻚内偏移。⻚号作为⻚表的索引,⻚表包含物理⻚每⻚所在 物理内存的基地址,这个基地址与⻚内偏移的组合就形成了物理内存地址

image-20220215124951635

  • 把虚拟内存地址,切分成⻚号和偏移量;
  • 根据⻚号,从⻚表⾥⾯,查询对应的物理⻚号;
  • 直接拿物理⻚号,加上前⾯的偏移量,就得到了物理内存地址

(4)多级页表

为了解决简单分页产生的页表过大的问题,就有了多级页表

我们把100 多万个「⻚表项」的单级⻚表再分⻚,将⻚表(⼀级⻚表)分为 1024 个⻚表(⼆级⻚ 表),每个表(⼆级⻚表)中包含 1024 个「⻚表项」,形成⼆级分⻚

image-20220215125153288

如果使用了二级分页,一级页表就可以覆盖整个4GB虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。

这样真正比较占内存的二级页表占用的空间就可以节约下来了。

(5) TLB

多级页表,它解决了空间上的问题,但这就会导致CPU 在寻址的过程中,需要有很多层表参与,加大了时间上的开销。于是根据程序的局部性原理,在CPU芯片中加入了TLB(Translation Lookaside Buffer,负责缓存最近常被访问的页表项,大大提高了地址的转换速度。TLB也被称为页表缓存、快表等

有了 TLB 后,那么 CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的⻚表

3、段页式内存管理

段内式内存管理将内存分段和内存分页组合起来了

段⻚式内存管理实现的⽅式: 先将程序划分为多个有逻辑意义的段,也就是前⾯提到的分段机制; 接着再把每个段划分为多个⻚,也就是对分段划分出来的连续空间,再划分固定⼤⼩的⻚

image-20220215125858023

段⻚式地址变换中要得到物理地址须经过三次内存访问:

  • 第⼀次访问段表,得到⻚表起始地址;

  • 第⼆次访问⻚表,得到物理⻚号;

  • 第三次将物理⻚号与⻚内位移组合,得到物理地址

linux内存管理

Linux 系统主要采用了分页管理,但是由于Intel处理器的发展史,Linux系统无法避免分段管理。于是Linux 就把所有段的基地址设为0,也就意味着所有程序的地址空间都是线性地址空间(虚拟地址),相当于屏蔽了CPU逻辑地址的概念,所以段只被用于访问控制和内存保护。

image-20220215130104385

  • 程序所使用的地址,通常是没被段式内存管理映射的地址,称为逻辑地址;
  • 通过段式内存管理映射的地址,称为线性地址,也叫虚拟地址;
0

评论区