一道关于性能方面的难题

PHizingHelen 2016-03-15 04:27:56
加精
直接进入主题:我有一个单例的类,在这个类里面,保存了很多以map或hashmap存放的超重资源。该单例类被其它线程访问,获取数据。目前的做法是这样的:
for (i = 0; i < 20; i++)
{
构造一个超重资源的临时变量;
加读锁
查找单例类,根据key查找value,把value整个拷贝给临时变量;
解读锁;
外面直接使用临时变量做其它操作;
}

上述流程已经实现了大部分的业务,现在从profile工具的结果来看,"把value整个拷贝给临时变量"占了大部分的性能,导致上述流程性能低下。必须找到一个简单而有效的方法,大面积改造这些现有代码。

另外说明的是,之所以用临时变量,并发是第一要素,第二要素是解锁之后的操作也是繁重的,放入锁内得不偿失。如果不复制到临时变量,比如直接从临界区传出指针,则面临着单例类在更新或删除资源时,有可能出现临界区外的指针失效而死机。
...全文
2234 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2016-03-30
  • 打赏
  • 举报
回复
class 超重资源 { // 具体属性 mutex m_ObjLock; // 每份超重资源一个锁,所有对超重资源的多线程访问由超重资源自己负责线程安全 }; for (i = 0; i < 20; i++) { 加读锁 查找单例类,根据key查找value,返回value的指针或引用; 解读锁; 外面直接使用value的指针或引用做其它操作; }
欧阳春晖 2016-03-26
  • 打赏
  • 举报
回复
我们不知道性能分析数据,不能进行判断
chehw_1 2016-03-26
  • 打赏
  • 举报
回复
建两个层级的引用计数,然后每次只传递指针。 先分析出value的结构体中具体是那些部分在复制时消耗资源,把结构体改写如下: struct A { int id; int a; ... int n; // 以上为轻量级资源 struct DATA_TYPE * heavy; // 在A中只保存重量级资源的指针,并对该指针添加引用计数 }; 0. 主线程用一个数组存储所有A结构体的指针,并对每个A的指针添加引用计数。例如: struct A * a[20] = { ... }; 1. 每次传递时,主线程(M)只将对应的A的指针传递给其他线程(T),线程(T)在加锁的情况下,将整个结构体复制到一个临时变量中,并同时将A指针和 a->heavy指针的引用计数分别 + 1,复制操作完成后再解锁; 2. 线程(T)处理完毕后,在加锁的状态下,将A指针和 a->heavy指针的引用计数分别 -1, 当发现某个指针的引入计数为0时,即释放(delete/free)该指针。 3. 当主线程的数据更新时, (a) 如果只涉及到轻量级数据的修改,那么直接操作即可(这些数据已经在同步状态下有了正确的拷贝)。 (b) 如果涉及到重量级资源的修改,那么先分配一份新内存new_pointer,拷贝数据至new_pointer中,然后在加锁的情况下, 另a->heavy = new_pointer, 同时将原heavy指针的引用计数-1。 (c) 如果涉及到数据删除,那么先分配一个新的A结构体,在加锁的情况下,替换原来的A指针,并将A指针的引用计数-1。
scy2510 2016-03-26
  • 打赏
  • 举报
回复
本来都觉得是不是要数据之类的操作的。
scy2510 2016-03-26
  • 打赏
  • 举报
回复
更多仅凭理论设想,请大神看看推理对不对? 本来都觉得是不是要数据之类的操作的。 想了一圈下来觉得最终还是在拷贝和繁重计算上。 超重数据的拷贝和繁重的计算的方式不改变的化,优化都只是假像,只际上是在考验硬件性能(含多核),最终输出结果都要那么久。 就好像反复从硬盘进行程序启动和退出过程,始终要那么久吧。 所以从两个方面来改善 从硬件资源出发 假设是单核的话,就不要拷贝出来了。 低优先级线程用于查找和计算,全过程完了之后,再放开资源(将资源锁成只读)。 高优先级线程用于修改,如果检查资源被锁,那么就将修改按指今(操作和数据)的方式缓存起来(可能会满)。 高优先级线程用于单独读取,先查找原始资源,然后再将缓存中的更新合并过来。 一个单独线程(优先级待定)用于同步缓存到原始资源。 如果上述合理的话,多核应该怎么平衡??以便充分利用硬件资源。 从优化拷贝和繁重计算出发 以单核为例 尽量避免繁重操作,不会完全避免。 还是不要拷贝了,拷贝是硬伤(或者类似OS中页面那样分页拷贝来缓解,也就是将数据存了两份) 让繁重计算化简,在每一份数据中增加额外记录,记录上次计算之后每一“步”的中间结果,每个中间结果对应称一个状态吧(1,,M,N)。下次进入计算前,检查当前数据块所作的修改(在修改时需要标记),分析需要更新那些计算,分析并直接进入到对应状态M开始计算,即每次计算之前,从最需要计算的入口开始计算,去掉不必要的重复的计算来提高平均计算速度。需要对数据的组织比较好。 还可以采用一个低优先级线程,在空闭时,对修改过的数据块进行刷新,使之计算为最新,以便下次需要计算时,直接提取结果即可。 请看看有没有可行性?
hellomworld 2016-03-26
  • 打赏
  • 举报
回复
马克学习一下
PHizingHelen 2016-03-25
  • 打赏
  • 举报
回复
To jiqiang01234:
我以为我实现的引用计数,类似于智能指针。

数据有多重,举个例子:
struct A
{
int id;
string name;
string desc;
vector<int> label;
string chinese_name;
string english_name;
string config;
string authcode;
vector<struct> icon;
map<string, strcut> infos;
...... // 还有很多
}
jiqiang01234 2016-03-25
  • 打赏
  • 举报
回复
引用 42 楼 PHizingHelen 的回复:
To jiqiang01234: 我以为我实现的引用计数,类似于智能指针。 数据有多重,举个例子: struct A { int id; string name; string desc; vector<int> label; string chinese_name; string english_name; string config; string authcode; vector<struct> icon; map<string, strcut> infos; ...... // 还有很多 }
这些数据里,哪些是只读的,哪些在其他线程修改,需要明确。这样可以把只读的分离出来,不用关心同步保护的分问题。只把可能多线程修改的重点处理。
jiqiang01234 2016-03-25
  • 打赏
  • 举报
回复
[quote=引用 41 楼 ole_master 的回复:] 这和智能指针有什么关系,应该是用数据库或者对象池,什么shared_ptr闻所未闻,c++现在都在搞这种了,怪不得没人用[/quote孤陋寡闻还这么理直气壮
zhizhy 2016-03-23
  • 打赏
  • 举报
回复
看漏 了一个能子,我还奇怪呢
Saingel 2016-03-23
  • 打赏
  • 举报
回复
用shared_ptr,更新把修改换成新建对象覆盖原有智能指针,这样更新时不会影响使用
looklzg1108 2016-03-23
  • 打赏
  • 举报
回复
超重临时变量有多重? 建立索引,在查找线程内只进行索引查找; 建立一个拷贝线程,找到索引后,由拷贝线程进行拷贝。 1:查找和拷贝分开; 2:尽量减少需要拷贝的数据。
ole_master 2016-03-23
  • 打赏
  • 举报
回复
这和智能指针有什么关系,应该是用数据库或者对象池,什么shared_ptr闻所未闻,c++现在都在搞这种了,怪不得没人用
jiqiang01234 2016-03-23
  • 打赏
  • 举报
回复
引用 38 楼 PHizingHelen 的回复:
To jiqiang01234: 看起来,shared_ptr是解决此类问题的一个捷径了。 但我不明白m2的做法。 我需要的是A资源的共享访问,用了m2,又变成互斥访问了。
shared_ptr<>只是解决了对象赋值的开销问题,不能解决共享访问的问题。如果map里有很多数据需要多个线程写操作,这种情况就不好优化了。更多的需要从程序设计来修改,把没必要多线程同时读写的去掉。
PHizingHelen 2016-03-23
  • 打赏
  • 举报
回复
To jiqiang01234:
看起来,shared_ptr是解决此类问题的一个捷径了。
但我不明白m2的做法。
我需要的是A资源的共享访问,用了m2,又变成互斥访问了。
赵4老师 2016-03-22
  • 打赏
  • 举报
回复
赞同2楼
this1518 2016-03-22
  • 打赏
  • 举报
回复
我看标题第一印象 邪恶了
爆豆 2016-03-22
  • 打赏
  • 举报
回复
赵老师的意见不错
tcmakebest 2016-03-18
  • 打赏
  • 举报
回复
我想能不能将只读的单例与可写的临时变量结合,读取时优先从临时变量,没有时取只读单例,写入时只写入临时变量.
kuankuan_qiao 2016-03-18
  • 打赏
  • 举报
回复
加载更多回复(28)
当电脑经过长时间的使用,系统会因为一些垃圾文件长期得不到清理而导致系统运转越来越慢,如何保持电脑的良好运转成了摆在网友们面前的一道难题。而网络中流传的各种系统优化技巧也是多如牛毛,有的确实可以达到优化系统,提升系统性能的目的,有的却是伪技巧,根本达不到目的。其实,最简单的方法是利用系统优化软件完成对系统的优化,这样既安全,又方便。 系统优化软件——Advanced SystemCare,它可以通过对系统全方位的诊断,找到系统性能的瓶颈所在,然后有针对性地进行修改、优化。它还能分析系统性能的瓶颈并进行优化。通过对系统全方位的诊断,找到系统性能的瓶颈所在,然后有针对性地进行修改、优化。优化后系统性能和网络速度都会有明显提升。 Advanced SystemCare作为一款在国外非常流行的系统优化工具,提供了非常丰富的功能菜单,主要分为诊断,维护,优化三大类别,下面小编就带着大家来了解一下它的功能吧! 1.维护系统 点击该软件左侧的维护系统后,该软件会自动对电脑系统的信息进行扫描,如间谍软件,注册表修复,隐私清除,垃圾软件清理,并在扫描完毕后提示用户进行相关操作. 系统扫描 在扫描完毕后,Advanced SystemCare软件会在右侧边框处出现扫描结果,提示用户进行相关操作,如果您要修复注册表或者要清除一些垃圾文件的话,请点击红色方框处的修复即可。 2.系统诊断 点击该软件左侧的系统诊断后,该软件会自动对电脑系统进行优化操作,如系统优化,安全防护,磁盘整理,安全分析,并在扫描完毕后提示用户进行相关操作. 扫描过程 在扫描完毕后,Advanced SystemCare会在右侧处显示扫描结果,如扫描有异常的话同样也可以点击红色方框处的修复即可。 3.实用工具 点击该软件左侧的实用工具后,该软件右侧会出现工具菜单,如优化类,安全类,管理工具类,在这里你可以找到一些实用的小工具. 右侧即为优化类小工具 安全类小工具 管理类小工具 Advanced SystemCare在实用工具栏里提供了一些系统优化,系统安全及软件管理方面的小软件,功能相当丰富。 4.文件恢复功能 当你安装Advanced SystemCare后,现在版本可以恢复你已经在回收站彻底删除的文件了。 方法: 右击回收站—文件恢复—选择磁盘—选择文件类型—下一步—选择已经删除的文件—还原到其它文件夹—确定。 这样,你之前不小心删除的重要文件,或者是有用的文件就成功恢复了。
当电脑经过长时间的使用,系统会因为一些垃圾文件长期得不到清理而导致系统运转越来越慢,如何保持电脑的良好运转成了摆在网友们面前的一道难题。而网络中流传的各种系统优化技巧也是多如牛毛,有的确实可以达到优化系统,提升系统性能的目的,有的却是伪技巧,根本达不到目的。其实,最简单的方法是利用系统优化软件完成对系统的优化,这样既安全,又方便。   系统优化软件Advanced SystemCare,它可以通过对系统全方位的诊断,找到系统性能的瓶颈所在,然后有针对性地进行修改、优化。   Advanced SystemCare作为一款在国外非常流行的系统优化工具,提供了非常丰富的功能菜单,主要分为诊断,维护,优化三大类别,下面小编就带着大家来了解一下它的功能吧!   1.维护系统   点击该软件左侧的维护系统后,该软件会自动对电脑系统的信息进行扫描,如间谍软件,注册表修复,隐私清除,垃圾软件清理,并在扫描完毕后提示用户进行相关操作.   系统扫描   在扫描完毕后,Advanced SystemCare软件会在右侧边框处出现扫描结果,提示用户进行相关操作,如果您要修复注册表或者要清除一些垃圾文件的话,请点击红色方框处的修复即可。   2.系统诊断   点击该软件左侧的系统诊断后,该软件会自动对电脑系统进行优化操作,如系统优化,安全防护,磁盘整理,安全分析,并在扫描完毕后提示用户进行相关操作.   扫描过程   在扫描完毕后,Advanced SystemCare会在右侧处显示扫描结果,如扫描有异常的话同样也可以点击红色方框处的修复即可。   3.实用工具   点击该软件左侧的实用工具后,该软件右侧会出现工具菜单,如优化类,安全类,管理工具类,在这里你可以找到一些实用的小工具.   右侧即为优化类小工具   安全类小工具   管理类小工具   Advanced SystemCare在实用工具栏里提供了一些系统优化,系统安全及软件管理方面的小软件,功能相当丰富。
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 深入理解Android:卷I(51CTO网站“2011年度最受读者喜爱的原创IT技术图书”) 基本信息 作者: 邓凡平 出版社:机械工业出版社 ISBN:9787111357629 上架时间:2011-9-13 出版日期:2011 年9月 开本:16开 页码:488 版次:1-1 编辑推荐   结合实际应用开发需求,以情景分析的方式有针对性地对Android的源代码进行了十分详尽的剖析,深刻揭示Android系统的工作原理    机锋网、51CTO、开源中国社区等专业技术网站一致鼎力推荐 内容简介   《深入理解android:卷1》是一本以情景方式对android的源代码进行深入分析的书。内容广泛,以对framework层的分析为主,兼顾native层和application层;分析深入,每一部分源代 码的分析都力求透彻;针对性强,注重实际应用开发需求,书中所涵盖的知识点都是android应用开发者和系统开发者需要重点掌握的。    全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;第2章通过对android系统中的mediascanner进行分析,详细讲解了 android中十分重要的jni技术;第3章分析了init进程,揭示了通过解析init.rc来启动zygote以及属性服务的工作原理;第4章分析了zygote、systemserver等进程的工作机制,同时还讨论了 android的启动速度、虚拟机heapsize的大小调整、watchdog工作原理等问题;第5章讲解了android系统中常用的类,包括sp、wp、refbase、thread等类,同步类,以及java中的handler类和 looper类,掌握这些类的知识后方能在后续的代码分析中做到游刃有余;第6章以mediaserver为切入点,对android中极为重要的binder进行了较为全面的分析,深刻揭示了其本质。第7章对 audio系统进行了深入的分析,尤其是audiotrack、audioflinger和audiopolicyservice等的工作原理。第8章深入讲解了surface系统的实现原理,分析了surface与activity之间以及surface 与surfaceflinger之间的关系、surfaceflinger的工作原理、surface系统中的帧数据传输以及layerbuffer的工作流程。第9章对vold和rild的原理和机制进行了深入的分析,同时还探讨了 phone设计优化的问题;第10章分析了多媒体系统中mediascanner的工作原理。    本书适合有一定基础的android应用开发工程师和系统工程师阅读。通过对本书的学习,大家将能更深刻地理解android系统,从而自如应对实际开发中遇到的难题。 作译者   邓凡平,资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有非常深刻的认识和理解,应用开发经验也十分丰富。目前就职于国内一家领先的 Android企业,负责Framework的开发和维护。乐于分享,活跃于CSDN等专业社区,撰写的Android Framework源码的系列文章深受读者欢迎。此外,他对Linux内核、C/C++/Python相关的技术 ,以及高性能网络服务器和多核并行开发等也有一定的研究。 目录 封面 -17 封底 489 扉页 -16 版权 -15 推荐序 -14 前言 -12 致谢 -9 目录 -7 第1章 阅读前的准备工作 1 1.1 系统架构 2 1.1.1 Android系统架构 2 1.1.2 本书的架构 3 1.2 搭建开发环境 4 1.2.1 下载源码 4 1.2.2 编译源码 6 1.3 工具介绍 8 1.3.1 Source Insight介绍 8 1.3.3 Busybox的使用 11 1.4 本章小结 12 第2章 深入理解JNI 13 2.1 JNI概述 14 2.2 学习JNI的实例:MediaScanner 15 2.3 Java层的MediaScanner分析 16 2.3.1 加载JNI库 16 2.3.2 Java的native函数和总结 17 2.4 JNI层MediaScanner的分析 17 2.4.1 注册JNI函数 18 2.4.2 数据类型转换 22 2.4.3 JNIEnv介绍 24 2.4.4 通过JNIEnv操作jobject 25 2.4.5 jstring介绍 27 2.4.6 JNI类型签名介绍 28 2.4.7 垃圾回收 29 2.4.8 JNI中的异常处理 32 2.5 本章小结 32 第3章 深入理解init 33 3.1 概述 34 3.2 init分析 34 3.2.1 解析配置文件 38 3.2.2 解析service 42 3.2.3 init控制service 48 3.2.4 属性服务 52 3.3 本章小结 60 第4章 深入理解zygote 61 4.1 概述 62 4.2 zygote分析 62 4.2.1 AppRuntime分析 63 4.2.2 Welcome to Java World 68 4.2.3 关于zygote的总结 74 4.3 SystemServer分析 74 4.3.1 SystemServer的诞生 74 4.3.2 SystemServer的重要使命 77 4.3.3 关于SystemServer的总结 83 4.4 zygote的分裂 84 4.4.1 ActivityManagerService发送请求 84 4.4.2 有求必应之响应请求 86 4.4.3 关于zygote分裂的总结 88 4.5 拓展思考 88 4.5.1 虚拟机heapsize的限制 88 4.5.2 开机速度优化 89 4.5.3 Watchdog分析 90 4.6 本章小结 93 第5章 深入理解常见类 95 5.1 概述 96 5.2 以“三板斧”揭秘RefBase、 sp和WP 96 5.2.1 第一板斧——初识影子对象 96 5.2.2 第二板斧——由弱生强 103 5.2.3 第三板斧——破解生死魔咒 106 5.2.4 轻量级的引用计数控制类LightRefBase 108 5.2.5 题外话——三板斧的来历 109 5.3 Thread类及常用同步类分析 109 5.3.1 一个变量引发的思考 109 5.3.2 常用同步类 114 5.4 Looper和Handler类分析 121 5.4.1 Looper类分析 122 5.4.2 Handler分析 124 5.4.3 Looper和Handler的同步关系 127 5.4.4 HandlerThread介绍 129 5.5 本章小结 129 第6章 深入理解Binder 130 6.1 概述 131 6.2 庖丁解MediaServer 132 6.2.1 MediaServer的入口函数 132 6.2.2 独一无二的ProcessState 133 6.2.3 时空穿越魔术——defaultServiceManager 134 6.2.4 注册MediaPlayerService 142 6.2.5 秋风扫落叶——StartThread Pool和join Thread Pool分析 149 6.2.6 你彻底明白了吗 152 6.3 服务总管ServiceManager 152 6.3.1 ServiceManager的原理 152 6.3.2 服务的注册 155 6.3.3 ServiceManager存在的意义 158 6.4 MediaPlayerService和它的Client 158 6.4.1 查询ServiceManager 158 6.4.2 子承父业 159 6.5 拓展思考 162 6.5.1 Binder和线程的关系 162 6.5.2 有人情味的讣告 163 6.5.3 匿名Service 165 6.6 学以致用 166 6.6.1 纯Native的Service 166 6.6.2 扶得起的“阿斗”(aidl) 169 6.7 本章小结 172 第7章 深入理解Audio系统 173 7.1 概述 174 7.2 AudioTrack的破解 174 7.2.1 用例介绍 174 7.2.2 AudioTrack (Java空间)分析 179 7.2.3 AudioTrack (Native空间)分析 188 7.2.4 关于AudioTrack的总结 200 7.3 AudioFlinger的破解 200 7.3.1 AudioFlinger的诞生 200 7.3.2 通过流程分析AudioFlinger 204 7.3.3 audio track cblk t分析 230 7.3.4 关于AudioFlinger的总结 234 7.4 AudioPolicyService的破解 234 7.4.1 AudioPolicyService的创建 235 7.4.2 重回AudioTrack 245 7.4.3 声音路由切换实例分析 251 7.4.4 关于AudioPolicy的总结 262 7.5 拓展思考 262 7.5.1 DuplicatingThread破解 262 7.5.2 题外话 270 7.6 本章小结 272 第8章 深入理解Surface系统 273 8.1 概述 275 8.2 一个Activity的显示 275 8.2.1 Activity的创建 275 8.2.2 Activity的UI绘制 294 8.2.3 关于Activity的总结 296 8.3 初识Surface 297 8.3.1 和Surface有关的流程总结 297 8.3.2 Surface之乾坤大挪移 298 8.3.3 乾坤大挪移的JNI层分析 303 8.3.4 Surface和画图 307 8.3.5 初识Surface小结 309 8.4 深入分析Surface 310 8.4.1 与Surface相关的基础知识介绍 310 8.4.2 SurfaceComposerClient分析 315 8.4.3 SurfaceControl分析 320 8.4.4 writeToParcel和Surface对象的创建 331 8.4.5 lockCanvas和unlockCanvasAndPost分析 335 8.4.6 GraphicBuffer介绍 344 8.4.7 深入分析Surface的总结 353 8.5 SurfaceFlinger分析 353 8.5.1 SurfaceFlinger的诞生 354 8.5.2 SF工作线程分析 359 8.5.3 Transaction分析 368 8.5.4 关于SurfaceFlinger的总结 376 8.6 拓展思考 377 8.6.1 Surface系统的CB对象分析 377 8.6.2 ViewRoot的你问我答 384 8.6.3 LayerBuffer分析 385 8.7 本章小结 394 第9章 深入理解Vold和Rild 395 9.1 概述 396 9.2 Vold的原理与机制分析 396 9.2.1 Netlink和Uevent介绍 397 9.2.2 初识Vold 399 9.2.3 NetlinkManager模块分析 400 9.2.4 VolumeManager模块分析 408 9.2.5 CommandListener模块分析 414 9.2.6 Vold实例分析 417 9.2.7 关于Vold的总结 428 9.3 Rild的原理与机制分析 428 9.3.1 初识Rild 430 9.3.2 RIL_startEventLoop分析 432 9.3.3 RIL Init分析 437 9.3.4 RIL_ register分析 444 9.3.5 关于Rild main函数的总结 447 9.3.6 Rild实例分析 447 9.3.7 关于Rild的总结 459 9.4 拓展思考 459 9.4.1 嵌入式系统的存储知识介绍 459 9.4.2 Rild和Phone的改进探讨 462 9.5 本章小结 463 第10章 深入理解MediaScanner 464 10.1 概述 465 10.2 android.process.media分析 465 10.2.1 MSR模块分析 466 10.2.2 MSS模块分析 467 10.2.3 android.process.media媒体扫描工作的流程总结 471 10.3 MediaScanner分析 472 10.3.1 Java层分析 472 10.3.2 JNI层分析 476 10.3.3 PVMediaScanner分析 479 10.3.4 关于MediaScanner的总结 485 10.4 拓展思考 486 10.4.1 MediaScannerConnection介绍 486 10.4.2 我问你答 487 10.5 本章小结 488 前言   虽然前言位于书的最前面,但往往是最后才完成的。至今,本书的撰写工作算是基本完成了,在书稿付梓之前,心中却有些许忐忑和不安,因为拙著可能会存在Bug。为此,我先为书中可 能存在的Bug将给大家带来的麻烦致以真诚的歉意。另外,如果大家发现本书存在纰漏或有必要进一步探讨的地方,请发邮件给我(fanping.deng@gmail.com),我会尽快回复。非常乐意与大 家交流。      本书主要内容   全书一共10章,其中一些重要章节中还设置了“拓展思考”部分。这10章的主要内容是:   第1章介绍了阅读本书所需要做的一些准备工作,包括对Android整个系统架构的认识,以及Android开发环境和源码阅读环境的搭建等。注意,本书分析的源码是Android2.2。   第2章通过Android源码中的一处实例深入地介绍了JNI技术。   第3章围绕init进程,介绍了如何解析init.rc以启动Zygote和属性服务(property service)的工作原理。   第4章剖析了zygote和system_server进程的工作原理。本章的拓展思考部分讨论了Andorid的启动速度、虚拟机heapsize的大小调整问题以及“看门狗”的工作原理。   第5章讲解了Android源码中常用的类,如sp、wp、RefBase、Thread类、同步类、Java中的Handler类以及Looper类。这些类都是Android中最常用和最基本的,只有掌握这些类的知识,才 能在分析后续的代码时游刃有余。   第6章以MediaServer为切入点,对Binder进行了较为全面的分析。本章拓展思考部分讨论了与Binder有关的三个问题,它们分别是Binder和线程的关系、死亡通知以及匿名Service。笔者 希望,通过本章的学习,大家能更深入地认识Binder的本质。   第7章阐述了Audio系统中的三位重要成员AudioTrack、AudioFlinger和AudioPolicyService的工作原理。本章拓展思考部分分析了AudioFlinger中DuplicatingThread的工作原理,并且和 读者一道探讨了单元测试、ALSA、Desktop check等问题。通过对本章的学习,相信读者会对Audio系统有更深的理解。   第8章以Surface系统为主,分析了Activity和Surface的关系、Surface和SurfaceFlinger的关系以及SurfaceFlinger的工作原理。本章的拓展思考部分分析了Surface系统中数据传输控制 对象的工作原理、有关ViewRoot的一些疑问,最后讲解了LayerBuffer的工作流程。这是全书中难度较大的一章,建议大家反复阅读和思考,这样才能进一步深入理解Surface系统。   第9章分析了Vold和Rild,其中Vold负责Android平台中外部存储设备的管理,而Rild负责与射频通信有关的工作。本章的拓展思考部分介绍了嵌入式系统中与存储有关的知识,还探讨了 Rild和Phone设计优化方面的问题。   第10章分析了多媒体系统中MediaScanner的工作原理。在本章的拓展思考部分,笔者提出了几个问题,旨在激发读者深入思考和学习Android的欲望。      本书特色   笔者认为,本书最大的特点在于,较全面、系统、深入地讲解了Android系统中的几大重要组成部分的工作原理,旨在通过直接剖析源代码的方式,引领读者一步步深入于诸如Binder、 Zygote、Audio、Surface、Vold、Rild等模块的内部,去理解它们是如何实现的,以及如何工作的。笔者根据研究Android代码的心得,在本书中尝试性地采用了精简流程、逐个击破的方法进 行讲解,希望这样做能帮助读者更快、更准确地把握各模块的工作流程及其本质。本书大部分章节中都专门撰写了“拓展思路”的内容,希望这部分内容能激发读者对Android代码进行深入研 究的热情。      本书面向的读者   (1)Android应用开发工程师 .  对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。   (2)Android系统开发工程师   Android系统开发工程师常常需要深入理解系统的运转过程,而本书所涉及的内容可能正是他们在工作和学习中最想了解的。那些对具体模块(如Audio系统和Surface系统)感兴趣的读者 也可以直接阅读相关章节的内容。   这里有必要提醒一下,要阅读此书,应具有C++的基本知识,因为本书的大部分内容都集中在了Native层。      如何阅读本书   本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该章所涉及的源码路径全部都列出来了,而在具体分析源码时,则只列出该源码的文件名。   下面就是一个示例:   [--]AndroidRuntime.cpp]   //这里是源码分析和一些注释。   如有一些需要特别说明的地方,则会用下面的格式表示:   [--]AndroidRuntime.cpp::特别说明]   特别说明可帮助读者找到源码中的对应位置。   另外,本书在描述类之间的关系以及在函数调用流程上使用了UML的静态类图以及序列图。UML是一个强大的工具,但它的建模规范过于烦琐,为更简单清晰地描述事情的本质,本书并未 完全遵循UML的建模规范。   本书所使用的UML图都比较简单,读者大可不必花费时间专门学习UML。   本书的编写顺序,其实应该是6、5、4、7、8、9、10、2、3、1章,但出于逻辑连贯性的考虑,还是建议读者按本书的顺序阅读。其中,第2、5、6章分别讲述了JNI、Android常用类以及 Binder系统,这些都是基础知识,我们有必要完全掌握。其他部分的内容都是针对单个模块的,例如Zygote、Audio、Surface、MediaScanner等,读者可各取所需,分别对其进行研究。      致谢   首先要感谢杨福川编辑。本书最初的内容来自我的博客,但博客里的文章都没有图,格式也较混乱。是杨编辑最先鼓励我将这些博文整理修改成册,所以我对杨福川编辑的眼光佩服得五 体投地。在他的同事杨绣国和白宇的帮助下,我最终才将博客中那些杂乱的文章撰成了今天这本图文并茂、格式工整的书籍。   其次要感谢我的妻子。为写成此书,我几乎将周末所有的时间都花在了工作中,而长时间在生活上对妻子不闻不问。对丈夫呆若木鸡式的冷淡,妻子却给予了最大的宽容。另外,我的岳 父母和我的父母亲都给予了我最无私的帮助,他们都是平凡而伟大的父母亲。还有我和妻子的亲戚们,他们的宽厚和善良时刻感动着我。   在IT职业的道路上,非常感念前东家中科大洋公司的领导和同事们,他们是邓伟先生、刘运红先生、王宁先生等。当初,如果没有他们宽容的接纳和细心的指导,现在我不可能成为一名 合格的程序员。   非常感谢我现在供职的单位中科创达公司。在这里工作,我常有这样一种感慨:不是所有人都能自己开公司创业的,而又有多少人能够有机会和一个优秀的创业公司一起成长、一起发展 呢?创达开明的领导、睿智而富有激情的工作伙伴正是孕育本书的沃土。公司领导赵鸿飞先生、吴安华女士等人更是给予了我最大的肯定和鼓励。   这里要特别提及的是,我的大学同窗,即为本书作序的邓必山先生。如果没有他的推荐,凭自己那份简陋、单薄的简历,是根本无法与Android亲密接触的。另外,他还曾在技术和个人发 展上给予过我很多的指导,对此,我将永志不忘!   谢谢那些共享Android知识的网友们!没有大家前期点滴的奉献,或许我至今还在琢磨着某段代码呢。   最后应感谢的是肯花费时间和精力阅读本书的读者,你们的意见和建议将会是我获得的巨大的精神财富!      邓凡平   2011年6月于北京    序言   近两年来,IT行业的最热点聚焦到了移动互联网上。PC时代,WINTEL联盟成就了英特尔和微软各自的霸业。移动互联网时代,谁将上演新的传奇?新生的Android当年仅用短短一年多的时 间就跻身全球智能操作系统的三甲行列。在北美市场,如今Android已经超过iOS和黑莓系统成为老大!Android势不可挡,ARM+Android组合的前景一片光明,越来越多的从业者加入了Android 行列!   与带给人们良好用户体验的iOS不一样的是,Android是一个开放的系统,其所有代码都是开源的。因此,对于开发者而言,不仅可以做到知其然,更可以做到知其所以然!   然而,要想知道其所以然,并不是一件简单的事情。回想当初,我开始接触Android的时候,除了Android源码外,其他资料甚少。Android是基于Linux的完整操作系统,其代码量让人望 而生畏。可以想象,在没有指导的情况下一头扎进操作系统庞大的代码中是一件让人多么痛苦的事情。时间过得很快,Android生态链已经得到了充分的发展。现在市场上的Android资料已经 开始泛滥,书籍已经数不胜数。然而,绝大部分书籍只限于讲解Android应用的开发(拜Android应用API所赐),没有深入到系统级的探讨,极少的所谓提供Android深入指导的资料也只是浅 尝辄止。如果想深入了解Android系统,只有华山一条路:自己看Android源代码!   正是因为如此,当初凡平告诉我他要系统地整理其深入钻研Android源代码的心得时,我表示了强烈的赞同。这是一件极少有人做过的事情,这件事情将给已经或即将跨入Android世界的 同仁们极大的帮助!这本书里,作者以代码框架为主线,用循序渐进的方式将框架中的关键点一一剖开,从而给读者一个架构清楚、细节完善的立体展现。另外,凡平还会用他的幽默给正在 啃枯燥代码的您带来不少笑意和轻松。毫无疑问,如果您想深入了解Android系统,这本书就是您进入Android神秘世界的钥匙。   如果您看准了移动互联网的前景,想深入理解Android,那就让这本书指导您前进吧!      邓必山   2011年6月于北京    媒体评   作者是Thundersoft多媒体组的牛人,技术精深,乐于分享,对Android系统有真正的理解。《深入理解Android:卷1》内容给力,语言生动,全书没有一句废话,各章中的“拓展思考” 尤为精彩,体现了作者对Android实现原理的深入理解和批判性思考。为什么Android的短信群发很慢?为什么拔出SD卡时有的程序会退出?读者都能从本书中找到诸如此类的各种实际问题的 答案。更重要的是,读者能够对Android的整个体系有一个全新的理解。如果你通读了这本书,请一定投一份简历给我们。——Thundersoft(中科创达软件科技(北京)有限公司)      对于Android开发工程师而言,本书不可多得,分析透彻深入,针对性极强。Android系统本身极为庞大,如果要对整个系统进行面面俱到且细致入微地分析,恐怕不是一两本书能完成的 。本书从开发者的实际需求出发,有针对性地对Android系统中的重要知识点和功能模块的源代码实现进行了剖析,这样既能帮助开发者解决实际问题,又能使分析深入透彻,而不是停留于表 面。强烈推荐!——机锋网(http://www.gfan.com/)      这本书非常实用,绝不是枯燥的源代码分析,是深入理解Android工作机制和实现原理的一本好书。为什么说它实用呢?因为它的最终目的并不是停留着源代码分析上,而是要帮助开发者 解决实际问题,于是所有知识点的分析和讲解都是从开发者的实际需求出发的。与一般的源代码分析的书相比较而言,本书在语言上多了几分幽默,更加生动易懂。更重要的是,本书的分析 十分深入,探讨了Android相关功能模块的本质。——51CTO移动开发频道(http://mobile.51cto.com/)      随着Android 系统越来越流行,Android应用的需求也在不断变化,对于开发者而言,深入理解Android系统原理显得越来越重要。目前市面上Android 开发相关的图书已经很多,但真正 能够系统、深入地讲解Android系统原理的书还乏善可陈。这本书的出版恰逢其时,该书同时兼备深度和广度,以循序渐进的方式,优雅的语言,深入分析到各个模块的源码与原理。另外,它 启发性的讲解方式,更有助于读者的学习和思考。——开源中国社区(http://www.oschina.net/)   

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧