August 2011 Archives

乔帮主

| No Comments | No TrackBacks
By Matt Yohe and licensed under Creative Commons Attribution-Share Alike 3.0 Unported

在与癌症斗争了 7 年之后,Steve Jobs 今天正式向 Apple 董事会辞去了 CEO 职务。

让我们用 Apple 1997 年的广告 Think Different 来怀念这位科技界的领袖和属于他的时代:

Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They're not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can't do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do. - Apple Inc.

Because the people who are crazy enough to think they can change the world, are the ones who do.

netmap

| 4 Comments | No TrackBacks

今天 BAFUG 活动, Luigi Rizzo (十年前提出DEVICE_POLLING概念的那哥们) 带来了他在 FreeBSD 上新实作的 netmap

简单来说 netmap 实际上是提供了一种让用户程序以一致的接口直接访问网卡(收发包且zero copy)的方法。Luigi Rizzo 的测试中,用以 1050MHz 的单核,在很普通的万兆网卡上就可以轻松达到 14.8 Mpps 了,每个包的开销大约是90个时钟周期。

netmap 对网卡的驱动需要做少量修改,但基本都在30行以内。系统仍然可以"看到"用于netmap的网卡,这个接口暂时还不支持 kqueue(不过貌似暂时也没太大必要的说,毕竟一台机器不会有几千块网卡)。除了性能之外,netmap的设计还可以确保内核永远不崩,此外,现有的 libpcap 程序可以很容易地移植到 netmap 平台(取了一个路由平台做例子,使用 libpcap 兼容库可达到大约 70% 左右的 native API 性能;直接用 native API 的话,性能大约是经过优化的普通 libpcap+内核模块 的 Linux 环境的 4 倍)。

现在我自己想到的比较有用的用途是在用户态跑一个 TCP/IP 栈一类的应用----当然,应用程序可以跟这个 TCP 栈捆在一起。到会的 C记,J记 以及某测试公司的同学提出了不少问题,其中关于 netmap 需要复制哪些内存,这个东西对他们的业务来来说,用途会更直接一些。

这个暂时还没进 -CURRENT。立刻可以想到的改进包括尽量省掉对页表的改动。应用方面似乎可以给 nginx 啥的直接做个 TCP 栈之类的?省掉了 socket 需要的开销,TCP方面可以做的事情就很多了,比如两台机器可以互相推 TCP 状态之类的来做 HA,等等。

之前一直没什么概念,今天看了微软的 KB 321169 的解释,大致如此:

  • 客户端 (SMB Redirector) 如果启用了 security signature,则必须等待命令处理完成才会发出下一条SMB;
  • 服务器端如果启用了延迟ACK,则可能需要过200ms (Windows 2000)才会给出ACK回应

不过感觉这个解释依然不是很有说服力----文档上说,SMB服务器端是需要对 NT_TRANSACT_NOTIFY_CHANGE 给出回应的,那么这种情况下ACK不就回应回来了吗?或者说,只要收到了 ACK 就说明服务器端已经处理了这条 SMB?哪位帮忙理解一下?

Ruby 从下一个版本,也就是 1.9.3 开始,从原先的 GPLv2 许可证换成了 2-clause BSD 许可证(大体上相当于 MIT 许可证)。

早期 Ruby 采用的是自由软件基金会推荐的 GPLv2 or later 许可证方式。在实际操作中这种许可方式十分常见,这种许可证方式包含两层意思:

  • 软件本身以 GPLv2 许可证发布
  • 当自由软件基金会修订 GPL 并发布新版 GPL 时,授权一方同意受权人以新的 GPL 条款来发布软件 (*)

这其中 (*) 的部分实际上是开给自由软件基金会的一张空白支票,并且可能导致各式各样的法律问题。据我个人的了解,湾区企业的法务部门通常不允许公司以这种方式发布软件,因而,商业公司在使用 GPLv2 or later 许可证的软件时,通常会在发布代码的同时明确说明自己在使用这个软件时只遵循某个特定版本的GPL,以规避潜在的法律风险:

/*
 * [company] elects to have and use the contents of [filename] under and governed
 * by the GNU General Public License (GPL) Version 2, only.  However, the following
 * notice accompanied the original version of this file:
 */

然而,实际上这样使用代码也是有风险的。例如,如此这家厂商便无法同时使用 GPLv3 许可证的代码。因为GPLv2 中规定:

4. You may not copy, modify, sublicense, or distribute the Program except as
expressly provided under this License. Any attempt otherwise to copy, modify,
sublicense or distribute the Program is void, and will automatically terminate
your rights under this License. However, parties who have received copies, or
rights, from you under this License will not have their licenses terminated so
long as such parties remain in full compliance.

同时,GPLv2 中也规定:

6. Each time you redistribute the Program (or any work based on the Program), the
recipient automatically receives a license from the original licensor to copy,
distribute or modify the Program subject to these terms and conditions. You may
not impose any further restrictions on the recipients' exercise of the rights
granted herein. You are not responsible for enforcing compliance by third
parties to this License.

简而言之, GPLv2 only 的代码和 GPLv3 许可证的代码是不能一起 redistribute 的,原因是 GPLv3 中增加了包含对硬件和软件专利等问题而增加的一系列限制自由的条款(违反第6条),而另一方面,自由软件基金会又认为 Ruby License 是非自由软件授权,因此,GPLv3 许可证的软件又不能与 Ruby 以 Ruby License 联编,因为这样做违反 GPLv3 第10条的内容:

10. Automatic Licensing of Downstream Recipients.
[...]
You may not impose any further restrictions on the exercise of the rights
granted or affirmed under this License. For example, you may not impose a
license fee, royalty, or other charge for exercise of rights granted under
this License, and you may not initiate litigation (including a cross-claim
or counterclaim in a lawsuit) alleging that any patent claim is infringed
by making, using, selling, offering for sale, or importing the Program or
any portion of it.

由于 Ruby 只以两种许可证之一发布,因此,发布联编的可执行文件要么违反 GPLv2,要么违反 GPLv3,因此再发布的结果只能以源代码的形式提供,而不允许再发布其二进制文件。

自由软件基金会从 6.0 版开始,将 readline 库改为 GPLv3 or later,这样一来,GPLv2 only 的 Ruby 便不能发布联入了 readline 的可执行文件了。

为了因应自由软件基金会改换授权可能给最终用户带来的困扰,去年 9 月,Ruby Changeset r29262 将 Ruby 中的 GPLv2 许可证完全删除,并改换为基于 FreeBSD 许可证的 2-clause BSD 许可证,从而赋予了用户选择的权利。

感谢 Richard Stallman 和自由软件基金会使更多的人选择了 BSD 许可证。

Monthly Archives

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.3