2013年3月28日
摘要: 在java中,Buffer是线性,定长的基本数据类型列表,他不能扩展长度。在nio中,读写操作都是以此为操作单元对象。一次性传输大量数据,避免了多次的copy过程,甚至可以对某些操作直接映射内存。我主要以ByteBuffer为分析对象,其他基本数据类型的Buffer类似。首先,关于Buffer的创建(direct buffers and non-direct buffers):一般来说我们建立的缓冲区都是 non-direct buffers,也就是一般说的java堆内存,这些操作系统是无法直接使用进行I/O操作的,必须要内存copy到内核缓存中才能使用。direct buffer,是通过JN 阅读全文
posted @ 2013-03-28 14:30 文武双全大星星 阅读(882) 评论(0) 推荐(0) 编辑
2013年3月12日
摘要: vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动, I/O, 中断等进行监视。它对系统的整体情况进行统计,但是无法对某个进程进行深入分析,他也可以用来确定一个系统的工作是受限于CPU还是受限于内存。以下命令是每三秒以MB为单位打印出统计信息:有关进程的信息有:r :在就绪状态等待的进程数。如果运行队列(r) 中等待的进程数总是不等于 0,则该系统有可能受限于CPUb :处在非中断睡眠状态的进程数。有关内存的信息有:swpd: 虚拟内存使用情况,默认单位:KBfree: 空闲的内存,默认单位:KBbuff: 被用. 阅读全文
posted @ 2013-03-12 15:39 文武双全大星星 阅读(172) 评论(0) 推荐(0) 编辑
2013年2月28日
摘要: beam文件的格式是 "EA IFF 1985"标准的变种,它把数据分为多个chunks。有时候我们会有这样一种需求,我们想通过beam文件得到源代码,这时候我们首先要想到的是beam_lib模块beam_lib可以用不同的标识符来访问Chunk数据,而标识符又分为两类,atoms和strings,通过atoms访问到的chunk返回的都是Compound terms而通过strings访问到的是binary。当然了,其实我们可以理解成两张哈希表,分别保留着不同类型的Key和Value值,便于用户访问,其实我们最频繁使用到的就是beam_lib:chunks/2,beam_ 阅读全文
posted @ 2013-02-28 10:01 文武双全大星星 阅读(4137) 评论(1) 推荐(0) 编辑
2013年2月26日
摘要: 有时候我们原先设计了一套系统,可是并没有按照otp的标准来实现,可是我们又想使用otp进程树的形式对其进行监督和管理时,这种情况下,我们就可以使用supervisor_bridge进行桥接。如果我们想将进程纳入进树的管理,一般来说,无非是实现gen_server, gen_event, gen_fsm等behaviour,然后用supervisor模块进行管理。所以supervisor_bridge本质上是一个实现了gen_server behaviour的模块,作为一个子系统进程的容器,定义了两个回调函数。init/1:supervisor_bridge进程初始化时,对子系统的回调。term 阅读全文
posted @ 2013-02-26 13:41 文武双全大星星 阅读(370) 评论(0) 推荐(0) 编辑
2013年2月19日
摘要: 其实一开始是看到mailinglist有对于这个的讨论,我就加上了自己的理解扩展概括了一下,存此。首先我们要确定erlang中像全局变量这种东西是不存在的,如果你非要保存一个全局的状态也并非不可以实现。1.使用ets,将其指定为public, 这个不用多说了,随取随用。2.将其保存在一个固定进程中,无论读取都对其发出message进行操作,这个本质上并不违反以进程为中心的原则。3.使用application:set_env, application:get_env(但我看了一下application_controller的源码,其实本质上也只是往一个叫ac_tab的public ets中读写, 阅读全文
posted @ 2013-02-19 19:06 文武双全大星星 阅读(1804) 评论(0) 推荐(0) 编辑
2013年2月1日
摘要: 首先来复习一下哈希的意思。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射。也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。因为散列值小于输入空间,所以也需要一定的解决冲突的算法来协调处理。常见的算法如:md5,sha等。所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确 阅读全文
posted @ 2013-02-01 11:18 文武双全大星星 阅读(1994) 评论(0) 推荐(1) 编辑
2013年1月25日
摘要: 说起元编程,lisp的抽象能力无疑是最强的,独特的S-expression和macro,简直是居家旅行,杀人必备之神器= =其实erlang的元编程能力也不弱。让我们一切先从smerl开始,慢慢了解erlang的metaprogrammingsmerl是erlyweb项目中内部使用的一个模块,它可以让我们很容易的动态创建编译模块,动态添加function等等。首先我们来热下身,先做个小功能,动态创建一个叫hello_world的模块,往中间添加一个echo函数,打印出"hello, world!"-module(test).-compile(export_all).test 阅读全文
posted @ 2013-01-25 15:47 文武双全大星星 阅读(711) 评论(0) 推荐(0) 编辑
2013年1月15日
摘要: 今天在将erlang部署到不同机器上时候,启动节点,发现net_adm:ping完全ping不通。按我以前的经验,首先ping了一下两台机器的ip,彼此间网络是没有问题的。又看了一下empd(你可以理解成就是erlang内部所使用的dns) 所使用的4369端口,同样也是可以的,这下纠结了……查了一下网上的资料,想起来erlang节点启动时候也监听的一个动态端口,用于数据传输。所以使用empd -names查看了一下,结果如下:再看看防火墙,果然悲剧了……但是节点监听的端点是动态变化的,我又不想把防火墙全部打开,查查kernel的文档,发现了这两个参数{inet_dist_listen_min 阅读全文
posted @ 2013-01-15 10:06 文武双全大星星 阅读(889) 评论(0) 推荐(0) 编辑
2013年1月8日
摘要: 在上一篇日志里,我介绍了cowboy 的socket pool —— ranch。接下来,接着来介绍cowboy,本篇主要介绍从接受到客户端消息请求,解析,一直到路由的过程。首先,我们需要看的是cowboy_protocol模块,这个模块就是和ranch的衔接点(请看我上一篇日志http://www.cnblogs.com/star-star/archive/2012/12/19/2824008.html的分析),首先来看看每个session的初始化逻辑过程。start_link(ListenerPid, Socket, Transport, Opts) -> Pid = spawn_l 阅读全文
posted @ 2013-01-08 11:11 文武双全大星星 阅读(509) 评论(1) 推荐(0) 编辑
2013年1月5日
摘要: Y组合子是用于lambda演算中实现递归逻辑的。当我们用erlang实现一个递归的匿名函数来完成阶乘,第一印象应该会写成如下这种形式:F = fun(1) -> 1; (N) -> N * F(N -1) end.如果我们在程序代码中按照这种方式书写,在数学推演中是不可能的,(虽然现代编程语言中有些编译器可以识别的),因为在lambda函数定义时,F还根本没有意义。这时候我们该怎么办呢, 如果要实现这种递归函数, 我能想到的就是把这个F变成约束变量,那么可以假设出另外存在一个高阶函数,将F作为参数传递进去,则得到F = fun(Func) -> fun(1) -> 1; 阅读全文
posted @ 2013-01-05 18:09 文武双全大星星 阅读(692) 评论(0) 推荐(0) 编辑