Linux 内存管理 pt.1

这篇具有很好参考价值的文章主要介绍了Linux 内存管理 pt.1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

 文章来源地址https://www.toymoban.com/news/detail-427154.html

今天我们来学习一下 Linux 操作系统核心之一:内存

 

跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令、数据、缓存等

 

关于内存的学习,我会尽量以通俗易懂的方式且分成多篇文章去讲解

 

那么今天在 pt.1 文章中,我们来学习一下 Linux 中的虚拟内存、物理内存和内存映射

 

Linux 内存

Linux 内存管理 pt.1

 

只有内核才可以直接访问物理内存,进程是无法直接访问物理内存的

 

  • 那么进程是如何访问物理内存?

 

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个空间是连续的,这样进程就可以很方便的访问到内存,准确来说是访问到虚拟内存

 

又因为这个虚拟地址空间(虚拟内存)与物理内存相关联,进程则是通过虚拟内存去访问物理内存的

 

Linux 内存管理 pt.1

 

虚拟地址空间又被分成内核空间用户空间,进程在用户态时只能访问虚拟用户空间地址,在内核态可以访问虚拟内核空间地址

 

对于不同位数字长(单个 CPU 指令可以处理数据的最大长度)的处理器(32位系统、64位系统),地址空间的范围也不同

 

Linux 内存管理 pt.1

 

由上图可以看到,32 位系统的内核空间占 1G,位于最高处;剩下的 3G 是用户空间

 

而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的

 

虽然每个进程都有虚拟内核空间,但每个进程的虚拟内核空间内存关联的都是相同的物理内存,方便进程切换到内核态后去访问物理内存

Linux 内存管理 pt.1

 

物理地址空间是物理内存的范围,虚拟地址空间是虚拟内存的范围,物理地址空间中的每个物理地址都是实打实地指向了具体的存储单元

 

虚拟地址空间中每个虚拟地址指向哪里有 3 种情况:

  • 未分配,这个虚拟地址仅仅是个数字而已,没有任何指向

  • 未缓冲,这个虚拟地址指向了磁盘的某个字节存储单元,里面存储了指令或者数据

  • 已缓冲,这个虚拟地址指向了物理内存的某个字节存储单元,里面存储了指令或者数据。

 

  • 虚拟内存的好处:

    • 避免用户直接访问物理内存,防止一些破坏性操作,保护操作系统

    • 每个进程都被分配了 4GB 的 虚拟地址空间,用户可使用比实力物理内存更大的地址空间(用的时候才分配)

Linux 内存管理 pt.1

 

那么当进程实际使用的时候,进程的虚拟内存是怎么分配到物理内存的呢?

 

1.内存映射

并不是所有的虚拟内存都会被分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的

 

内存映射,其实就是将虚拟内存地址映射到物理内存地址

 

为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

 

页表实际上存储在 CPU 的内存管理单元 MMU 中。这样,正常情况下,CPU 就可以直接通过硬件,找出要访问的内存

 

Linux 内存管理 pt.1

 

这张页表里面有很多页表项,每个页表项的大小为 4KB。当进程访问的虚拟内存被分配了物理内存之后,系统就会更新页表,在页表项中添加虚拟内存与物理内存的映射关系

 

  • 缺页异常

如果进程要访问的虚拟内存没有被分配物理内存(即在页表中找不到映射关系),就会产生一个缺页异常中断

 

这时候系统会进入内核空间分配物理内存、然后更新进程页表,最后再返回用户空间,恢复进程的运行

 

MMU 中有一个高速缓存 TLB((Translation Lookaside Buffer,转译后备缓冲器),TLB 访问速度要比 MMU 快得多

通过提高 TLB 缓存使用率,可以提高 CPU 的内存访问性能 

总结

在 Linux 中,为了提高内存利用率和系统可靠性,同时也为了不同进程之间的内存隔离,进程不能直接访问到物理内存

 

Linux 为每一个进程都分配了一个虚拟内存,当进程实际使用的时候,虚拟内存才会被分配物理内存

 

Linux 通过内存映射的方式来实现通过虚拟内存去访问物理内存,为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

 

如果进程要访问的虚拟内存没有被分配物理内存(即在页表中找不到映射关系),就会产生一个缺页异常中断

 

这时候系统会进入内核空间分配物理内存、然后更新进程页表,最后再返回用户空间,恢复进程的运行

 

 


感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

 

到了这里,关于Linux 内存管理 pt.1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux内存管理--smaps内存

    swaps文件是Linux的proc文件系统提供的查看系统下运行进程内存使用情况的方法,Linux给每个进程都提供了一个这样的文件,学会查看并分析swaps文件有助于定位和解决诸如内存泄漏、性能瓶颈等内存资源相关问题。 了解smaps文件之前,需要先搞清楚Linux内存管理中的虚拟内存(

    2024年02月09日
    浏览(48)
  • 【Linux内核】内存管理——内存回收机制

    转载请注明: https://www.cnblogs.com/Ethan-Code/p/16626560.html 前文提到malloc的内存分配方式,malloc申请的是虚拟内存,只有在程序去访问时,才会触发缺页异常进入内核态,在缺页中断函数中建立物理内存映射。 如果物理内存充足,则直接建立页框与页的映射。当物理内存不足时,内

    2023年04月09日
    浏览(49)
  • 系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理

    虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下,每个进程都有自己的独立的虚

    2024年02月11日
    浏览(42)
  • linux 内存管理

    一个虚拟内存系统, 意味着用户程序见到的地址不直接对应于硬件使用 的物理地址. 虚拟内存引入了一个间接层, 它允许了许多好事情. 有了虚拟内存, 系统重 运行的程序可以分配远多于物理上可用的内存; 确实, 即便一个单个进程可拥有一个虚拟 地址空间大于系统的物理内存

    2024年01月21日
    浏览(27)
  • 深入理解Linux虚拟内存管理

    Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理解Linux虚拟内存管理(四) 深入理解Linux虚拟内存管理(五) 深入理解Linux虚拟内存

    2024年02月06日
    浏览(54)
  • 从 malloc 分配大块内存失败 来简看 linux 内存管理

    应用进程 malloc 返回了null,但是观察到的os 的free内存还有较大的余量 ,很奇怪为什么会这样? 不可能是oom导致的(当然也没有 os 的oom 日志),free还有余量,系统也没有cgroup的应用隔离。 我们linux上使用的库函数 malloc 基本都是用glibc库实现的malloc函数(当然如果binary 链接

    2024年02月08日
    浏览(51)
  • 深入理解Linux虚拟内存管理(六)

    Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理解Linux虚拟内存管理(四) 深入理解Linux虚拟内存管理(五) 深入理解Linux虚拟内存

    2024年02月08日
    浏览(46)
  • 深入理解Linux内核——内存管理(1)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月13日
    浏览(46)
  • 深入理解Linux内核——内存管理(2)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月13日
    浏览(40)
  • 深入理解Linux内核——内存管理(3)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包