一等一网站,网络公司网站官网,如何联系网站,百度seo按天计费内存对齐 问题#xff1a;为什么需要内存对齐呢#xff1f; 主要原因是为了兼容#xff0c;为了让程序可以运行在不同的处理器中#xff0c;有很多处理器在访问内存的时候#xff0c;只能从特定的内存地址读取数据。换个说法就是处理器每次只能从内存取出特定个数字节的数…内存对齐 问题为什么需要内存对齐呢 主要原因是为了兼容为了让程序可以运行在不同的处理器中有很多处理器在访问内存的时候只能从特定的内存地址读取数据。换个说法就是处理器每次只能从内存取出特定个数字节的数据。 如果不做内存对齐的话CPU 访问一个变量的值有可能需要跨两个内存块假设每4字节为一块就需要访问 2 次损耗 CPU 性能内存对齐后CPU 只需要一次访问就可以读取 4 字节数据。
比如说一次只能读取 4 个字节的数据那么处理器只能访问的地址必须是 4 的倍数比如 0x0、0x4、0x8、0x12等等。 如果内存不对齐的话会有什么影响
那一个变量的值可能跨两个内存块那么 CPU 就需要访问两次损耗 CPU 性能。 关于内存对齐需要知道的事情 如果程序只是运行在 AMD64 和 x86 处理器上是不需要考虑内存对齐的 因为 AMD64 处理器可以读取任何小于等于 8 字节的变量x86 可以读取任何小于等于 4 字节的变量。 但是为了使的程序可以兼容其他的处理器一般都会考虑内存对齐 采用了内存对齐技术即保证无论 CPU 一次取几个字节1、2、4、8、16…只要所取的变量大小小于一次可读取的字节数就不会访问两次内存。
用户态虚拟内存分配和释放
malloc 和 free
malloc 和 free 用于程序在用户态下、申请和释放堆内存所谓的堆内存其实就是运行时堆区域的一段虚拟地址空间。虚拟地址数量也是有限的不合理分配的话会很快的就用完了也就发生 OOM 了。
提高虚拟内存的利用率也就是用过的虚拟地址释放后可以重复分配使用。分配和释放的时间复杂度吞吐率要高。
申请堆内存的方法有两个
① mmap通过增加内存映射来申请堆内存② sbrk: 通过改变 brk 来申请堆内存 malloc 和 free 的全流程解析https://www.processon.com/view/link/62384ce70e3e74074cf4ebae
用户态和内核态内存分配
用户态通过mmap和malloc申请分配得到的内存都是虚拟内存地址只有当 CPU 访问该地址时发现对应的物理页号不存在发生缺页异常此时才会真正的分配物理内存这是由缺页异常处理程序分配物理页号到虚拟页表来完成的。