自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Linuxb的秘密花园

本人热衷于技术分享技术交流,欢迎Geek精神的技术伙伴一起学习交流

  • 博客(26)
  • 收藏
  • 关注

原创 Async特性的语法糖下

本文现在这个时间点写貌似必要不大,因为内容比较基础,不过介于如果掌握不准确可能在一些bug面前束手无策,遂当作备忘录好了。今天就讨论一个node里面很简单却又是很值得关注的话题--异步回调,相信很多小伙伴都熟知著名的回调地狱,社区这几年也是人才辈出,产出无数种优雅解决地狱的方案,最后ECMA一声号令,大家不用慌,爸爸出来镇场!这伙人效率颇高,一下子整出了个ES7标准,其中比较重要的特性就是async

2017-03-07 18:32:57 1142

原创 Go与并发模型

最近,Google的Golang荣获2016年度编程语言,作为一个谷粉,我理应写一篇文章以表祝贺,正好碰上最近在弄一个支持IO无锁并发的脚本引擎,参考了一些Go内部的设计思想,真想不到Go的萌萌的外表下竟隐藏着一颗如此强大的内心,本文主要的分析焦点就是做到更干净的并发编程,让并发编程的代码更加优雅~

2017-01-11 17:12:19 4218 1

原创 神之门V8-----Event loop的舞池盛宴(3)

上一篇文章中我献上了一段神奇的代码,并给出了运行结果,也分析了setTimeout这个函数,在本文,我还会带领大家继续分析setImmediate函数以及nextTick原理以及MakeCallback函数跟contextify的问题。OK,跟着独操引擎的男人继续我们的代码之旅吧~~setImmediatesetImmediate函数的callback production机制跟setTimeout

2016-12-01 17:59:34 1818 1

原创 神之门V8-----Event loop的舞池盛宴(2)

在上一篇文章中,我们分析了node的EventEmitter与EventLoop的关系,结论就是它们真的没多大关系,代码表现出异步只是emit函数调用的时机被我们手动设定在eventloop里面。OK,跟着独操引擎的男人继续我们的代码之旅~JS对象与C++ Runtime 代码这一部分涉及到V8引擎的代码优化,对这个不感兴趣的伙伴可以略过这一部分,直接看后面的loop分析,个人觉得理解了funct

2016-11-30 16:32:50 2760

原创 神之门V8-----Event loop的舞池盛宴(1)

故事的开始由于各种原因,没有继续写V8引擎系列文章有相当长的一段时间了,今天本来不打算写解剖node的文章的,但一个contextify被扰乱的native问题实在引起了我对它的兴趣,好吧,我又重新回归了这个神奇的世界,看了一些文档资料,只能有个大概的印象,然而作为一个独操引擎的男人,既然入了坑,怎么能浅尝则止呢,结合源代码,我仔细地观察了eventloop,领教了这个神奇的存在给node注入了强大

2016-11-29 21:28:18 1127

原创 十指相扣:陪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 664

原创 十指相扣:陪binderIPC度过的漫长岁月(2)

上一篇文章中,我们分析了ipcbinder框架的基本原理,简要的说就是我们client端的binder向BD写入数据,然后BD再向server端传递数据,那么问题来了,这中间是不是发生了两次数据拷贝呢?这个问题比较深刻,然而事实也比较深刻,只有一次数据拷贝,这是google对binder做了一次优化的结果,一次的拷贝发生在client向BD的数据拷贝,那么server如果不从BD中拷贝数据,它又怎么

2016-02-03 17:54:21 695

原创 十指相扣:陪binderIPC度过的漫长岁月(1)

Android中的ipc一直被称作系统设计中一个比较复杂的地方,近来特意研究了一下ipc,感受了一下这个伟大的设计。说到ipc,肯定不会离开binder,binder是什么呢,它的中文名叫粘合剂,两个不同内存空间的进程能够得到进行通信,必然需要一样东西将两者进行“粘合”,其实我们在activity中开启一个service时,如果我们使这个服务成为远程服务(remote),这个服务就会运行在一个另一个

2016-02-03 14:44:28 563

原创 神之门V8(2):GC的混乱之治(下)

在上一篇文章中,分析了v8heap中新生带的垃圾回收算法,本文就主要介绍老生带的回收算法,本人自己用C++模拟了一下GC的在老生带的回收算法,接下来会结合代码以及进行分析,由于是我自己写的代码,我肯定会有属于自己的思想在里面,所以个别的细节可能跟V8GC真实的状态有所差异,但总体的思想还是基本体现了,我们说研究这些引擎的设计主要在于感悟这些内核设计的思想,甚至是艺术,所以我的主要宗旨还是以主要设计思

2015-11-28 22:33:22 2003 1

原创 神之门V8(2):GC的混乱之治(上)

前面一篇文章介绍了v8中对象是怎么的smart,在这里,我们的对象指针就会变得更smart了,先看看对象在heap中是怎么分类管理的, 下面是V8heap的结构图:对jvm有过了解的伙伴就会发现这玩意很像jvm中的heap结构,而且jdk8中删除了持久带后总体的结构更像了,不错,v8堆正是参考了hotspot jvm的设计,采用对象分代管理的策略,当然不同对象得让GC不同看待,首先是新生代,v8中

2015-11-28 02:21:19 1402

原创 神之门V8(1):解密handle<T>

我们知道js跟php,java这些都可以说是托管于其他本地程序的语言,它们需要自己的一套运行环境,比如java的jvm,php有zend引擎,也有hhvm,当然本场主角v8引擎也给了js同样的东西,v8引擎号称天下第一快,背后肯定隐藏着许多不为人知的秘密,待我来一一探究,关于v8的编译优化,内联代码优化隐藏类的东西我会放在v8的另一篇文章,这里主要讲v8的内存管理。这个话题很长久啊,无论是zend,

2015-11-27 22:42:07 1861

原创 旋转华尔兹,nodejs的背后

在使用nodejs的时候,会感觉写的很痛快,尤其是对于处理高并发的请求时,密集的IO操作,我们可以在代码中用回调链轻松的完成,只需要一个单进程,单线程就能完成频繁请求的分发调度。js能做到这一步让我吃惊,于是决定打造一套属于我的node运行内核,完成对于回调链的驱动,也顺便感受一下nodejs的设计之美,代码的第一个版本在我的github https://github.com/linuxb/myno

2015-11-26 13:16:48 491

原创 内核艺术系列:绚丽整个php的zend(1)

让我们的故事从一条最简单的php代码开始:$obj = 6;这条代码估计大家再熟悉不过了,不就是写一个变量再给它赋值为6么,然而,你看到的只是echo出来的表象,我既然要说zend引擎的设计,那就得越过php这件华丽的外衣,只是最底层的内核,看看它背着我们到底干了什么。php其实就是一个c程序,所以zend也是完全用c来进行编写,首先来看看整个php的设计架构吧:这张图可谓是php的经典了,首先上层

2015-11-26 00:33:16 791

原创 风骚裙摆--最后的内存池

上一篇文章我介绍过了对象池,后来想了一下,发现就这么用模板以及一些raii技法,工厂模式实现一个对象管理接口似乎有点局限性,首先它很难做到单例模式,因为一个程序总不能来来去去就创建那么一种对象吧,但单例的情况下,这个对象池的实例只能被构造一次,也就是说,只能填充一次模板实体,好咯,既然有局限性,那我就会想设法去改善它咯,所以我又设计并开发了一个内存池。。。所谓内存池,就完全可以利用单例模式,抛开对象

2015-10-31 03:17:03 5391

原创 进击的对象池

前面有一篇文章说过在代码中如果要高频地创建一个对象(比如一些及时通信的socket等等)怎么通过raii技法进行内存优化,而且这些对象在程序中的生存周期比较短,搞几下就没用了,尤其是一些线程之类,如果要完成什么阻塞任务,虽然它就搞那么几秒,但放在主线程就是会卡住界面,让用户体验很差,然而线程的开销可是众所周知的不小,这个时候我们就会想到如果有一种方法能够反复利用这些对象就好了,于是就有了池这个概念,

2015-10-21 17:52:37 654 2

原创 借刀杀对象--Raii技法(C++版)

我们都知道C++有一点很不爽的地方就是内存管理需要手动,像我有时候使用多了像C#,java之类托管语言(C#在clr中可以通过gc进行垃圾回收,java在jvm中也有相应的gc回收),再写C++就会有点不爽了,甚至会疑神疑鬼的,写完一段代码就会想想 天哪,我的代码有没有哪里忘了释放内存啊,有没有内存泄露啊,唉,写代码的乐趣就这样被一点点的抹去,这时候我们会想到C++能不能也来个内存的自动管理啊,C+

2015-10-19 18:50:30 736

原创 JVM之旅--GC探秘

说到GC,首先要说到GC实现一个很重要的角色,那就是jvm(java虚拟机),jvm作为java的一个托管平台在java代码的运行过程中提供了诸多的性能优化,确保代码的高效率执行,至于怎么优化就暂且不关注这个问题,我们先来看看oracle对于jvm的架构说明:在这个图里面我们可以看到,我们用java写的各种类都是通过一个类加载器交换到jvm,jvm的中间层包括java方法存储区,以及java中堆(h

2015-10-02 00:50:17 743 2

原创 Reference VS Pointer

首先我们来看看java的引用,java的引用不同于C指针,它并不可以指向它想指向的任何地方,比如int,char等基类型都是不允许的,java也是类型安全的,并不允许re-interpret cast操作,在c++或者c指针就会允许这个操作,直接对内存进行re-interpret,java跟c++的引用都是没有实体类型的,指针可以存储在一块特定的内存区,然而引用并没有另外为止分分配的内存区。指针的功

2015-09-22 18:50:02 617

原创 约战Angular中Promise(2)

上回说到回调金字塔会形成一个then()的调用链,以及相应在pending的等待队列产生变化,现在我们就来详细分析。我们首先来看看我们在promise中定义的回调函数是怎样被执行的,先看看call stack:看到最底层的三个函数我们应该觉得非常熟悉,这不就是ng的事件轮询么(详情见本人的ng事件轮询文章),从apply进入ng的事件轮询控制域,然后再digest中轮询AsyncQueue(异步事件

2015-09-18 17:36:52 572

原创 约战Angular中Promise(1)

在angular出现之前,web开发中前端跟后台的交互采用xhr的ajax技术,即xhr的异步请求,异步肯定就不能阻塞当前的线程,所以这个时候回调就非常重要,在commonJS中曾定义过promise规范,即一个异步请求函数把一个耗时操作请求提交出去,可以马上获得返回值,这个返回值就是传说中的promise,说到promise,有一个很重要的方法就是then()方法,这个方法一般会有两个参数,分别为

2015-09-18 02:47:59 811

原创 wpf探秘之B哥Dispatcher私房菜(2)最终回

上次我们说到Dispatcher内部有一个管理DO的队列,我暂且称之为DOQueue,在本文我就来重点说DO的处理机制,首先我们来看看DO是怎样被创建的,wpf并没有改变太多win32的内核,消息循环的机制已经深入人心了,同样窗体还是有自己的消息循环,如上面介绍win32时,消息循环的处理者肯定为一个窗体过程函数WndProc,以前我们直接把我们回调写到这个函数里面在窗体中注册下就完事大吉了,然而现

2015-09-17 18:26:03 543

原创 wpf探秘之B哥Dispatcher私房菜(1)

一切从我们熟悉的windows系统说起,话说windows系统,有一个概念是大家都不会陌生的,那就是消息循环,我们先来看看传统的win32是如何完成消息循环的,用C写过窗体程序的伙伴估计都会比较熟悉,消息循环在本质上就是一个大大的while循环,然后主线程里面创建消息队列,然后不断从消息队列中提取消息,进行消息的分发,我们再来回顾下当年用C++在没有mfc条件下的生活吧:while (GetMess

2015-09-17 15:34:46 620

原创 与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 1300

原创 从Activity的启动细窥BinderIPC(3)

本文章我们再回来说说ActivityManagerService

2015-09-17 03:54:37 415

原创 从Activity的启动细窥BinderIPC(2)

上次的源码分析出现了一个runOnce()函数,实际的孵化过程其实是在runOnce()里面,本文章我们再来看看这个函数的源代码

2015-09-17 03:44:15 397

原创 从Activity的启动细窥BinderIPC(1)

android基于linux内核,linux有丰富的进程通信机制,比如传统的pipe,signal,trace机制,然而android毅然放弃祖传遗产 另起一招,名曰BinderIPC。。。更新—————————————————————————————-下面来进行详细的讨论: 本文章从最简单最基本的activity的启动说起,首先观察我们的callstack

2015-09-17 03:24:47 1547

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除