-
如何实现一个Web Server
最近重构了去年造的一个轮子 Vino。Vino 旨在实现一个轻量并且能够保证性能的 Web Server,仅关注 Web Server 的本质部分。在重构过程中,Vino 借鉴了许多优秀开源项目的思想,如 Nginx、Mongoose 和 Webbench。因此,对比上一个版本的 Vino,现在的 Vino 不仅性能得到提升,而且设计也更为优雅、健壮 :D。本文将会对 Vino 目前所具备的关键特性进行阐述,并总结开发过程中的一点心得。单线程 + Non-BlockingVino 整体采用...
-
CUDA Lab: Sum of Squares & Matrix Multiplication
CUDA(Compute Unified Device Architecture)是显卡厂商 NVIDIA 推出的运算平台,是一种通用的并行计算架构,该架构使 GPU 能够解决复杂的计算问题。我们可以使用 GPU 来并行例如神经网络、图像处理等在 CPU 上运行起来比较耗时的程序,通过 GPU 并行计算可以大大提高算法的运行速度。本实验包含两部分。 第一部分(Sum of Squares):计算数组元素的平方和,并通过不断的优化来提高程序的性能,以此来学习和理解 CUDA 编程需要注意之...
-
初探Webx之约定胜于配置
实习期间接触到了早有耳闻的Webx,于是很自然的按照官方文档运行了一个 Demo ,粗略的阅读了一下代码,发现并不能很快的梳理清Web请求的处理逻辑,以及视图层和控制层之间的关联关系。execute()为什么会被调用?doChinese()为什么会被调用?这是我当时的两个疑问,为了解答这些疑问,需要理解Web请求在Webx中经历的处理流程,为此我阅读了Webx部分源码,并以此文作为小结。在分析之前,我们需要强调Webx的一个重要设计理念——约定胜于配置。“约定”即规则,规则是预先定义的,工...
-
如何实现一个分布式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...