当前位置: 首页 > news >正文

【操作系统笔记】内存分配

内存对齐

在这里插入图片描述
在这里插入图片描述

问题:为什么需要内存对齐呢?

  • 主要原因是为了兼容,为了让程序可以运行在不同的处理器中,有很多处理器在访问内存的时候,只能从特定的内存地址读取数据。换个说法就是处理器每次只能从内存取出特定个数字节的数据。

  • 如果不做内存对齐的话,CPU 访问一个变量的值有可能需要跨两个内存块(假设每4字节为一块)就需要访问 2 次,损耗 CPU 性能,内存对齐后,CPU 只需要一次访问就可以读取 4 字节数据。

比如说一次只能读取 4 个字节的数据,那么处理器只能访问的地址必须是 4 的倍数,比如 0x00x40x80x12等等。

在这里插入图片描述

如果内存不对齐的话,会有什么影响?

  • 那一个变量的值可能跨两个内存块,那么 CPU 就需要访问两次,损耗 CPU 性能。

在这里插入图片描述
在这里插入图片描述

关于内存对齐需要知道的事情:

  • 如果程序只是运行在 AMD64 和 x86 处理器上,是不需要考虑内存对齐的

    因为 AMD64 处理器可以读取任何小于等于 8 字节的变量,x86 可以读取任何小于等于 4 字节的变量。

  • 但是,为了使的程序可以兼容其他的处理器,一般都会考虑内存对齐

  • 采用了内存对齐技术,即保证无论 CPU 一次取几个字节(1、2、4、8、16…)只要所取的变量大小小于一次可读取的字节数,就不会访问两次内存。

用户态虚拟内存分配和释放

malloc 和 free

mallocfree 用于程序在用户态下、申请释放堆内存,所谓的堆内存,其实就是运行时堆区域的一段虚拟地址空间。虚拟地址数量也是有限的,不合理分配的话会很快的就用完了,也就发生 OOM 了。

提高虚拟内存的利用率,也就是用过的虚拟地址,释放后,可以重复分配使用。分配和释放的时间复杂度,吞吐率要高。

申请堆内存的方法有两个:

  • ① mmap:通过增加内存映射来申请堆内存
  • ② sbrk: 通过改变 brk 来申请堆内存

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mallocfree 的全流程解析:https://www.processon.com/view/link/62384ce70e3e74074cf4ebae

用户态和内核态内存分配

用户态通过mmapmalloc申请分配得到的内存都是虚拟内存地址,只有当 CPU 访问该地址时,发现对应的物理页号不存在,发生缺页异常,此时才会真正的分配物理内存,这是由缺页异常处理程序分配物理页号到虚拟页表来完成的。

在这里插入图片描述

http://www.lryc.cn/news/171366.html

相关文章:

  • Web 整合
  • hasOwnProperty 方法解析
  • 使用 nohup 运行 Python 脚本
  • Django:五、登录界面实现动态图片验证码
  • GPT,GPT-2,GPT-3,InstructGPT的进化之路
  • firefox_dev_linux下载安装配置(部分系统自带包请看结尾)
  • vim缓存-交换文件
  • Hive 优化建议与策略
  • CentOS 7.5 centos failed to load selinux policy 错误解决方法
  • 注入之SQLMAP(工具注入)
  • Linux学习资源Index
  • 什么是SVG(可缩放矢量图形)?它与普通图像格式有何不同?
  • 求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows
  • React TypeScript 定义组件的各种方式
  • 互联网摸鱼日报(2023-09-20)
  • AWS入列CNCF基金会
  • 岭回归与LASSO回归:解析两大经典线性回归方法
  • 数学建模——微分方程介绍
  • Minio入门系列【7】Spring Boot集成Minio
  • 抖音视频下载.py(23年9月份可用)
  • 项目基本搭建流程
  • 学习pytorch11 神经网络-非线性激活
  • Jenkins学习笔记2
  • 自动化测试:yaml结合ddt实现数据驱动!
  • 高效管理,轻松追踪——Chrono Plus for Mac任务管理工具
  • python项目2to3方案预研
  • MongoDB 是什么和使用场景概述(技术选型)
  • 打印 pyspark.sql.dataframe.DataFrame 有哪些列
  • 什么是虚拟DOM(Virtual DOM)?它在前端框架中的作用是什么?
  • QT实现简易时钟