Linux 内存管理 pt.1

哈喽大家好,我是咸鱼

 

今天我们来学习一下 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 通过内存映射的方式来实现通过虚拟内存去访问物理内存,为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

 

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

 

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

 

 


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

 

原文链接:https://www.cnblogs.com/edisonfish/p/17359785.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux 内存管理 pt.1 - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • Linux badblocks命令

    Linux badblocks命令 Linux badblocks命令用于检测磁盘坏道,可以扫描磁盘并标记出坏道。使用badblocks命令可以帮助您检测磁盘的健康状况,以便及时备份数据或更换盘。 命令语法 badblocks命令的基本语法如下: “badblocks [选项] [设备] 其中,选项表示命令选项,设备表示要检测的磁盘设备。 ## 命令项 b…

    Linux 2023年5月10日
    00
  • [Linux] Nginx响应压缩gzip

    压缩和解压缩 1.本节介绍如何配置响应的压缩或解压缩以及发送压缩文件。 gzip on; 2.NGINX仅使用MIME类型text / html压缩响应 gzip_types text/plain application/xml;//指定压缩媒体类型 3.指定响应压缩的最小长度 gzip_min_length 1000; 4.gzip_proxied指令具有…

    Linux 2023年4月13日
    00
  • centos8 使用yum 安装 mongodb 4.2的方法

    下面是CentOS 8使用yum安装MongoDB 4.2的完整攻略: 1. 添加MongoDB 4.2仓库 CentOS 8默认的yum源里面并没有MongoDB 4.2版本的安装包,需要添加MongoDB官方的yum源。在终端中执行以下命令: sudo vi /etc/yum.repos.d/mongodb-org-4.2.repo 并将以下内容添加到m…

    Linux 2023年5月14日
    00
  • Centos Linux7设置静态IP的实例

    我们来讲解一下“CentOS Linux7设置静态IP的实例”的完整攻略。 1.前置条件 在进行静态IP的设置之前,我们需要先保证以下几点: CentOS7已经安装完成; 能够正常联网并且能够访问互联网; 能够登录到CentOS7系统的终端或者命令行界面。 2.备份原有配置文件 在进行静态IP的设置之前,我们需要先将原有的网络配置文件进行备份。通过备份可以避…

    Linux 2023年5月24日
    00
  • 第六章 第一个Linux驱动程序:统计单词个数

    在本章将进入了最令人激动的时刻,为了是读者在刚开始学习Linux驱动开发时充满期待,没有只提供Helloworld程序。 首先介绍Linux驱动到底是个什么东西,它和我们以前接触过的windows类型差不多,但是操作和工作方式有很大的区别,Linux系统将每一个驱动都映射成一个文件。这些文件成为设备文件或这驱动文件,都保存在/dev目录中。 接下来给出编写L…

    Linux 2023年4月12日
    00
  • VMware10.0.7安装centos6.3,连接xshell

    VMware10.0.7安装CentOS6.3,连接Xshell 完整攻略 硬件要求 在安装VMware10.0.7之前,需要检查以下硬件要求是否满足: 处理器:1.3 GHz 或更高速度的 Intel 处理器或 AMD 处理器 内存:至少 2 GB RAM 硬盘空间:至少 1.5 GB 硬盘空间,此外还需要额外的磁盘空间来存储虚拟机 步骤 下面是在VMwa…

    Linux 2023年5月24日
    00
  • Linux mii-tool命令

    Linux mii-tool 命令可以用于操作和显示与以太网介质相关的设置和状态。它通过读取和写入物理层控制器的寄存器中的值来执行其功能。 命令语法 mii-tool 的使用语法如下: mii-tool [-v|–verbose] [-V|–version] [-r|–reset] [-F|–force=][10baseT|100baseTx-FD|…

    Linux 2023年3月28日
    00
  • vmware中linux怎么设置网络

    下面是详细的”vmware中linux怎么设置网络”的操作步骤: 步骤一.创建虚拟机 首先需要在vmware中创建一台Linux虚拟机,具体步骤如下: 打开vmware虚拟机管理器,点击“创建新的虚拟机”按钮; 选择“典型(推荐)”创建模式,并点击“下一步”按钮; 选择Linux操作系统,并选择相应的版本,然后点击“下一步”按钮; 输入虚拟机的名称和存放路径…

    Linux 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部