[返回] [最新] [最热门] [最高评价]

协程并发模型及使用感受

协程可以简单理解为更轻量的线程,但有很多显著的不同:

不是OS级别的调度单元,通常是编程语言或库实现

可能需要应用层自己切换

由于切换点是可控制的,所以对于CPU资源是非抢占式的

通常用于有大量阻塞操作的应用,例如大量IO

协程与actor模式的实现有一定关系。由于协程本身是应用级的并发调度单元,所以理论上可以大量创建。在协程之上做队列及通信包装,即可得到一个actor框架,例如pyth
...

Kevin Lynx 2017-12-03 00:00 | 查看: 360

实现一个memcache proxy

通常我们会使用多台memcached构成一个集群,通过客户端库来实现缓存数据的分片(replica)。这会带来2个主要问题:

memcached机器连接数过多

不利于做整体的服务化;缺少可运维性。例如想对接入的客户端做应用级隔离;或者对缓存数据做多区域(机房)的冗余

实现一个memcache proxy,相对于减少连接数来说,主要可以提供更多的扩展性。目前已经存在一些不错的memcache
...

Kevin Lynx 2017-05-18 00:00 | 查看: 397

Xmemcached源码阅读

Xmemcached 是一个memcached客户端库。由于它提供的是同步API,而我想看下如何增加异步接口。所以就大致浏览了下它的源码。

主要结构

针对memcache客户端的实现,主要结构如下:

XMemcachedClient 是应用主要使用的类,所有针对memcache的接口都在这里

Command 用于抽象二进制协议或文本协议下各个操作,这里称为Command。CommandFa
...

Kevin Lynx 2017-04-23 00:00 | 查看: 497

XNIO源码阅读

XNIO是JBoss的一个IO框架。最开始我想找个lightweight servlet container库,于是看到了undertow,发现其网络部分使用的就是XNIO。所以干脆就先把XNIO的源码读下。

XNIO文档非常匮乏,能找到都是3.0的版本,而且描述也不完全。Git上已经出到3.5.0。我读的是3.3.6.Final。

使用方式

可以参考SimpleEchoServer.jav
...

Kevin Lynx 2017-04-09 00:00 | 查看: 658

实现JVM中的JIT

在JVM中,JIT (Just-in-Time) 即时编译指的是在Java程序运行过程中JVM优化部分指令为本地指令,从而大幅提升性能。在上一篇文章写一个玩具Java虚拟机中实现了一个基本可以运行Java字节码的JVM。本篇文章描述我是如何在这个玩具JVM中实现JIT的。

推荐文章“How to JIT - an introduction”,介绍了JIT的基本实现原理。作
...

Kevin Lynx 2017-03-09 00:00 | 查看: 369

写一个玩具Java虚拟机

本文描述了一个用Java实现的玩具JVM,用Java实现的好处是可以不用处理JVM中的垃圾回收。

Java虚拟机是基于栈的虚拟机。栈虚拟机的特点是所有临时操作数都存放在栈中。编译器生成的指令都会围绕着这个栈展开,相对而言,解释执行这些指令会比较容易。基于栈的虚拟机可能会生成如下指令:

1
2
3

push 3 # 把立即数3压栈
push 4 # 把立即数4压栈
add #
...

Kevin Lynx 2017-02-25 00:00 | 查看: 446

RequireJS最简实现

网上有不少解析RequireJS源码的文章,我觉得意义不大。阅读源代码的目的不是为了熟悉代码,而是为了学习核心实现原理。相对RequireJS的源码,kitty.js的实现更简单,更容易理解。本文正是抄了kitty.js的实现,是一个更精简的RequireJS,用于理解RequireJS的实现原理。

github dummy-requirejs。这个实现仅支持核心feature:

1
2

r
...

Kevin Lynx 2017-02-05 00:00 | 查看: 611

ReactJS项目中基于webpack实现页面插件

整个Web页面是基于ReactJS的,js打包用的webpack,现在想在Web页面端实现一种插件机制,可以动态载入第三方写的js插件。这个插件有一个约定的入口,插件被载入后调用该入口函数,插件内部实现渲染逻辑。插件的实现也使用了ReactJS,当然理论上也可以不使用。预期的交互关系是这样的:

1
2
3
4
5
6
7
8
9
10

// 主页面
load('/plugin/my-plugi
...

Kevin Lynx 2017-01-08 00:00 | 查看: 486

一次逆向网页内容加密

最近写一个爬虫要从这个网页爬取内容。以往爬取网页内容复杂点的,一般就是处理下页面内容动态载入,动态载入的内容可能会要求复杂奇怪的参数,或者找到这个动态载入的HTTP接口在哪里麻烦点。但是这个网页不同。类似:

1

<td><span name="record_yijiaof:feiyongzldm" title="pos||"><span id="5d2999056
...

Kevin Lynx 2016-08-16 00:00 | 查看: 985

记一次线程局部存储与动态库引起的core

线上的服务退出时coredump,显示堆栈为:

google一下发现有人遇到过,产生这个core的条件为:

使用TLS时注册了destructor (pthread_key_create),这个回调函数会在线程退出时被调用

这个destructor符号位于.so中

在线程退出时,这个.so已经被dlclose

我们的程序模型中,类似于一个Web App server,有一个线程池包装了I
...

Kevin Lynx 2016-05-08 00:00 | 查看: 693

Java中隔离容器的实现

Java中隔离容器用于隔离各个依赖库环境,解决Jar包冲突问题。

问题

应用App依赖库LibA和LibB,而LibA和LibB又同时依赖LibBase,而LibA和LibB都是其他团队开发的,其中LibA发布了一个重要的修复版本,但是依赖LibBase v2.0,而LibB还没有升级版本,LibBase还不是兼容的,那么此时升级就会面临困难。在生产环境中这种情况往往更恶劣,可能是好几层的间接
...

Kevin Lynx 2015-09-05 00:00 | 查看: 831

Java GC总结

Java GC相关的文章有很多,本文只做概要性总结,主要内容来源于<深入理解Java虚拟机>。

对象存活性判定

对象存活性判定用于确定一个对象是死是活,死掉的对象则需要被垃圾回收。主要包括的方法:

引用计数

可达性分析

可达性分析的基本思想是:

通过一系列的称为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个
...

Kevin Lynx 2015-08-10 00:00 | 查看: 801

...更多...