• Why wait/notify must be called in a synchronized block

    在 Java 并发编程中,调用 Object wait/notify 方法的代码段必须要被包含在 synchronized 块中,接着即是耳熟能详的:调用 wait 方法时,先释放锁,然后线程进入阻塞状态,直至被 notify,然后重新尝试获得锁。看似一气呵成的一顿猛如虎的操作,其个中缘由到底是什么?有些我们看起来理所当然的东西,难道真的是理所当然的吗?本篇文章即谈谈,为什么调用 wait/notify 方法的代码段必须要被包含在 synchronized 块中。先从 官方文档 入手,官方...

  • 2017年度总结与2018年度计划

    今年事情比较多,重要的事情有两件,一是还有 6 个月就要毕业,这意味着留给我在学校里纯粹打磨技术的时间已经不多了;二是确定了自己的职业生涯将会从阿里开始,这意味着什么我暂时还不确定。去年此时,我认为自己一定会去试水一大堆公司,但是实际上我只投了寥寥几个,整个过程比我预想的要顺利,我想究其原因自然离不开这几年几乎不间断的积累,但是也有运气的成分在。上半年读了不少 paper 和技术书籍。在阅读的过程中,我喜欢在学习到一个新的知识点后,尽可能的通过一段程序去验证,那么理解的程度很可能会从「 意...

  • 如何实现一个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个...