网络权威 Jennifer Rexford 教授给研究生的忠告

译者按:Jennifer Rexford 是普林斯顿大学教授、网络研究圈子里呼风唤雨的大牛。她在 2010 年给新入学的工程领域研究生做了个报告:Advice for New Graduates

了解我的人都知道我有收集名言的爱好。一句话解释这背后的故事:名言短小便携,对小时候经常搬家的我来说是一个合适的爱好。20 世纪 30 年代普林斯顿的两个著名科学家,爱因斯坦和托马斯·路易斯,分别对 “个体” 所处的角色发表了有趣而有些对立的评论。

物理领域的爱因斯坦说:“人类社会所有有价值的东西依赖于个体发展的机会。”

药学、生物学领域的托马斯·路易斯则说,“事实上不存在单个个体这样的生物;他自己的生命并不比从皮肤表面上扯下来的一个细胞多什么。”

这两句名言很好地概括了研究生是干什么的。

继续阅读“网络权威 Jennifer Rexford 教授给研究生的忠告”

大话同步/异步、阻塞/非阻塞

好多人搞不清这两组概念之间的区别。我们拿小明下载文件打个比方。

  1. 同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
  2. 同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
  3. 异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)
  4. 异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

也就是说,同步/异步是下载软件的通知方式,或者说 API 被调用者的通知方式。阻塞/非阻塞则是小明的等待方式,或者说 API 调用者的等待方式。

继续阅读“大话同步/异步、阻塞/非阻塞”

编译:一个 C 程序的艺术之旅

正在学习 CS50(一门 MOOC)的 @张静宁 写了一篇《【读图学 C 语言】编译时发生了什么》。她的文章更多讲的是 “what”,本文将尝试解释一些 “why”。

C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理、编译、汇编、链接这四道工序?让我们从这段简单的 C 程序开始。

为什么要编译

这并不是一个简单的问题。我们知道 Python 代码不需要 “编译”,输入一行代码就可以运行出结果了,对用户很友好有木有!这种交互式的运行环境被称为 REPL(Read-Evaluate-Print-Loop),也就是读取用户输入的语句,执行语句,输出语句的值,再返回到等待输入状态。 继续阅读“编译:一个 C 程序的艺术之旅”

给开源编译器插入后门

说起 Ken Thompson,我们首先想到的是他发明的 UNIX 操作系统。他因此获得 1984 年的图灵奖。在图灵奖演讲上,Ken Thompson 提出了一个深刻的问题:看到了软件的源码,就意味着没有后门吗?编译器是否可能存在能自我复制的后门?

KenThompson

这篇发表在《ACM 通讯》上的论文只有短短三页,省略了很多细节。原理上有点像输出自身代码的 C 程序,但又比它难很多。我追随先哲的脚步,给一个开源 C 编译器——tcc 插入了能自我复制的后门,这个插入了后门的编译器在编译 Linux 登录程序 sulogin 的源码时,会自动插入一个后门。

继续阅读“给开源编译器插入后门”

3G 为什么比 Wi-Fi 费电

前天张擎宇同学告诉我,在有 Wi-Fi 的时候最好使用 Wi-Fi 并关掉 3G 网络,可以省很多电。3G 真的比 Wi-Fi 费电吗?我查阅了文献,发现果真如此。当要传输的数据较少时,电源消耗的差距可以大到 10 倍之多。

蓝线:3G 功耗;绿线:wifi 功耗(来源:TailEnder)
蓝线:3G 功耗;绿线:wifi 功耗;紫线:考虑了 wifi 扫描和建立连接之后的功耗(来源:TailEnder)

原因主要有两方面:

  1. 3G 网络完成数据传输后要保持一段时间的高功率状态;
  2. 3G 网络的发射功率远大于 Wi-Fi 网络。

继续阅读“3G 为什么比 Wi-Fi 费电”