上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc、jemalloc;对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池;此外在windows下使用可使用其自带的内存分配方式;具体的第三方库可以参阅:http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml;目前我们主要的精力尽可能在Chromium浏览器中base公共通用库的主要内容上,所以不再详细对那两个第三方内存分配库进行分析、研究,可留待以后研究;以下针对base下的allocator中的allocator.vcxproj讨论。

  首先,该项目中主要包括三个文件:allocator.gyp、allocator_shim.h、allocator_shim.cpp;

  allocator.gyp:一个用以构建和编译当前工程的文件;具体GYP构建工具可以查阅相关资料;我们将重点关注另外两个文件。

  allocator_shim.h:SetupSubprocessAllocator安装子进程内存分配器,从环境中取字符串,获取环境变量的值,用以设置、转换指定的分配器并设置会环境中,其默认值为TCMALLOC,可修改;TCMallocDoMallocForTest,ExcludeSpaceForMarkForTest,ExcludeSpaceForMarkForTest主要用来暴露一些操作tcmalloc相关函数,测试用的。

  allocator_shim.cpp:主要定义了分配器装换宏、分配器类型枚举:TCMALLOC、JEMALLOC、WINHEAP、WINLFH;其中前两个为第三方库分配器,后两个为windows下的分配器;WINHEAP为微软默认的标准分配器;WINLFH为低碎片堆分配器,详情可见:http://www.cnblogs.com/whyandinside/archive/2010/06/30/1768348.html或其他相关资料;另外对常见的malloc、free、realloc、_aligned_malloc、_aligned_free、_msize、运行时堆初始化_heap_init被重新定义,根据分配器类型,调用相应的分配器分配、释放、重分配策略;

  此外allocator下的工程libcmt中,仅包含allocator.gyp和prep_libc.py,其中allocator.gyp已作介绍,prep_libc用以在生产目标文件了以后,连接前移除系统自带的那些操作内存分配的接口如:malloc、free、realloc、new、delete、new2等,使得当用户在其他工程使用该生成的库libcmt.lib时,使用的是该库提供的接口、分配策略(具体操作细节尚且不太明确,请见谅)。

  allocator工程中还包括分配器测试工程、tcmalloc分配测试工程以及分配器扩展工程等,此处不再详细叙述。下一节将学习base公共通用库的containers,堆栈、列表、集合、以及Most Recently Used cache(最近使用缓存模板)。

Google之Chromium浏览器源码学习——base公共通用库(二)的更多相关文章

  1. Google之Chromium浏览器源码学习——base公共通用库(三)

    本节将介绍base公共通用库中的containers,其包含堆栈.列表.集合.以及Most Recently Used cache(最近使用缓存模板). linked_list.h:一个简单的列表类型 ...

  2. Google之Chromium浏览器源码学习——base公共通用库(一)

    Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...

  3. Google之Chromium浏览器源码学习——base公共通用库(四)

    本文将介绍debug调试相关的内容,包括调试器.性能分析.堆跟踪.跟踪事件等: alias.h:Alias函数,提供防止载微软的编译器优化某参数变量的操作,内部通过#pragma optimize(& ...

  4. Golang源码学习:调度逻辑(二)main goroutine的创建

    接上一篇继续分析一下runtime.newproc方法. 函数签名 newproc函数的签名为 newproc(siz int32, fn *funcval) siz是传入的参数大小(不是个数):fn ...

  5. Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁

    上一篇文章提到AQS是基于CLH lock queue,那么什么是CLH lock queue,说复杂很复杂说简单也简单, 所谓大道至简: CLH lock queue其实就是一个FIFO的队列,队列 ...

  6. ThinkPHP5.0源码学习之缓存Cache(二)

    一.使用Cache类 TP5.0框架默认使用的是File文件缓存驱动,可以修改全局配置文件convention.php中的type,将其改为Redis,这样使用的就是Redis缓存驱动了.

  7. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  8. Java并发包源码学习之AQS框架(一)概述

    AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...

  9. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

随机推荐

  1. Android只能动态注册的广播Action

    只能动态注册的广播(部分): android.intent.action.SCREEN_ON android.intent.action.SCREEN_OFF android.intent.actio ...

  2. jQuery插件 -- Cookie插件jquery.cookie.js(转)

    Cookie是网站设计者放置在客户端的小文本文件.Cookie能为用户提供很多的使得,例如购物网站存储用户曾经浏览过的产品列表,或者门户网站记住用户喜欢选择浏览哪类新闻. 在用户允许的情况下,还可以存 ...

  3. host 文件

    艾玛,果然一个破的小问题也能纠结好久!不过终于过去了... 1. 机器上的host文件目录一般是  /etc/hosts 主要可能会涉及一些网站的安全访问,把网站加入hosts也就意味着 加入了白名单 ...

  4. 【bzoj3505】 Cqoi2014—数三角形

    http://www.lydsy.com/JudgeOnline/problem.php?id=3505 (题目链接) 题意 给定一个n*m的网格,请计算三点都在格点上的三角形共有多少个. Solut ...

  5. hoj 2634 How to earn more

    有m个项目和n个员工,做项目i可以获得Ai元,但是必须雇用若干指定的员工.雇用员工j需要Bj元,一旦雇用便可以参与多个项目.问最大收益. 1<=M,N<=100. 最小割. 源点向每个项目 ...

  6. jQuery Colorpicker Spectrum api 中文 文档 属性 事件 方法

    jQuery Colorpicker Spectrum 所需的CSS和JavaScript文件: <script src='spectrum.js'></script> < ...

  7. js 时间操作和随机数操作

    function Data() { var date = new Date(); var year = date.getFullYear(); ; var strDate = date.getDate ...

  8. [转]js获取域名、url、url参数值

    //获取域名host1 = window.location.host;host2 = document.domain; //获取页面完整地址url = window.location.href; 获取 ...

  9. [Linux & Mysql] Linux下Mysql的基本操作

    1. 连接Mysql 1.1 连接到本机上的Mysql 键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码 ...

  10. 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法

    1. BigDecimal 类型数据 的创建,构造函数 有 public BigDecimal(BigInteger intVal, long val, int scale, int prec); p ...