虚拟内存与物理内存与内存碎片-杂谈

news/2024/10/23 14:25:59/

内存杂谈

虚拟内存与物理内存

为什么要有虚拟内存???

1.每个进程有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址(每个进程都假设自己看到的是完整的从0开始的内存)
2.程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。(如linux swap 分区)

如何实现虚拟内存???

虚拟内存与物理内存存在映射关系, 这样"逻辑上的虚拟内存连续"在"实际物理内存上"其实是不连续的.
虚拟内存通过 MMU(映射算法)与页表组成, MMU操作的最小基本单位为 页.

内存碎片

现代OS如何避免内存碎片???

基础

  1. 页,页面,与框
    https://blog.csdn.net/displayMessage/article/details/80905810
  2. 页中断

Linux 通过 buddy system 避免内存碎片

即使合并内存, 减少内存碎片的产生, 详情百度即可

什么是内存碎片

碎片只会在虚拟内存中产生,是不会映射到物理内存上的。
碎片只会在虚拟内存中产生,是不会映射到物理内存上的。
碎片只会在虚拟内存中产生,是不会映射到物理内存上的。
重要的事说三遍
采用分区式存储管理的系统,在储存分配过程中产生的、不能供用户作业使用的主存里的小分区称成“内存碎片”。内存碎片分为内部碎片和外部碎片。

内存的静态分配与动态分配

内存分配有静态分配和动态分配两种。静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态分配, 动态内存会导致内存碎片的产生。

内部碎片与外部碎片

内部碎片: 众所周知,内存需要对齐(起点落在 4 的倍数上), 所以如果申请27byte内存实际上会给分配28byte内存。 eg: linux 最小页面长度为 4096 byte, 用 c 语言malloc 一个 char(1byte) 的空间, 则必须最少申请 4k 的空间吗??
外部碎片: 频繁的申请与释放内存,会导致有很多不连续的可用的小内存在已分配的页面中, 此时如果申请一片较大的内存(申请的内存是连续的),即使这些小内存加起来 > 要申请的内存,也不能申请成功(因为这些小的可用内存不是连续的).

c/c++ 如何避免内存碎片

所有语言都会有内存碎片,内存碎片只能减少而不能避免.
减少内存碎片可以用第三方库来实现.

  1. 少用动态内存分配的函数(尽量使用栈空间)
  2. 分配内存和释放的内存尽量在同一个函数中
  3. 申请内存的大小尽量为 2^n, 以避免内部内存碎片, 而不要反复申请小内存(少进行内存的分割, 得益于os用 buddy system来管理内存)
  4. 不要频繁的申请小内存
  5. 尽可能少地申请空间。
  6. 尽量少使用堆上的内存空间~
  7. 做内存池,也就是自己一次申请一块足够大的空间,然后自己来管理,用于大量频繁地new/delete操作。(我们可以推断出 自动回收机制也是有弊端的)

eg: linux 最小页面长度为 4096 byte, 用 c 语言malloc 一个 char(1byte) 的空间, 则必须最少申请 4k 的空间吗??
进程占有逻辑上的全部内存(虚拟内存),malloc 占用的是堆区的空间 . 在申请小内存时(以 glibc 中 小于128kb时), 仅仅移动brk指针向高地址
//会在第一次使用时产生页中断,才建立映射关系(延时映射机制).
答: 只用16byte(或许包含了内存对齐和其他的数据),远远没有使用 4kb 的内存.(这个问题目前还没有想出来答案)

gcc中 vector 的默认扩增倍数k为什么为2而不是常量??? 2是否是最优解
  1. 为什么不是常量???
    答: 进行 n 次push_back , 在内存复制方面,k 为倍数要比k为常量的时间复杂度小的多.

  2. 用 2 有什么好处???
    答:

  3. 2 倍不是最优解???
    答:倍数为1.618为最优,由于vector使用copy扩增会重新申请一块大的内存然后再, 将对象复制进新的内存,然后释放掉原来的内存。那么在下次扩充的时候,由于每次申请的都比之前所有释放的空间加起来都大(k==2的特性),就导致之前释放的的内存不能用, 详情见:
    https://www.zhihu.com/question/36538542/answer/67929747

//2. 是为了防止内部内存碎片的发生. 内存以2^n对齐, 如果不为2^n,则


http://www.ppmy.cn/news/541689.html

相关文章

虚拟存储器与虚拟内存

1.为什么需要虚拟存储器? 程序在os中能够执行,需要经过,编译-链接-装入 在没有虚拟存储器之前,源程序在gcc –o 后生成的文件是可执行目标程序a.out,每条指令都有一个逻辑地址 32位。它存在硬盘上。 要执行时&#…

虚拟内存管理加拓展(全网最细)

写在前面:我是【程序员宝藏】的宝藏派发员,致力于创作原创干货。我热爱技术、热爱开源与分享,创作的【计算机基础面试问题】系列文章和【计算机基础主干知识】系列文章广受好评!后期会创作更多优质原创系列文章!如果您…

虚拟内存空间

每一个进程都会对应一个虚拟地址空间,32位操作系统会为每个进程分配4G(2的32次方)的虚拟地址空间,而MMU(Memory Management Unit,内存管理单元)负责把这4G虚拟内存映射到实际的物理内存中。这4G…

Virtualbox 扩展虚拟磁盘空间大小

有时我们在使用Virtualbox虚拟机时,分配给虚拟机的磁盘空间太小,导致后期需要扩容,通过以下方法可以扩展磁盘空间。 增强虚拟磁盘空间容量 扩展前最好把所有快照删除掉! 方法一:扩展磁盘空间 打开Virtualbox所在的…

【Linux】Linux权限的概念、Linux权限管理、文件类型和访问权限的设置、粘滞位介绍

文章目录 1.Linux权限的概念2.Linux权限管理2.1文件访问者的分类2.2文件类型的访问权限2.3文件权限值的表示方法2.4文件访问权限的相关设置方法 3.目录的权限4.粘滞位 1.Linux权限的概念 在生活中,一件事情是否允许被一个人做,就是叫做权限,权…

深入虚拟内存(Virtual Memory,VM)

深入虚拟内存(Virtual Memory,VM) 我们应该知道物理内存(Physical Memory)指的是硬件上的内存,即 RAM。它通常指的是插在主板上的内存条,给进程提供临时数据存储的设备。因为 CPU 可以直接从物…

虚拟内存概念3

1 物理内存 1.1 物理内存概述 1.2 直接使用物理内存的问题 1.2.1 多进程地址布局困难 1.2.2 进程地址空间小 1.2.3 程序链接不统一 2 虚拟内存 2.1 引入虚拟内存的目的 2.2 局部性原理与虚拟内存 2.3 虚拟内存到物理内存的映射 2.3.1 概述 2.3.2 页面分配与映射 2.…

Virtual Memory(虚拟内存)

转载请注明出处:http://blog.csdn.net/c602273091/article/details/53529384 Why VMVM TranslationSome tips 18-600快要考试了,在博客中把学过的东西整理一下思路,写到博客里也好以后自己有空看看,希望对以后的人也有所帮助。…