Linux 内存 pt.1

简介: 哈喽大家好,我是咸鱼今天我们来学习一下 Linux 操作系统核心之一:内存跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令、数据、缓存等关于内存的学习,我会尽量以通俗易懂的方式且分成多篇文章去讲解

哈喽大家好,我是咸鱼

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

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

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

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

Linux 内存

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

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

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

又因为这个虚拟地址空间(虚拟内存)与物理内存相关联,进程则是通过虚拟内存去访问物理内存的
image-20221025153753741.png
虚拟地址空间又被分成内核空间用户空间,进程在用户态时只能访问虚拟用户空间地址,在内核态可以访问虚拟内核空间地址

对于不同位数字长(单个 CPU 指令可以处理数据的最大长度)的处理器(32位系统、64位系统),地址空间的范围也不同
image-20230427095708422.png
由上图可以看到,32 位系统的内核空间占 1G,位于最高处;剩下的 3G 是用户空间

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

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

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

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

  • 未分配,这个虚拟地址仅仅是个数字而已,没有任何指向
  • 未缓冲,这个虚拟地址指向了磁盘的某个字节存储单元,里面存储了指令或者数据
  • 已缓冲,这个虚拟地址指向了物理内存的某个字节存储单元,里面存储了指令或者数据。
  • 虚拟内存的好处:

    • 避免用户直接访问物理内存,防止一些破坏性操作,保护操作系统
    • 每个进程都被分配了 4GB 的 虚拟地址空间,用户可使用比实力物理内存更大的地址空间(用的时候才分配)

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

1.内存映射

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

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

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

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

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

  • 缺页异常

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

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

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

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

总结

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

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

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

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

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

相关文章
|
4天前
|
存储 缓存 编译器
Linux源码阅读笔记06-RCU机制和内存优化屏障
Linux源码阅读笔记06-RCU机制和内存优化屏障
|
13天前
|
存储 缓存 监控
如何管理Linux的内存?
【8月更文挑战第7天】如何管理Linux的内存?
30 8
|
13天前
|
存储 算法 Linux
Linux 如何管理内存?
【8月更文挑战第7天】Linux 如何管理内存?
28 4
|
20天前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
23天前
|
缓存 Linux 虚拟化
linux 查看服务器cpu 与内存配置
linux 查看服务器cpu 与内存配置
48 4
|
26天前
|
Arthas 存储 Java
JVM内存问题之Linux使用ptmalloc2导致的JNI内存溢出问题如何解决
JVM内存问题之Linux使用ptmalloc2导致的JNI内存溢出问题如何解决
|
1月前
|
缓存 监控 关系型数据库
深入理解Linux操作系统的内存管理机制
【7月更文挑战第11天】在数字时代的浪潮中,Linux操作系统凭借其强大的功能和灵活性,成为了服务器、云计算以及嵌入式系统等领域的首选平台。内存管理作为操作系统的核心组成部分,对于系统的性能和稳定性有着至关重要的影响。本文将深入探讨Linux内存管理的基本原理、关键技术以及性能优化策略,旨在为读者提供一个全面而深入的理解视角,帮助开发者和系统管理员更好地优化和管理Linux系统。
|
21天前
|
缓存 监控 安全
探索Linux操作系统的内存管理机制
在计算机科学的世界中,内存管理是操作系统核心功能之一,它直接影响系统的性能和稳定性。Linux操作系统以其高效的内存管理而闻名,其设计哲学和技术实现为开发者和系统管理员提供了极大的灵活性和控制力。本文将深入探讨Linux内存管理的基本原理、关键技术以及面临的挑战,同时通过实际案例分析,展示如何优化内存使用,提升系统性能。
|
1月前
|
消息中间件 Linux
【Linux】进程间通信——system V(共享内存 | 消息队列 | 信号量)(下)
【Linux】进程间通信——system V(共享内存 | 消息队列 | 信号量)(下)
47 0
|
1月前
|
消息中间件 存储 Linux
【Linux】进程间通信——system V(共享内存 | 消息队列 | 信号量)(上)
【Linux】进程间通信——system V(共享内存 | 消息队列 | 信号量)(上)
46 0