内存管理

十问 Linux 虚拟内存管理 (glibc) (二)

僤鯓⒐⒋嵵緔 提交于 2019-12-04 23:41:07
版权声明:本文由陈福荣原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/184 来源:腾云阁 https://www.qcloud.com/community 接上篇: 十问 Linux 虚拟内存管理 (glibc) (一) 五.free 的内存真的释放了吗(还给 OS ) ? 前面所有例子都有一个很严重的问题,就是分配的内存都没有释放,即导致内存泄露。原则上所有 malloc/new 分配的内存,都需 free/delete 来释放。但是, free 了的内存真的释放了吗? 要说清楚这个问题,可通过下面例子来说明。 初始状态:如图 (1) 所示,系统已分配 ABCD 四块内存,其中 ABD 在堆内分配, C 使用 mmap 分配。为简单起见,图中忽略了如共享库等文件映射区域的地址空间。 E=malloc(100k) :分配 100k 内存,小于 128k ,从堆内分配,堆内剩余空间不足,扩展堆顶 (brk) 指针。 free(A) :释放 A 的内存,在 glibc 中,仅仅是标记为可用,形成一个内存空洞 ( 碎片 ) ,并没有真正释放。如果此时需要分配 40k 以内的空间,可重用此空间,剩余空间形成新的小碎片。 free(C) : C 空间大于 128K ,使用 mmap 分配,如果释放 C ,会调用

linux vmstat命令

时光毁灭记忆、已成空白 提交于 2019-12-04 08:45:08
mstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。 物理内存和虚拟内存区别 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间( Swap Space )。 作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。 linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。 要深入了解linux内存运行机制,需要知道下面提到的几个方面: 首先,Linux系统会不时的进行页面交换操作

Python变量的理解与内存管理

只愿长相守 提交于 2019-12-04 06:11:15
Python变量与内存管理  –与C语言中的变量做对比,更好的理解Python的变量。 变量 变量在C语言中   全局变量:其存放在内存的静态变量区中。   局部变量:代码块中存放在内存的代码区当中,当被调用后存放在内存栈区。 1 而Python的变量存储,则是使用类似堆的方式管理内存,由Python内部机制统一分配回收内存。 Python中的变量与变量存储–引用与对象   Python作为OOP(面向对象)编程,一直信奉着一个信条,就是万物皆对象。   所谓对象,它可以看成经过一系列的抽象以后,将具有共性的一类物体进行实例化(具象化)的个体,就如同我们每个人就是人类里面的一个对象。 1 class A(): 2 name = "123" 3 def __init__(self): 4 pass 5 6 def funa(self): 7 pass 8 def funa(): 9 pass 10 11 if __name__ == "__main__": 12 Fun = funa 13 Variable = 1 14 ClassA = A() 15 ListA = [1,2,3] 16 DictA = {'d':1,'e':2} 17 TupleA = (1,2,3) 18 Str = "python" 19 print(type(Fun)) 20 print(type

分页内存管理——虚拟地址到物理地址的转换【转】

大城市里の小女人 提交于 2019-12-04 06:05:27
转自: https://blog.csdn.net/qq_39755395/article/details/78380942 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39755395/article/details/78380942 引子: 这是逻辑地址(虚拟地址),包括程序中打印的变量地址显示的都是逻辑地址,并不是内存空间上的物理地址。 每条指令在被执行时,读取操作数时需要给出操作数所在的内存地址,这个地址不能是物理主存地址,因为该程序在哪种硬件设置的机器上运行并不能事前确定,那操作系统就不能在此给出对应于某台机器的物理地址。 一、物理内存和虚拟内存 我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存条而获得的内存空间,主要作用是在计算机运行时为操作系统和各种程序提供临时储存。 2.虚拟内存:对内存架构(内存、缓存、硬盘)进行管理(内存管理系统)的一种手段。简单理解就是在硬盘上划分出一块区域作为内存使用。 2.1 对于用户: 计算机主要面向的是对操作系统等计算机知识几乎没有了解的普通大众,他们大多是不了解什么主存外存的,所以为了方便用户的使用,就有必要使得程序不管是位于内存架构的哪个层次,对于用户来说都是一样的

深入了解tcmalloc(一):windows环境下无缝拦截技术初探

柔情痞子 提交于 2019-12-04 02:16:31
概述: 又到了一个总结提炼的阶段,这次想具体聊聊游戏引擎中使用的内存管理模块 tcmalloc 组件的使用心得。项目的前期曾经遇到过内存瓶颈,特别是 windows 系统下的客户端程序在经历长时间运行之后会出现内存占用率很高疑似泄漏的现象,排查了很久都没有找到原因,甚至一度无法定位问题出自游戏脚本层还是引擎层,后来在引擎中链接了 tcmalloc 组件,通过实时 dump 程序的内存信息最终找出了泄漏的元凶。 tcmalloc 的另一个优势就是通过高效率内存分配来提高游戏运行时性能,不得不说在使用 tcmalloc 之后,整个游戏的稳定性和效率都有了很大的提升。为了今后更有效和稳定地使用 tcmalloc 组件,就在这里深入剖析一下这个神器。 Tcmalloc 是 Google Perftools 中的一个组件,提供一整套高效健壮的内存管理方案,比传统 glibc 的内存分配和释放要快数倍;其次,基于 tcmalloc 之上的 heapprofiler 可以实时 dump 程序中 heap 的使用信息,是一个很好的检测内存泄漏的辅助工具;同时 tcmalloc 的使用又是极其方便,只需要在编译时增加一个链接选项,就可以无缝拦截 (patch) 原生操作系统运行库中的内存分配和释放接口,而无需修改已经完成的项目工程代码,大大减少移植整合的成本。 在 windows 平台下,

电脑的虚拟内存介绍

霸气de小男生 提交于 2019-12-04 01:57:55
虚拟内存是计算机系统内存管理的一种技术。电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽,内存空间不足会影响程序的正常运行。 为解决该问题,Windows中运用了虚拟内存 技术,即 匀出一部分硬盘空间来充当内存使用 。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 温馨提示: 工具中”初始大小” 建议设置为您电脑内存,”最大值”可以根据您的使用需要设置; 虚拟内存会占用硬盘空间,根据硬盘剩余空间酌情设置; 如果您当前使用的是固态硬盘+机械硬盘(SSD+HDD )的硬盘组合, 虚拟内存设置在SSD固态硬盘分区上效果会比设置在机械硬盘分区效果好 ; 操作完成后需要将电脑重启后才能生效 ; 来源: https://www.cnblogs.com/chenshc/p/11827573.html

【原创】(十)Linux内存管理 - zoned page frame allocator - 5

帅比萌擦擦* 提交于 2019-12-04 01:36:23
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 本文将讨论 memory reclaim 内存回收这个话题。 在内存分配出现不足时,可以通过唤醒 kswapd 内核线程来异步回收,或者通过 direct reclaim 直接回收来处理。在针对不同的物理页会采取相应的回收策略,而页回收算法采用 LRU(Least Recently Used) 来选择物理页。 直奔主题吧。 2. LRU和pagevec 2.1 数据结构 简单来说,每个 Node 节点会维护一个 lrvvec 结构,该结构用于存放5种不同类型的 LRU链表 ,在内存进行回收时,在 LRU链表 中检索最少使用的页面进行处理。 为了提高性能,每个CPU有5个 struct pagevecs 结构,存储一定数量的页面(14),最终一次性把这些页面加入到 LRU链表 中。 上述的描述不太直观,先看代码,后看图,一目了然! typedef struct pglist_data { ... /* Fields commonly accessed by

c++内存管理5-虚拟内存4区结构图

只愿长相守 提交于 2019-12-04 00:09:04
  我们常说的32位系统为每个进程分配4G虚拟内存空间(而MMU负责把这些个4G虚拟内存映射到实际内存条的物理内存),其实只有0~3G才是真正完全属于进程本身,是我们所说的用户区;3~4G这1G是所有进程间共享的,是我们所说的内核区,我们的程序是无法直接访问内核区的。 #include<stdio.h> int a; //未初始化全局区 .bss int b=1; //已初始化全局区 .data static int c=2; //已初始化全局区 .data const int d=3; //只读数据段,也叫文字常量区 ro.data, d的值不能被修改 int main(void) { int e=4; //栈区 static int f=5; //已初始化全局区 const int g=6; //栈区,不能通过变量名修改其值,但可通过其地址修改其值 int *p=malloc(sizeof(int)) //指针变量p在栈区,但其所指向的4字节空间在堆区 char *str="abcd"; //字符串“abcd”存在文字常量区,指针变量str在栈区,存的是“abcd”的起始地址 return 0; }   地方教材上常说:“全局变量在编译时分配空间,局部变量在运行时分配空间”,这在像vs这种集成式开发工具中,我们写个简单的程序,直接点个“运行”,编译、运行一步到位,很容易理解