自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

西代零零发

既然选择远方,便只顾风雨兼程

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

原创 操作系统内核Hack:(四)内核雏形

操作系统内核Hack:(四)内核雏形在本系列的前一篇文章《操作系统内核Hack:(三)BootLoader制作》中,我们制作出了一个两阶段引导BootLoader,并进入了一个内核的空壳main函数。本文我们继续完善引导程序和内核,让内核的内容一点点充实起来。本文的代码可以参考GitHub上的MiniOS分支kernel_prototype。1.周边代码修改1.1 常量和宏提取像各个模块的内存这种常

2015-10-25 16:32:19 3499

原创 操作系统内核Hack:(三)引导程序制作

操作系统内核Hack:(三)BootLoader制作关于本文涉及到的完整源码请参考MiniOS的v1_bootloader分支。1.制作方法现在我们已经了解了关于BootLoader的一切知识,让我们开始动手做一个BootLoader吧!但真正开始之前,我们还要做出一个选择,在之前的讨论中我们曾说过,有两种学习和制作引导程序和操作系统内核的路线:1)《Orange’s:一个操作系统的实现》书中的路线

2015-10-25 16:23:03 6909

原创 操作系统内核Hack:(二)底层编程基础

操作系统内核Hack:(二)底层编程基础在《操作系统内核Hack:(一)实验环境搭建》中,我们看到了一个迷你操作系统引导程序。尽管只有不到二十行,然而要完全看懂还是需要不少底层软硬件知识的。本文的目的就是跟大家一起学习这一部分知识,本着够用就行的原则,不会完全铺开来,只要能让我们顺利走完未来的操作系统内核Hack之旅就可以了。1.开篇:“古怪”的80386如果大家跳过这一部分直接看本文后面的部分,或

2015-10-09 21:22:54 7546

原创 用Netty开发中间件:高并发性能优化

用Netty开发中间件:高并发性能优化最近在写一个后台中间件的原型,主要是做消息的分发和透传。因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本。Netty果然效率很高,不用做太多努力就能达到一个比较高的tps。但使用过程中也碰到了一些问题,个人觉得都是比较经典而在网上又不太容易查找到相关资料的问题,所以在此总结一下。1.Context Switch过高

2015-10-08 20:52:23 71312 28

原创 C实战:项目构建Make,Automake,CMake

C实战:项目构建Make,Automake,CMake在本系列文章《C实战:强大的程序调试工具GDB》中我们简要学习了流行的调试工具GDB的使用方法。本文继续“C实战”的主题,对同样非常流行的构建工具Make的用法和原理一探究竟,并顺便看一下一些高级衍生产品。1.Make基础首先我们编写一个简单的C项目,以此项目在实战中学习Make的相关知识。更全面的介绍请参考官方手册。cdai@vm /syspa

2015-10-08 20:51:12 9796

原创 分布式一致性协议Raft原理与实例

分布式一致性协议Raft原理与实例1.Raft协议1.1 Raft简介Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法。目前,在各种主流语言中都有了一些开源实现,比如本文中将使用的基于JGroups的Raft协议实现。关于Raft的原理,强烈推荐动画版Raft讲解。1.2 Raft原理在Raft中,每个结点会处于下面三种状态中的一种:follower

2015-09-30 20:43:40 20566 24

原创 Redis Cluster架构优化

Redis Cluster架构优化在《全面剖析Redis Cluster原理和应用》中,我们已经详细剖析了现阶段Redis Cluster的缺点:无中心化架构 Gossip消息的开销不停机升级困难无法根据统计区分冷热数据客户端的挑战 Cluster协议支持连接和路由表的维护开销MultiOp和Pipeline支持有限Redis实现问题 不能自动发现不能自动Resharding

2015-09-25 15:01:09 23548 14

原创 全面剖析Redis Cluster原理和应用

全面剖析Redis Cluster原理和应用1.Redis Cluster总览1.1 设计原则和初衷在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子。最核心的目标有三个:性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、异步复制、客户端重定向等设计,而牺牲了部分的一致性、使用性。

2015-09-18 20:27:03 103525 40

原创 操作系统内核Hack:(一)实验环境搭建

操作系统内核Hack:(一)实验环境搭建三四年前,心血来潮,入手《Orange’s:一个操作系统的实现》学习操作系统内核,还配套买了王爽的《汇编语言(第二版)》和《80X86汇编语言程序设计教程》,虽然Orang’s只看了不到三分之一,但当时还是很认真的,练习也做了不少。唯一遗憾的就是没有留下文字记录,导致现在忘得差不多一干二净了,后悔不已!如今想再捡起来,弥补当时的懒惰,虽然困难重重,但这么优秀的

2015-09-13 12:11:33 6109 3

原创 Docker新手入门:基本用法

Docker新手入门:基本用法1.Docker简介1.1 第一本Docker书工作中不断碰到Docker,今天终于算是正式开始学习了。在挑选系统学习Docker以及虚拟化技术的书籍时还碰到了不少麻烦,主要就是没有特别经典的书!Docker的《第一版Docker书》和《Docker技术入门与实战》普遍评价不高,而《Docker开发实践》和《Dockeru源码分析》又是2015年最近才出的,评价不是很多

2015-09-04 09:29:21 44190 6

原创 Jedis分片Sentinel连接池实验

Jedis分片Sentinel连接池实验1.起因众所周知,Redis官方HA工具Sentinel已经问世很久了,但令人费解的是,Jedis官方却迟迟没有更新它的连接池。到目前Maven库中最新的2.7.3版本为止,都只能要么使用分片连接池,要么使用不分片的Sentinel连接池。如果既进行了Sharding,又对每组的主从实例配置Sentinel进行监控,怎么办?答案是只能自己开发了,晕!还好万能的

2015-08-29 08:15:42 14420 11

原创 Netty 4源码解析:请求处理

Netty 4源码解析:请求处理通过之前《Netty 4源码解析:服务端启动》的分析,我们知道在最前端“扛压力”的是NioEventLoop.run()方法。我们指定创建出的NioServerSocketChannel就是注册到了NioEventLoop中的Selector上。所以我们继续顺藤摸瓜,看看服务端启动完成后,Netty是如何处理每个请求的。1.MainReactor1.1 事件轮询之前我

2015-08-29 08:14:51 9124 3

原创 用Netty开发中间件:网络编程基础

跟Netty 4学网络编程《Netty权威指南》在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对《Netty权威指南(第二版)》吐槽一下:前半本的代码排版太糟糕了,简直就是直接打印Word的版式似的。源码解析部分的条理性和代码排版好多了,感觉比其他部分的质量高多了。如果你是初学者可能会感觉很详细,几乎每部分都会来一套客户端和服务端的Demo,如果你不是入门

2015-08-23 22:24:48 7561 4

原创 Netty 4源码解析:服务端启动

Netty 4源码解析:服务端启动1.基础知识1.1 Netty 4示例因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象。而且5.0的变化也不像4.0这么大,好多网上的例子都已经过时了。 <dependency> <groupId>io.netty</groupId> <artifactId>netty-

2015-08-22 11:29:12 12373 1

原创 Redis监控工具,命令和调优

Redis监控工具,命令和调优1.图形化监控因为要对Redis做性能测试,发现了GitHub上有个python写的RedisLive监控工具评价不错。结果鼓捣了半天,最后发现其主页中引用了Google的jsapi脚本,必须在线连接谷歌的服务,Stackoverflow上说把js脚本下载到本地也没法解决问题,坑爹!正要放弃时发现了一个从RedisLive fork出去的项目redis-monitor,

2015-08-16 09:10:21 45565 10

原创 高效程序员的狂暴之路

不觉间已经工作六年,回想第一天实习的场景历历在目、恍若昨日。六年已足以令许多人转管理、转产品、转测试、转行,也一定有人还在坚守着编码,只因热爱。遇到过形形色色的经理、架构师、运维、性能工程师等等,还是觉得写代码的才是最厉害的!在这里分享一些这些年来修习到的个人心得。也许并不适用于其他人,但对于我却都是最珍贵的“宝藏”。也谨以此文纪念在代码堆里度过的青春~ 看到这些点点滴滴的收获,就会感到所有逝去的光

2015-08-11 21:31:20 6116 9

原创 豌豆夹Redis解决方案Codis源码剖析:Dashboard

豆瓣Redis解决方案Codis源码剖析:Dashboard1.不只是Dashboard虽然名字叫Dashboard,但它在Codis中的作用却不可小觑。它不仅仅是Dashboard管理页面,更重要的是,它负责监控和指挥各个Proxy的负载均衡(数据分布和迁移)。并且,所有API都以RESTFul接口的形式对外提供,供Proxy和codis-config(Codis的命令行工具)调用。下面就来看一下

2015-08-08 10:32:55 10421 14

原创 负载均衡LVS(DR模式)安装实战

1.编译安装ipvsadm首先从LVS官网下载tarball,解压后make && make install即可。要注意的是LVS的依赖有:popt-static、libnl、kernel。如果yum源里有就直接安装,如果没有就自行下载,但一定要对应上已有软件如popt或Linux内核的版本。$ tar -xzvf ipvsadm-1.26.tar.gz$ cd ipvsadm-1.26$ ma

2015-08-08 10:30:47 3966

原创 豌豆夹Redis解决方案Codis安装使用

豆瓣Redis解决方案Codis安装使用1.安装1.1 Golang环境Golang的安装非常简单,因为官网被墙,可以从国内镜像如studygolang.com下载。[root@vm root]$ tar -C /usr/local -zxf go1.4.2.linux-amd64.tar.gz[root@vm root]$ vim /etc/profileexport GOROOT=/usr/

2015-07-25 07:48:45 27278 6

原创 六星经典CSAPP-笔记(12)并发编程(上)

六星经典CSAPP-笔记(12)并发编程(上)1.并发(Concurrency)我们经常在不知不觉间就说到或使用并发,但从未深入思考并发。我们经常能“遇见”并发,因为并发不仅仅是操作系统内核的“绝招”,它也是应用开发中必不可少的技巧:访问慢I/O设备:就像当应用程序等待I/O中的数据时内核会切换运行其他进程一样,我们的应用也可以用类似的方式,将I/O请求与其他工作重叠从而挖掘并发的潜能。推迟工作

2015-07-18 14:19:02 2960

原创 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

豆瓣Redis解决方案Codis源码剖析:Proxy代理1.预备知识1.1 CodisCodis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy based high performance Redis cluster solution written in Go/C, an alternative to Twemproxy. It supports mul

2015-07-03 21:33:18 15665 27

原创 序列化战争:主流序列化框架Benchmark

序列化战争:主流序列化框架BenchmarkGitHub上有这样一个关于序列化的Benchmark,被好多文章引用。但这个项目考虑到完整性,代码有些复杂。为了个人学习,自己实现了个简单的Benchmark测试类,也算是总结一下当今主流序列化框架的用法。1.序列化的战争按照序列化后的数据格式,主流的序列化框架主要可以分为四大类:JSON、二进制、XML、RPC。从更高层次来说,JSON和XML都可以算

2015-07-03 21:26:41 6362

原创 Java程序员的Golang入门指南(下)

Java程序员的Golang入门指南(下)4.高级特性上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号、函数多返回值、switch-case默认break、函数闭包、集合切片等特性相比Java的确提高了开发效率,但这些在其他语言中也都有,并不是Golang能真正吸引人的地方。不仅是Golang,我们学习任何语言当然都是从基本语法特性着手,但学习时要不断地问自己:使这门语言区

2015-07-03 21:23:26 4303

原创 用Netty解析Redis网络协议

用Netty解析Redis网络协议根据Redis官方文档的介绍,学习了一下Redis网络通信协议。然后偶然在GitHub上发现了个用Netty实现的Redis服务器,很有趣,于是就动手实现了一下!1.RESP协议Redis的客户端与服务端采用一种叫做 RESP(REdis Serialization Protocol)的网络通信协议交换数据。RESP的设计权衡了实现简单、解析快速、人类可读这三个因素

2015-06-19 21:45:40 11651 5

原创 Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南1.序言Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis、类Evernote的云笔记leanote等。1.1 为什么要学习如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵。如果你是某种语言老手,你就是那门语言的“传道者”,下意识地会保护它。无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的。《肖申克的救赎》对此有很好

2015-06-19 21:43:06 22924 2

原创 Apache Curator入门实战

Apache Curator入门实战Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。1.Zookeeper安装部署Zookeeper的部署很简单,如果已经有Java运行环境的话,下载tarball解压后即可运行。[root@vm Temp]$ wget http://

2015-06-12 21:22:32 38816 5

原创 C实战:强大的程序调试工具GDB

C实战:强大的程序调试工具GDB1.基本调试这里只列举最最常用的GDB命令。1.1 启动GDBgdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。1.2 添加断点b function:为函数设置断点。b是break的缩写,除了函数名,还可以是地址、当前执行处的+/-偏移等。1.3 运行程序run args:开始运行程序,run后面可以加程序需要的参数,就像在命令行正常

2015-06-12 21:21:02 6604

原创 CSAPP缓冲区溢出攻击实验(下)

CSAPP缓冲区溢出实验(下)3.3 Level 2: 爆竹实验要求这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将global_value的值修改为cookie。因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆

2015-06-12 21:16:32 9399 5

原创 程序员的自我修养:(1)目标文件

程序员的自我修养:(1)目标文件1.目标文件1.1 编译与链接在使用像Visual Studio或Qt Creator等IDE时,通常有一个叫做“构建”的按钮。当编辑完成要运行和测试时点一下它,程序就能跑起来了,所以我们很少关心编译和链接。其实,编译和链接合并在一起就称为 构建(Build)。简单的一次按键,实际背后却是异常复杂的过程:预编译(Preprocessing)编译(Compilati

2015-06-05 21:59:02 8119 2

原创 CSAPP缓冲区溢出攻击实验(上)

C实战:CSAPP缓冲区溢出实验(上)下载实验工具,最新的讲义在这。网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上。不过没有关系,大体上只是程序名(sendstring)或者参数名(bufbomb -t)的差异,不影响我们的实验。1.实验工具1.1 makecookie后面实验中,五次“攻击”中有四次都是使你的cookie出现在它原本不存在的位置,所以我们首先要为自己产生一个co

2015-06-05 21:55:59 15878 1

原创 Redis源码学习:字符串

Redis源码学习:字符串1.初识SDS1.1 SDS定义Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构。SDS不仅用于 保存字符串,还用来当做缓冲区,例如AOF缓冲区或输入缓冲区等。如下所示,整数len和free分别表示buf数组中已使用的长度和剩余可用的长度,buf是一个原生C字符串,以\0结尾。sds就是sdshdr中char buf

2015-05-30 08:05:29 2971 5

原创 六星经典CSAPP-笔记(7)加载与链接(上)

六星经典CSAPP-笔记(7)加载与链接1.对象文件(Object File)1.1 文件类型对象文件有三种形式:可重定位对象文件(Relocatable object file):包含二进制代码和数据,能与其他可重定位对象文件在编译时合并创建出一个可执行文件。可执行对象文件(Executable object file):包含可以直接拷贝进行内存执行的二进制代码和数据。共享对象文件(Sh

2015-05-22 22:15:46 7386 3

原创 Redis源码学习:Lua脚本

Redis源码学习-Lua脚本1.Sublime Text配置我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考《Sublime Text 3下C/C++开发环境搭建》。要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\u

2015-05-22 22:04:33 3545 4

原创 六星经典CSAPP-笔记(10)系统IO

六星经典CSAPP-笔记(10)系统I/O1.Unix I/O所有语言的运行时系统都提供了高抽象层次的I/O操作函数。例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓冲功能的函数;C++中则重载了<<和>>用来支持读写。在Unix系统中,这些高层次的函数基于Unix的系统I/O函数来实现,多数时候我们都无需直接使用底层的Unix I/O。但学习Unix系统I/O能更好地

2015-05-16 22:40:06 2959

原创 六星经典CSAPP-笔记(11)网络编程

六星经典CSAPP-笔记(11)网络编程参照《深入理解计算机系统》简单学习了下Unix/Linux的网络编程基础知识,进一步深入学习Linux网络编程和TCP/IP协议还得参考Stevens的书。1.网络基础(略过,待补充)2.IP地址2.1 IP地址的表示IP地址是一个无符号的32位整数。Linux网络程序使用下面这种IP地址结构存储IP地址:/* Internet address structu

2015-05-15 21:48:54 4193

原创 Markdown语法及SublimeText下使用技巧

Markdown语法及SublimeText下使用技巧0.缘起最近因为一直在学习Sublime Text,所以也就顺便试用了一下ST对Markdown的支持。正好CSDN正在大力宣传新上线的Markdown编辑器,所以方便了日后的博客发布。首先说一下与Office Word相比,最深刻的几点体会吧:专注写作内容:不再纠结字体、标题大小、行间距等等版式问题,专注于文章内容本身的编写。一边看电子书,一

2015-05-15 21:42:12 17984 3

原创 Sublime Text 3下C/C++开发环境搭建

Sublime Text 3下C/C++开发环境搭建之前在Linux Mint 17一周使用体验中简单介绍过Sublime Text。1.Sublime Text 3安装Ubuntu、Linux Mint的软件管理器中已经能够找到Sublime Text 3,直接安装即可。或者去官网下载.deb或tarball安装包,手动安装。2.Package Control管理器ST最吸引我的第一点就是这个非常

2015-05-15 21:32:57 129914 10

原创 Leetcode难度表及解题汇总

Leetcode难度表及解题汇总参考网上一份题目难度表,以及本人的解题。 Id Question Difficulty Frequency Data Structures Algorithms Blog Comment 1 Two Sum 2 5 array+set sort+2ptr 2 Add Two Numbers

2015-05-08 22:08:21 4250

原创 ANTLR和StringTemplate实例:自动生成单元测试类

ANTLR和StringTemplate实例:自动生成单元测试类1. ANTLR语法要想自动生成单元测试,首先第一步就是分析被测试类。这里以Java代码为例,用ANTLR对Java代码进行分析。要想靠自己完全手写出一门语言的ANTLR语法文件的复杂程度难以想象,很贴心的是在ANTLR的GitHub网站上列出了很多常见语言的语法文件,例如Java,Sqlite和MySQL的SQL语法等。有了.g4语法

2015-05-08 22:05:44 6594

原创 Linux Mint 17一周使用体验

1 Win7下安装Mint双系统Linux Mint支持直接从Win7硬盘引导安装,非常方便,不用制作U盘引导,更不用刻盘安装了。Mint有Cinnamon和Mate两种桌面,听说Mate更加简洁节省资源,所以就选择了Linux Mint 17 Mate版。安装过程主要参考百度经验。1.1 清理磁盘空间为Mint清理出空间。例如我的机器之前有C、D、E、F四个盘符,备份好E和F盘中的重要数据后,右

2015-04-30 21:37:39 39809 11

空空如也

空空如也

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

TA关注的人

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