随笔分类 - 编译/内存分配释放
摘要:在Linux下面,查看一个进程的内存使用我们可以下面的命令来实现,只需把其中的[pid]换成进程实际的pid。 cat /proc/[pid]/status 为了方便,我们把查找pid和看内存整合成一条命令,后面这将是我们唯一的测试工具。 cat /proc/`ps -ef|grep hello |
阅读全文
摘要:shared_ptr允许多个指针指向同一个对象;unique_ptr则"独占"所指向的对象。 所以看使用者的意图,想这个对象咋么用。 weak_ptr只是是辅助类,它是一种弱引用。本质应该没啥作用,它可以为强引用提前占位,但它的存在不会占据引用计数。 比如enable_shared_from_thi
阅读全文
摘要:基本这个错误基本就是出现在shared_from_this调用过程中。 或者对应对象不是用make_shared分配,或者对应的对象已经释放了(实际释放后也不一定就会报错,但是当使用valigrind检查内存时,释放内存后会把内存重置,此时会检测到weak_ptr应该设置的标识不对而报错。)。
阅读全文
摘要:本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能。这时候服务端的任务是:将服务端主机磁盘中的文件不做修改地从已连接的socket发
阅读全文
摘要:0.多重继承情况下,对象创建时会生成多个续表指针,用于转换成不同基类时的操作。 为了实现不同基类都能通过偏移找到对应虚表,这种对象在转换成不同基类型时也就进行指针的偏移。具体内存布局可以参考:多重继承和void*的糗事 1.在内存释放时delete可以对多重继承对象的不同类型指针进行释放。 那del
阅读全文
摘要:原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能
阅读全文
摘要:一、找到dmaolloc的内存内存释放的机制总结,也很容易反推出其内存分配的机制,挺好的转一下(转自:http://blog.chinaunix.net/uid-796091-id-2035309.html) 1. 不考虑TRIM_FASTBINS的影响,对于小于64个字节(FASTBIN_THRE
阅读全文
摘要:在实验过程中,有些同学总对共享内存的一些概念弄不清,特别总结了下: 所谓共享内存就是多个进程间共同使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的虚空间中来实现的。由于映射到不同进程的虚空间中,不同进程可以直接使用,不需要进行内存的复制,所以共享内存的效率很高。 共享内存分2种: 1
阅读全文
摘要:Jemalloc 不仅实现了一种通用的malloc, 还能利用它来做内存分析和监控/调优等. 这里介绍如何利用jemalloc来检测内存泄漏问题. 并且利用LD_PRELOAD环境变量, 可以做到不需要源代码, 将jemalloc库嵌入到可执行程序中, 从而用jemalloc去malloc内存, 并
阅读全文
摘要:期初现象:malloc一块内存,读写操作时发生segmentation falt。一般来讲malloc倘若失败应该抛出异常,所以malloc返回一个指针后,这个指针应该都是可用的,况且是进行读操作。 所以遇到这个问题时感觉很奇怪。 继续现象:经过地址打印确认该地址是前面操作过的一个地址。说明地址不在
阅读全文
摘要:实际和之前的free命令是有点类似的。 不过free更专注应用,这个更专注理解。 概述 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RE
阅读全文
摘要:转载目的,主要是为了理解lVIRT虚拟内存、RES常驻内存、共享内存SHR、SWAP和实际程序应用如何对应的。 在Linux命令行中执行top命令,可以查询到所有进程使用的VIRT虚拟内存、RES常驻内存和共享内存SHR。 那么,什么是VIRT虚拟内存、RES常驻内存和共享内存SHR?我们编写的Li
阅读全文
摘要:X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64;正是由于能向后兼容,AMD公司打了一场漂亮翻身战。导致Intel不得不转而生产兼容AMD64的CPU。这是IT行业以弱胜强的
阅读全文
摘要:一:malloc钩子函数 static void* (* old_malloc_hook) (size_t,const void *);static void (* old_free_hook)(void *,const void *);static void my_init_hook(void);
阅读全文
摘要:Linux的虚拟内存管理有几个关键概念: Linux 虚拟地址空间如何分布?malloc和free是如何分配和释放内存?如何查看堆内内存的碎片情况?既然堆内内存brk和sbrk不能直接释放,为什么不全部使用 mmap 来分配,munmap直接释放呢 ? Linux 的虚拟内存管理有几个关键概念: 1
阅读全文
摘要:原文转载自:http://blog.csdn.net/yutianzuijin/article/details/41912871今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表 缺失。这方面的资料比较贫乏,而且...
阅读全文
摘要:SS, SP, BP 三个寄存器 SS:存放栈的段地址;SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址;BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式...
阅读全文
摘要:下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator new和operator delete,在重载的operator new里和operator delete里记录下内存申请和释放信息,从而判断内存使用情况。下面一步步介绍它的实现!1、全局new/delete的重载 先看一下重载new/delete的规则: 重载的operator new的参数个数任意,但第一个参数必须是size_t类型的,返回值必须是void*。重载operator delet
阅读全文
摘要:系统从堆区每分配一块内存时,都会额外多分配一些,用来记录这块内存的信息,在回收时使用。如果小块堆区内存大量分配,则耗费在记录信息用的内存将会很可观。Linux 使用GNU-C库进行内存的分配与回收。对于小于128K的内存块,GNU-C库是自己进行管理的,以便减少内存碎片,提高分配效率。而且一经分配,
阅读全文
摘要:$ra寄存器中存入的是pc的值(程序运行处的地址),调用函数时,在跳转前,必须保存当前地址(pc的值),以便后来返回。jal $ra 保存后跳转,jr $ra,返回到跳转前,通过$ra保存进入上层栈地址。jal 直接跳转指令,并带有链接功能,指令的跳转地址在指令中,跳转发生时要把返回地址存放到R31寄存器(ra)中。jr 使用寄存器的跳转指令,跳转地址在寄存器中。所以根据ra定位core位置时,可以直接在ra位置前找jal便可以找到当前正在执行的函数。转自http://user.it.uu.se/~justin/Teaching/NewDarkSlides/lecture5.pdf• As i
阅读全文