![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技术布道
文章平均质量分 90
bbb_
爱数星星的开发者
展开
-
借刀杀对象--Raii技法(C++版)
我们都知道C++有一点很不爽的地方就是内存管理需要手动,像我有时候使用多了像C#,java之类托管语言(C#在clr中可以通过gc进行垃圾回收,java在jvm中也有相应的gc回收),再写C++就会有点不爽了,甚至会疑神疑鬼的,写完一段代码就会想想 天哪,我的代码有没有哪里忘了释放内存啊,有没有内存泄露啊,唉,写代码的乐趣就这样被一点点的抹去,这时候我们会想到C++能不能也来个内存的自动管理啊,C+原创 2015-10-19 18:50:30 · 756 阅读 · 0 评论 -
神之门V8(2):GC的混乱之治(上)
前面一篇文章介绍了v8中对象是怎么的smart,在这里,我们的对象指针就会变得更smart了,先看看对象在heap中是怎么分类管理的, 下面是V8heap的结构图:对jvm有过了解的伙伴就会发现这玩意很像jvm中的heap结构,而且jdk8中删除了持久带后总体的结构更像了,不错,v8堆正是参考了hotspot jvm的设计,采用对象分代管理的策略,当然不同对象得让GC不同看待,首先是新生代,v8中原创 2015-11-28 02:21:19 · 1411 阅读 · 0 评论 -
Reference VS Pointer
首先我们来看看java的引用,java的引用不同于C指针,它并不可以指向它想指向的任何地方,比如int,char等基类型都是不允许的,java也是类型安全的,并不允许re-interpret cast操作,在c++或者c指针就会允许这个操作,直接对内存进行re-interpret,java跟c++的引用都是没有实体类型的,指针可以存储在一块特定的内存区,然而引用并没有另外为止分分配的内存区。指针的功原创 2015-09-22 18:50:02 · 625 阅读 · 0 评论 -
JVM之旅--GC探秘
说到GC,首先要说到GC实现一个很重要的角色,那就是jvm(java虚拟机),jvm作为java的一个托管平台在java代码的运行过程中提供了诸多的性能优化,确保代码的高效率执行,至于怎么优化就暂且不关注这个问题,我们先来看看oracle对于jvm的架构说明:在这个图里面我们可以看到,我们用java写的各种类都是通过一个类加载器交换到jvm,jvm的中间层包括java方法存储区,以及java中堆(h原创 2015-10-02 00:50:17 · 750 阅读 · 2 评论 -
十指相扣:陪binderIPC度过的漫长岁月(2)
上一篇文章中,我们分析了ipcbinder框架的基本原理,简要的说就是我们client端的binder向BD写入数据,然后BD再向server端传递数据,那么问题来了,这中间是不是发生了两次数据拷贝呢?这个问题比较深刻,然而事实也比较深刻,只有一次数据拷贝,这是google对binder做了一次优化的结果,一次的拷贝发生在client向BD的数据拷贝,那么server如果不从BD中拷贝数据,它又怎么原创 2016-02-03 17:54:21 · 699 阅读 · 0 评论 -
十指相扣:陪binderIPC度过的漫长岁月(3)
现在该分析一下最初的binder进程是怎么产生的了,首先sm是一个linux内核的守护进程,我们要知道她的来路,还是先看看她的入口函数:int main(int argc, char **argv) { //这个结构体存放binder进程的状态信息(binder设备信息) struct binder_state *bs; void *svcmgr = BINDER_SE原创 2016-02-04 00:03:11 · 667 阅读 · 0 评论 -
十指相扣:陪binderIPC度过的漫长岁月(1)
Android中的ipc一直被称作系统设计中一个比较复杂的地方,近来特意研究了一下ipc,感受了一下这个伟大的设计。说到ipc,肯定不会离开binder,binder是什么呢,它的中文名叫粘合剂,两个不同内存空间的进程能够得到进行通信,必然需要一样东西将两者进行“粘合”,其实我们在activity中开启一个service时,如果我们使这个服务成为远程服务(remote),这个服务就会运行在一个另一个原创 2016-02-03 14:44:28 · 571 阅读 · 0 评论 -
神之门V8-----Event loop的舞池盛宴(2)
在上一篇文章中,我们分析了node的EventEmitter与EventLoop的关系,结论就是它们真的没多大关系,代码表现出异步只是emit函数调用的时机被我们手动设定在eventloop里面。OK,跟着独操引擎的男人继续我们的代码之旅~JS对象与C++ Runtime 代码这一部分涉及到V8引擎的代码优化,对这个不感兴趣的伙伴可以略过这一部分,直接看后面的loop分析,个人觉得理解了funct原创 2016-11-30 16:32:50 · 2802 阅读 · 0 评论 -
神之门V8-----Event loop的舞池盛宴(1)
故事的开始由于各种原因,没有继续写V8引擎系列文章有相当长的一段时间了,今天本来不打算写解剖node的文章的,但一个contextify被扰乱的native问题实在引起了我对它的兴趣,好吧,我又重新回归了这个神奇的世界,看了一些文档资料,只能有个大概的印象,然而作为一个独操引擎的男人,既然入了坑,怎么能浅尝则止呢,结合源代码,我仔细地观察了eventloop,领教了这个神奇的存在给node注入了强大原创 2016-11-29 21:28:18 · 1138 阅读 · 0 评论 -
风骚裙摆--最后的内存池
上一篇文章我介绍过了对象池,后来想了一下,发现就这么用模板以及一些raii技法,工厂模式实现一个对象管理接口似乎有点局限性,首先它很难做到单例模式,因为一个程序总不能来来去去就创建那么一种对象吧,但单例的情况下,这个对象池的实例只能被构造一次,也就是说,只能填充一次模板实体,好咯,既然有局限性,那我就会想设法去改善它咯,所以我又设计并开发了一个内存池。。。所谓内存池,就完全可以利用单例模式,抛开对象原创 2015-10-31 03:17:03 · 5394 阅读 · 0 评论 -
约战Angular中Promise(2)
上回说到回调金字塔会形成一个then()的调用链,以及相应在pending的等待队列产生变化,现在我们就来详细分析。我们首先来看看我们在promise中定义的回调函数是怎样被执行的,先看看call stack:看到最底层的三个函数我们应该觉得非常熟悉,这不就是ng的事件轮询么(详情见本人的ng事件轮询文章),从apply进入ng的事件轮询控制域,然后再digest中轮询AsyncQueue(异步事件原创 2015-09-18 17:36:52 · 577 阅读 · 0 评论 -
wpf探秘之B哥Dispatcher私房菜(2)最终回
上次我们说到Dispatcher内部有一个管理DO的队列,我暂且称之为DOQueue,在本文我就来重点说DO的处理机制,首先我们来看看DO是怎样被创建的,wpf并没有改变太多win32的内核,消息循环的机制已经深入人心了,同样窗体还是有自己的消息循环,如上面介绍win32时,消息循环的处理者肯定为一个窗体过程函数WndProc,以前我们直接把我们回调写到这个函数里面在窗体中注册下就完事大吉了,然而现原创 2015-09-17 18:26:03 · 547 阅读 · 0 评论 -
约战Angular中Promise(1)
在angular出现之前,web开发中前端跟后台的交互采用xhr的ajax技术,即xhr的异步请求,异步肯定就不能阻塞当前的线程,所以这个时候回调就非常重要,在commonJS中曾定义过promise规范,即一个异步请求函数把一个耗时操作请求提交出去,可以马上获得返回值,这个返回值就是传说中的promise,说到promise,有一个很重要的方法就是then()方法,这个方法一般会有两个参数,分别为原创 2015-09-18 02:47:59 · 813 阅读 · 0 评论 -
wpf探秘之B哥Dispatcher私房菜(1)
一切从我们熟悉的windows系统说起,话说windows系统,有一个概念是大家都不会陌生的,那就是消息循环,我们先来看看传统的win32是如何完成消息循环的,用C写过窗体程序的伙伴估计都会比较熟悉,消息循环在本质上就是一个大大的while循环,然后主线程里面创建消息队列,然后不断从消息队列中提取消息,进行消息的分发,我们再来回顾下当年用C++在没有mfc条件下的生活吧:while (GetMess原创 2015-09-17 15:34:46 · 625 阅读 · 0 评论 -
从Activity的启动细窥BinderIPC(1)
android基于linux内核,linux有丰富的进程通信机制,比如传统的pipe,signal,trace机制,然而android毅然放弃祖传遗产 另起一招,名曰BinderIPC。。。更新—————————————————————————————-下面来进行详细的讨论: 本文章从最简单最基本的activity的启动说起,首先观察我们的callstack原创 2015-09-17 03:24:47 · 1550 阅读 · 0 评论 -
与AngularJS的约会之事件循环+watchers源码分析
ng中说到事件轮询,第一个拿出来的肯定是digest函数啦,在digest()的事件轮询中,一共会轮询两个列表,一个为AsyncEvalQueue,一个为Watchers列表,*apply方法进入ng上下文执行的Callback fn将其context修改为ng的控制域,先从queue取出每一个asyncTask,获取其scope通过eval方法进行callbackfn目标的expression计算原创 2015-09-17 05:01:55 · 1306 阅读 · 0 评论 -
从Activity的启动细窥BinderIPC(2)
上次的源码分析出现了一个runOnce()函数,实际的孵化过程其实是在runOnce()里面,本文章我们再来看看这个函数的源代码原创 2015-09-17 03:44:15 · 400 阅读 · 0 评论 -
从Activity的启动细窥BinderIPC(3)
本文章我们再回来说说ActivityManagerService原创 2015-09-17 03:54:37 · 416 阅读 · 0 评论 -
进击的对象池
前面有一篇文章说过在代码中如果要高频地创建一个对象(比如一些及时通信的socket等等)怎么通过raii技法进行内存优化,而且这些对象在程序中的生存周期比较短,搞几下就没用了,尤其是一些线程之类,如果要完成什么阻塞任务,虽然它就搞那么几秒,但放在主线程就是会卡住界面,让用户体验很差,然而线程的开销可是众所周知的不小,这个时候我们就会想到如果有一种方法能够反复利用这些对象就好了,于是就有了池这个概念,原创 2015-10-21 17:52:37 · 660 阅读 · 2 评论 -
Go与并发模型
最近,Google的Golang荣获2016年度编程语言,作为一个谷粉,我理应写一篇文章以表祝贺,正好碰上最近在弄一个支持IO无锁并发的脚本引擎,参考了一些Go内部的设计思想,真想不到Go的萌萌的外表下竟隐藏着一颗如此强大的内心,本文主要的分析焦点就是做到更干净的并发编程,让并发编程的代码更加优雅~原创 2017-01-11 17:12:19 · 4245 阅读 · 1 评论