July 13 / 2017
July 13 / 2017

redis源码笔记(一) —— 从redis的启动到command的分发

Luzeshu Thursday 0

我们知道redis也是一个普通的服务端程序,监听6379(默认)端口。从main函数启动,最终进入事件驱动库进行循环等待。比如node的libuv。那么redis自己实现了一个简单的事件驱动库,放在ae.c文件。并且对系统层面支持的IO复用接口进行了封装,比如epoll(linux)、kqueue(OS X、FreeBSD等)、evport(Solaris 10等)、select。来看下图,可以知... 阅读全文

July 12 / 2017
July 12 / 2017

下篇:express、koa1、koa2的中间件原理

Luzeshu Wednesday 0

上篇博客[《Es5、Es6、Es7中的异步写法》](https://luzeshu.com/blog/es-async)总结了es不同标准下的异步写法。 这篇博客总结分别依赖于es5、es6、es7的express、koa@1、koa@2的中间件机制。 阅读全文

July 11 / 2017
July 11 / 2017

上篇:es5、es6、es7中的异步写法

Luzeshu Tuesday 0

把异步执行的函数放进回调函数中是最原始的做法。 但是异步的层次太多时,出现的回调嵌套导致代码相当难看并且难以维护...... 阅读全文

January 18 / 2017
January 18 / 2017

gdb远程调试linux内核遇到的bug

Luzeshu Wednesday 3

在用qemu + gdb 调试linux内核时,遇到一个gdb的bug:“Remote 'g' packet reply is too long” ,记录一下。 阅读全文

January 18 / 2017
January 18 / 2017

从机器码理解RIP 相对寻址

Luzeshu Wednesday 4

RIP相对寻址 阅读全文

June 7 / 2016
June 7 / 2016

promise/bluebird源码

Luzeshu Tuesday 5

1. 带上几个问题看源码 1. promise链是如何实现的? 2. promise对象如何变成fulfill状态,并触发promise链条的后续函数?new Promise和Promise.resolve() 有何不同? *3. 为什么每执行.then就创建一个新的Promise对象,而不能使用第一个promise依次.then? 4. 如何对throw Error 和 reject进行... 阅读全文

April 19 / 2016
April 19 / 2016

node源码详解(七) —— 文件异步io、线程池【互斥锁、条件变量、管道、事件对象】

Luzeshu Tuesday 25

  在上篇博客讲到,网络io通过封装io观察者(uv__io_t),添加到loop->watcher_queue队列。在2.2节中讲到文件异步io不同于网络io,文件异步io把请求操作交给线程池处理,所有线程池的异步io操作统一由一个io观察者来管理,等线程池处理完毕再通过该io观察者告知事件循环(epoll_wait)有异步io操作完成,需要在事件循环的线程执行回调函数。   这篇博客分以下几... 阅读全文

April 18 / 2016
April 18 / 2016

node源码详解(六) —— 从server.listen 到事件循环

Luzeshu Monday 16

  我们在第3-5篇博客讲了js代码如何调用到C++接口的机制,其中暗含的require、process.binding这些过程。   这篇博客以server.listen(80)为例,讲这两点: 1. js代码深入、作用到libuv事件循环的过程【1.1节的问题2】 2. libuv事件循环本身的过程【1.1节的问题3】 阅读全文

March 19 / 2016
March 19 / 2016

node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

Luzeshu Saturday 5

  在上一篇博客(详解四)讲了 C++通过v8的Object类和FunctionTemplate类,创建对象、方法,设置属性、原型方法等,提供给运行时的 js代码调用。   那么这些C++实现的process对象、TCP类是否都在程序启动的时候就创建到 js的执行环境(context)呢?   不全是。process对象是(见5.2节),但 TCP类等C++内建模块不是(见5.3节)。 阅读全文

March 19 / 2016
March 19 / 2016

node源码详解(四) —— js代码如何调用C++的函数

Luzeshu Saturday 10

  上面讲到node调用Script::Compile()和Script::Run()解析执行app.js,并把io操作和callback保存到default_loop_struct,那么app.js里面js代码如何调用C++的函数呢?   在4.2节进行解释,先在4.1节来点知识预热。 阅读全文

March 19 / 2016
March 19 / 2016

linux下使用shadowsocks 做代理

Luzeshu Saturday 0

linux下使用shadowsocks 做代理 阅读全文

March 12 / 2016
March 12 / 2016

node源码详解(三)—— js代码在node中的位置,process、require、module、exports的由来

Luzeshu Saturday 14

  上篇博客2.1中提到src目录存放的是node的C++源码部分,包括main函数。   src/node_main.cc 和 src/node.cc(注:.cc是linux下的C++文件,类似windows下的.cpp)这两个文件就是node的入口文件。   其中node_main.cc里面仅仅作为一个入口,调用node.cc 文件中的node::Start()。 阅读全文

March 12 / 2016
March 12 / 2016

node源码详解(二 )—— 运行机制 、整体流程

Luzeshu Saturday 26

  node 主要的部分有4个【下图最左列就是node项目源码(v4.2.2)的根目录】: 1. 原生 js模块:node提供给 用户js 代码的类接口,平时用的require('fs')、require('http')调用的都是这部分的代码。【最左列的 lib文件夹,展开后是左二列】 2. node 源码:node程序的main函数入口;还有提供给lib模块的C++类接口。【最左列的 s... 阅读全文

March 12 / 2016
March 12 / 2016

node源码详解 (一)

Luzeshu Saturday 3

  分析源码(基于v4.2.2)之前,先带上几个问题: 1. node 如何执行js代码?在哪里? 2. js代码的异步io接口,如何作用到node?   调用server.listen(80)函数如何让node挂起?   而console.log('xxx')时node就退出? 3. 对“事件循环”这个词耳熟能详,那么具体细节如何? 4. node的文件异步io操作和网络异步io操作事实上并不一... 阅读全文