• node.js和websocket实现echo

    本文出自:【InTheWorld的博客】

         最近在学习Node.js,其中一章讲了WebSocket相关的内容。我看的书是《了不起的node.js》。这本书中实现了一个echo例子,但是我照书上做的程序却出现了错误。书中使用了express和websocket.io实现的这个例子。然而例子的express版本还是古老的2.5.1,最新的已经是4..了,所以出了问题也不奇怪。
         书中的服务器代码片段大概是这样的:

    var express = require('express')
        , wsio = require("websocket.io")
    
    var app = express.createServer();
    
    var ws = wsio.attach(app);
    
    app.use(express.static('public'));
    【查看更多】
  • 多核程序设计——缓存一致性协议MESI

    MESI协议

        在MP系统中,每个CPU都有自己独立的cache,缓存之间的一致性很很容易受到破坏的,所以缓存一致性协议就应运而生了。MESI是一种使用非常广泛的缓存一致性协议。

        MESI存在”modified”,”exclusive”,”shared”和”invalid”四种状态,协议可以在一个指定的缓存中应用这四种状态。因此,协议在每一个缓存行中维护一个两位的状态”tag”,这个”tag”附着在缓存行的物理地址或者数据后。

    • 处于“ modified” 状态的缓存行是由于相应的 CPU 最近进行了内存存储。并且相应的内存确保没有在其他 CPU 的缓存中出现。下边的图有一些误导嫌疑,可以把“叉”看做是invalid状态。这些图是《大话处理器》作者的图,这里直接偷过来了。

    modified

    • “exclusive”状态非常类似于“ modified” 状态,唯一的例外是缓存行还没有被相应的 CPU 修改,这表示缓存
    【查看更多】
  • 谈谈闭包

    我第一次听说“闭包”这个概念是在学习Lua的时候。由于此前并没有接触到函数式编程的语言,所以满脑子C/C++的思维方式的我被“闭包”困惑了很久。我找到了一个比较通俗的闭包定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。Lua的学习资料上一般都会有一个这样关于闭包的例子:

    function new_counter()  
        local n = 0 
        local function counter()        
            n = n + 1       
            return n    
        end 
        return counter
    end 
    
    c1 = new_counter()
    c2 = new_counter()
    print(c1())  //打印1 
    print(c2())  //打印2
    

    首先,new_counter()是一个返回函数的函数;然后这个被返回的counter函数会更改其外部函数(new_counter)的局部变量,并返回计数值。注… 【查看更多】

  • 多核程序设计——存储模型

    最近在看《现代体系结构上的UNIX系统——内核程序员的SMP和Caching技术》,这里抄点东西作为笔记吧!
    顺序存储模型强制存储器操作(load和store)都按照程序次序来执行,即这些指令是按照在随程序执行的指令流中出现的顺序次序来执行的。它也指定了,由不同处理器完成的load和store操作也要以某种顺序、但又是非确定性的方式排序。这种存储模型应该是大家最容易理解的,甚至都认为实际MP也是这样工作的。但是,这种存储结构是非常落后的,现代处理器应该已经淘汰了这种结构。
    书中讲到了一个例子,如下;

            处理器一           处理器二
            store %r1, A        store %r1, B
            load %r2, B        load %r2, A
    

    在强定序(strong order)的系统中,一共有四种可能的存储排序。但是可以肯定的是最后一条指令一定是load指令,也就是说至少有一条load指令会读… 【查看更多】

  • MySQL服务器连接过程分析

    本文出自:【InTheWorld的博客】

           mysqld是MySQL服务器端主进程,可以说mysqld是MySQL的真正核心,一切工作都是围绕mysqld进程进行的。所以要解剖mysql这个庞然大物,mysqld的代码是最好的突破口。
           一切都是从熟悉的main()函数开始的,其实是从mysqld_main()函数开始的。这些代码都在mysqld.cc。mysqld_main()随后调用了win_main)()。win_main()函数主要是做了一些初始化的工作。
           初始化工作完成之后,MySQL已经做好准备接受连接了。然后我们的主角Handle_connections_methods()函数登场了。这个函数的主要工作是新建3个子进程,他… 【查看更多】

  • MySQL中innodb引擎分析之初始化

    本文出自:【InTheWorld的博客】

    • MySQL的存储引擎是以插件形式工作的,这应该是MySQL的一大特色了吧!根据《深入理解MySQL》的内容,5.1版本时存储引擎的插件化都还不是彻底,确切的说是刚添加的特性。为MySQL添加一个存储引擎时,需要更改一些上层代码,零散的更改本来就有点麻烦,同时工程也要重新编译一次。我听别人说,已经可以不改C/C++代码就直接添加引擎了。这样的话,折腾存储引擎的话就更方便了!
    • 这段代码来自ha_innodb.cc,这是MySQL中申明存储引擎插件的标准过程。这段代码利用了宏。在plugin.h中有比较完整的定义。
    mysql_declare_plugin(innobase)
    {
      MYSQL_STORAGE_ENGINE_PLUGIN,
      &innobase_storage_engine,
      innobase_hton_name,
      plugin_author,
    【查看更多】
  • C++RTTI小总结

            RTTI算是C++的一大特性之一了,但也是一个不太好懂的特性。以前一直没有理解清楚RTTI。通过最近的学习,似乎掌握了一点皮毛,这里做一个小总结。首先是《C++编程思想》上的一个例子,由于缺头文件,我把容器改成了vector。

    #include <iostream>  
    #include <time.h>  
    #include <typeinfo.h>  
    #include <vector>  
    #include <stdlib.h>  //for srand() and rand()  
    using namespace std;  
      
    class shape {  
    protected:  
        static int count;  
    public:  
        shape() { count++; }  
        virtual ~shape()
    【查看更多】
  • Java解释器浅析

           解释器是Java虚拟机非常重要的一部分,它的工作就是把字节码转化为机器码并运行。Hotspot中实现了两种具体的解释器,分别是模板解释器而C++解释器。同时在Hotspot的源码树中还保留着一种“字节码解释器”的古老解释器。这种解释器没有编译优化,效率比较低,本质上就是一个比较长的switch语句,针对不同的字节码执行不同的操作。这些操作直接以C/C++语言的形式表现出来,随着项目的编译一起形成了“硬性的”机器代码。相比之下,模板解释器的工作要更为复杂一些,效率也会更高一些。 模板解释器的主要构成:1.解释器,读取字节码,一边翻译一遍执行;2.代码生成器:利用宏汇编器向代码缓存空间… 【查看更多】

  • C++静态成员变量

    今天在弄一段代码的时候遇到了静态成员变量的问题。卡了一段时间后,果断翻出《深入探索C++对象模型》,大概明白了问题所在。这事给我的一点启示就是“纸上得来终觉浅,绝知此事要躬行”。首先看看问题吧!其实就是一个类型的定义。代码如下:

    //myApplication.cpp  
    #include "myapplication.h"  
    #include <iostream>  
    using std::cout;  
    using std::endl;  
      
    myApplication::myApplication(string _appName):appName(_appName)  
    {  
        if(self!=0)  
            return;  
        else  
            self=this;  
    }  
    void myApplication::printAppname()  
    {  
        cout<<appName<<endl;  
    }  
    myApplication*
    【查看更多】
  • Lua调用C函数的实现

    本文出自:【InTheWorld的博客】

            看Lua有一段时间了,说实话进展挺慢的。归根到底是因为“动机不纯”,我确实不是抱着学Lua的心态去看资料的。本来看Lua就是听说Lua的实现比较简单,可以借Lua理解解释性语言的一些细节实现。当然Lua也确实不简单的,闭包什么的概念以前都没听说过。没用过Lua却去硬啃Lua语言实现,我也是蛮拼的!
        我主要的参考资料是云风大神的《Lua源码赏析》和高手翻译的《LUA中文教程》。这里我想记录一下函数调用的过程。按照函数调用这条线串联一下各各知识点。首先要从字节码开始了。Lua虚拟机的指令集中有两条用于函数调用的字节码。

    OP_CALL,/*  A B C   R(A), ... ,R(A+C-2) := R(A)(R(A+1), ...
    【查看更多】