Linux内存管理

2023-05-16

Linux中的程序都是在进程中执行的,而每个进程都有自己的虚拟地址空间,进程中的内存操作,比如访问,插入数据都是在这块虚拟地址空间上操作的。

虚拟地址空间

虚拟地址空间是一个进程所使用的虚拟内存地址的集合,每个进程都有自己独立的虚拟地址空间。
虚拟地址空间由操作系统管理,可以分为多个部分,如代码段、数据段、堆栈等。
程序员在编写代码时可以使用虚拟地址,而不必考虑物理内存的实际位置。
当程序被执行时,操作系统将虚拟地址转换为物理地址,以便访问实际内存。
虚拟地址空间的好处是可以让多个进程共享同一份代码,同时还能够保护进程间的内存访问,增强系统的安全性和稳定性。

虚拟地址空间的功能

内存隔离:进程A可以在其虚拟地址空间中创建一个大型数组,而不会干扰其他进程的内存。进程B也可以创建一个相同大小的数组,但它在自己的虚拟地址空间中,两个进程的数组相互隔离。同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。

内存映射:当进程A访问其虚拟地址空间中的数组元素时,操作系统将虚拟地址映射到物理内存中相应的地址。例如,虚拟地址0x1000可能映射到物理内存地址0x4000。进程A无需知道具体的物理内存地址,只需要通过虚拟地址访问数组。这里需要用到内存管理单元中的页表缓存部件中的页表映射,将虚拟地址转换为物理地址。而页表映射就是通过页表项实现的,可以将页和对应物理地址对应起来。

虚拟内存管理:虚拟内存管理:假设数组的大小超过了可用的物理内存大小。在这种情况下,操作系统可以将虚拟地址空间中未被使用的部分保存在磁盘上的交换文件中。当进程A需要访问被交换出的数据时,操作系统会将其重新加载到物理内存中,这样进程A可以继续访问它。通过这种虚拟内存管理技术,进程A可以使用比物理内存更大的地址空间。

内存保护:操作系统可以为进程A的虚拟地址空间设置访问权限。例如,操作系统可以将数组的某个区域设置为只读,以防止进程A在不经过授权的情况下修改数据。这提供了一定的安全性和数据完整性保护。

虚拟内存

虚拟内存更多被定义为一项操作系统的内存管理技术,它将虚拟地址空间和物理内存结合起来,扩展了可用的内存空间。虚拟内存将虚拟地址空间中的部分数据暂时保存在硬盘上的交换文件中,而不是全部存储在物理内存中。这样,即使实际的物理内存有限,进程仍然可以访问大于物理内存大小的数据。

物理内存

物理内存是计算机中实际存在的内存,也称为硬件内存或主存储器。它是由芯片组成的硬件设备,用于存储正在运行的程序和数据。计算机需要将数据从硬盘等外部存储设备读取到物理内存中,才能通过CPU进行处理和操作。物理内存的大小直接影响计算机的性能和运行速度。

虚拟内存地址空间布局


虚拟内存地址空间又分用户空间和内核空间,其中用户空间是程序员通过代码分配使用,内核空间的使用来源于CPU的调度处理。
1.用户空间
应用程序使用malloc()申请内存,使用free()释放内存,malloc()/free()是glibc 库的内存分配器ptmalloc 提供的接口,ptmalloc 使用系统调用brk/mmap 向内核以页为单位申请内存,然后划分成小内存块分配给用户应用程序。

2.内核空间

内核空间的基本功能:虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk 用来扩大或收缩堆,sys_mmap 用来在内存映射区域分配虚拟页,sys_munmap 用来释放虚拟页。
页分配器负责分配物理页,当前使用的页分配器是伙伴分配器。内核空间提供把页划分成小内存块分配的块分配器,提供分配内存的接口kmalloc()和释放内存接口kfree()。块分配器:LAB/SLUB/SLOB。

3.硬件层面

处理器包含一个称为内存管理单元(Memory Management Unit,MMU)的部件,负责把虚拟地址转换成物理地址。内存管理单元包含一个称为页表缓存(Translation Lookaside Buffer,TLB)的部件,保存最近使用的页表映射,避免每次把虚拟地址转换物理地址都需要查询内存中的页表。

用户虚拟地址空间布局

Linux 内核使用内存描述符mm_struct 描述进程的用户虚拟地址空间,每个进程在内核中都有一个对应的mm_struct结构。
mm_struct结构包含了与进程内存管理相关的信息,其中一些重要的字段包括:

  1. pgd:指向进程页表的指针。页表用于将虚拟地址映射到物理地址,pgd存储了页表的基地址。
  2. mmap:链表结构,记录了进程当前所拥有的内存映射区域。每个内存映射区域都包含了起始地址、结束地址、权限标志等信息。
  3. mm_rb:红黑树结构,用于快速查找和管理进程的虚拟地址空间。
    还有代码段、数据段、堆、栈的起始/结束地址等参数成员。

同一个线程组的用户线程共享用户虚拟地址空间,因为线程组是同一个进程的一组线程,他们共享进程资源,比如内存空间、文件描述符等。

内核线程是没有用户虚拟地址空间的,因为内核线程不属于任何用户线程,内核线程是操作系统内核的一部分,它们在内核空间运行,负责处理系统任务和管理硬件资源。只有内核虚拟地址空间,内核虚拟地址空间通常是操作系统的一部分,与用户进程的虚拟地址空间分开管理。

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

Linux内存管理 的相关文章

随机推荐

  • 改变世界的五位顶级程序员!

    点击上方 Java基基 xff0c 选择 设为星标 做积极的人 xff0c 而不是积极废人 xff01 源码精品专栏 原创 Java 2020 超神之路 xff0c 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析网络应用框
  • 你知道ping命令是如何工作的吗?

    点击上方 Java基基 xff0c 选择 设为星标 做积极的人 xff0c 而不是积极废人 xff01 每天 14 00 更新文章 xff0c 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 xff0c 很肝 中文详细注
  • dashboard疏散主机提示报错:无法疏散主机...处理方法、openstack虚拟机状态卡在重启处理方法、openstack在数据库修改虚拟机状态的方法

    文章目录 dashboard疏散主机提示报错 无法疏散主机 处理方法 报错说明 状态卡在reboot状态 解决方法 登录nova数据库修改虚拟机信息 首先获取nova数据库的密码 登录nova数据库并做修改 验证信息是否修改成功 再次迁移并
  • 自学VUE(4)创建项目

    创建项目 1 检查电脑环境 node v npm v vue V cnpm v 2 创建项目 xff0c cd到桌面 xff0c 执行命令 xff1a vue init webpack firstVue 初始化一个项目 3 桌面获得一个项目
  • 前端请求后台报错400

    报错原因 xff1a 前端请求的字段名称或者字段类型和后台编写的实体类不一样 xff0c 或者前端提交的参数和后台需要的参数个数不匹配 xff0c 导致无法封装 xff0c 报错400 解决方法 xff1a 仔细对照前后端字段类型 xff0
  • Ubuntu终端文件管理工具ranger

    一 xff0c 安装 xff1a ubuntu使用apt get 安装 sudo apt get install ranger 二 xff0c 使用 ranger ranger 中有按键和命令两种操作方式 xff0c 按键是直接键入键盘上的
  • C# list根据字段生成排名

    需求分析 xff0c 我们要根据一个变量来生成排名 xff0c 变量数值相同则在同一名 xff0c 名数则跳过 xff0c 比如第一有两个 xff0c 那就不会有第二名 xff0c 直接到第三名 直接上代码 span class token
  • .net 6 web api项目添加日志(Serilog)管理,将日志输出到控制台、文件、数据库

    1 在nuget安装下面几个包 Serilog Serilog AspNetCore 用于日志输出到控制台 Serilog Formatting Compact 用于日志输出到mysql数据库 Serilog Sinks MySQL 用于日
  • GDB调试-新手笔记3

    ldd命令 43 readelf ldd 在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持 xff0c 以确保指定的命令在独立的系统内可以可靠的运行 ldd stack0 可以找到stack0程序使用的共享库 xff0c l
  • Spring源码分析(一)Spring的环境搭建与架构

    目录 一 Spring的基本信息1 1 Spring 概述1 2 架构 二 环境搭建2 1 gradle的安装与配置2 2 Spring源码构建 本图 xff1a 川西旅游中拍摄的 xff08 业余摄影 xff09 官网 xff1a Hom
  • RNA-seq:转录组数据分析处理(上)

    RNA seq xff1a 转录组数据分析处理 xff08 上 xff09 目录 RNA seq xff1a 转录组数据分析处理 xff08 上 xff09 一 流程概括二 准备工作1 fastq测序文件2 注释文件和基因组文件的获取 三
  • STM32串口数据接收 --环形缓冲区

    STM32串口数据接收 环形缓冲区 环形缓冲区简介 在单片机中串口通信是我们使用最频繁的 xff0c 使用串口通信就会用到串口的数据接收与发送 xff0c 环形缓冲区方式接收数据可以更好的保证数据丢帧率第 在通信程序中 xff0c 经常使用
  • Linux下驱动开发

    Linux下驱动开发 1 简介 驱动 xff0c 是指驱动计算机里软件的程序 驱动程序全称设备驱动程序 xff0c 是添加到操作系统中的特殊程序 xff0c 其中包含有关硬件设备的信息 驱动程序是操作系统与硬件连接的桥梁 设备驱动最通俗的解
  • openstack单网卡使用多IP说明、openstack虚拟机IP通网关但同网段IP不互通处理方法

    文章目录 openstack虚拟机IP通网关但同网段IP不互通处理方法问题描述处理方法 Openstack中单网卡使用多ip openstack虚拟机IP通网关但同网段IP不互通处理方法 问题描述 云平台的防火墙虚拟机部署再我们云平台上 x
  • Collections.singletonList使用方法

    方法注释 应用 xff1a 这个方法主要用于只有一个元素的优化 xff0c 减少内存分配 xff0c 无需分配额外的内存 xff0c 可以从SingletonList内部类看得出来 由于只有一个element 因此可以做到内存分配最小化 x
  • 如何修改电脑的MAC地址(手把手更改)

    打开控制面板 xff0c 显示如下 xff0c 然后点击 网络和Internet xff08 windows 43 r xff0c 然后输入control xff0c 按下回车 xff0c 即可打开控制面板 xff09 点击完 网络和Int
  • evo的快速安装Ubuntu 18.04

    由于一键安装成功后打开轨迹后报错 xff1a ERROR evo module evo main traj crashed no logfile written disabled 不会解决 xff0c 索性直接用源码安装方式 xff1a 如
  • 基于 SpringBoot + Vue 的音乐网站系统(源代码+数据库+思路文档)

    一 系统介绍 本项目分为管理员与普通用户两种角色 管理员角色包含以下功能 xff1a 后台对用户 歌曲 歌手 歌单信息的管理 用户角色包含以下功能 xff1a 音乐播放用户登录注册用户信息编辑 头像修改歌单打分歌单 歌曲评论歌单列表 歌手列
  • Linux下PS1设置

    PS1简介 PS1命令是linux系统中的一个全局变量 xff0c 用于定义用户命令行的字符显示 学名为 xff1a 默认提示符 盲猜Power Shell 1 PS1变量 span class token comment shell查看变
  • Linux内存管理

    Linux中的程序都是在进程中执行的 xff0c 而每个进程都有自己的虚拟地址空间 xff0c 进程中的内存操作 xff0c 比如访问 xff0c 插入数据都是在这块虚拟地址空间上操作的 虚拟地址空间 虚拟地址空间是一个进程所使用的虚拟内存