• 如何实现一个分布式RPC框架

    远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC的主要目标是让构建分布式应用更加容易,在提供强大的远程调用能力的同时不损失本地调用的语义的简洁性。趁实习前的这段业余时间,我实现了一个轻量级的分布式RPC框架,名字叫做 buddha,代码量不大,但是麻雀虽小却五脏俱全。本篇文章将一步步阐明buddha的设计、框架组件的拆解以及需要考虑的因素。序列化与反...

  • CSAPP: Attack Lab

    Attack Lab是CS:APP一书中第三个实验,包括Part I和Part II两部分,分别实现Code Injection Attacks和Return-Oriented Programming。Code Injection Attacks主要利用缓冲区溢出执行不安全的代码片段;当栈被标记为nonexecutable或者位置随机时,可以利用Return-Oriented Programming达到攻击的目的。目前的进度是完成了Part I,等有时间再回来完成Part II。Part ...

  • 6 824 Lab 1 Mapreduce

    开始学习大名鼎鼎的MIT 6.824: Distributed Systems课程,我跟的是2016年的课程,课程的主要内容是读Paper和做Lab,使用的语言为Go。五一假期期间我基本做完了Lab 1,感觉难度还是相当大的。本篇文章是我对Lab 1的一个总结。MapReduce每次读MapReduce论文,都会有新的收获,也自知还有理解不到位的地方。Execution Overview 输入数据被划分为M个分片,由map worker产生的中间key-value pairs被划分为R个...

  • CSAPP: Bomb Lab

    Bomb Lab是CS:APP一书中第二个实验,实验中的bomb实际上是一个程序的二进制文件,该程序由一系列phase组成,每个phase需要我们输入一个字符串,然后该程序会进行校验,如果输入的字符串不满足拆弹要求,那么就会打印BOOM!!!。完成整个实验的思路是通过objdump对bome进行反编译(objdump -d bomb > bomb.txt),获取所有的汇编代码。提取每个阶段对应的代码并借助gdb进行分析,逐一拆弹。Phase 1phase_1对应的代码如下所示。000...

  • 理解Golang中的defer

    关键字defer用于实现延迟调用,根据Golang官方的定义:A defer statement defers the execution of a function until the surrounding function returns. 。但是,当返回值与defer相互关联时,如果没有正确理解defer与return真正的执行顺序,那么容易出现一些不可描述的现象。我们先运行如下代码,根据运行结果来理解defer,在查看运行结果之前,不妨先想想main函数的输出是什么。packag...

  • 谈谈ThreadLocal

    Java并发编程实战 一书在介绍ThreadLocal类时(第3章),书中有这么两段话,在我初次阅读时不知道如何去理解。 ThreadLocal对象通常用于防止对可变的单实例变量(Singleton)或全局变量进行共享。 当某个频繁执行的操作需要一个临时变量,例如一个缓冲区,而同时又希望避免在每次执行时都重新分配该临时对象,就可以使用这项技术。例如,在Java 5.0之前,Integer.toString()方法使用ThreadLocal对象来保存一个12字节大小的缓冲区,用于对结果进...

  • 如何实现一个Java Class解析器

    最近在写一个私人项目,名字叫做ClassAnalyzer,ClassAnalyzer的目的是能让我们对Java Class文件的设计与结构能够有一个深入的理解。主体框架与基本功能已经完成,还有一些细节功能日后再增加。实际上JDK已经提供了命令行工具javap来反编译Class文件,但本篇文章将阐明我实现解析器的思路。Class文件作为类或者接口信息的载体,每个Class文件都完整的定义了一个类。为了使Java程序可以“编写一次,处处运行”,Java虚拟机规范对Class文件进行了严格的规定...

  • CSAPP: Shell Lab

    这个实验通过实现一个支持作业控制的Unix Shell,让我们对进程控制和信号控制更加熟悉。课程Lab已经帮助我们搭建起了Shell的整体框架,并实现了与本次实验不太相关的代码,核心部分需要我们自己完成。整体框架Shell从标准输入(stdin)读取用户输入的命令,然后解析命令,Shell支持两种类型的命令:如果用户输入的是的内置命令(如quit、jobs等),那么直接执行该命令;如果用户输入的是某个可执行文件的路径,那么通过fork一个子进程,在子进程中加载并执行命令。Shell把每次用...