把 vfs 实现好了
极尽简洁,然过犹不及(As simple as possible, but not simpler.)——爱因斯坦
这段时间的工作是把上次提到的 VFS 系统实现了。而写这篇 Blog 的促因是 twitter 上有同学想让我谈谈对 Linus 最近的一篇老生常谈的看法。哦,看似既然是语言之争。C 好,还是 C++ 好。但这次他平和了许多。Linus 惯有风格依旧,但少了些须三年前的争论 中的刻薄。
我想说,C 的三个特质(见引用文最后一段) 哪一点都不可忽略。Linus 这次强调的大约是第三点,也是 C++ 程序员们不屑一顾的一点。可对于多人协作构建的项目,这一点实在是太重要了。这并不是人人都聪明就能回避的问题。如果程序员们都足够睿智,反而更能意识到沟通之成本。其实即使是你一个人在做整个项目,从前的你和现在的你以及将来的你,同样有沟通(记忆)的成本。人不可能两次踏进同一条河流。
我的观点在于,如非必要,勿增概念。这是我这次翻新资源管理系统的初衷。在项目组内,这种大的修改是反对多过赞同的。我尚无能力像说服自己那样说服每个人。虽然我及其主张项目演化中的民主,但这一次稍显独断,实在是不得已。因为我觉得这是个不明显的重大缺陷。虽然老的设计它精巧,且可以很好的工作,但它不适合长期保留。
理想的大项目,应该是每个人专心做自己的一块东西,它涉及的外部部分用极少的文档或易于表达的概念定义清楚:无论是程序接口、对资源的占用、适用的范围等等。尤其是弱化 framework 这种联系方方面面的巨无霸。
说回这次实现的 VFS 模块。实现还是比较简单的。但是设计很困难。难点在于,虽无可避免的有一些 framework 的倾向(比原来的系统要弱化许多),但怎样让后面具体的文件系统跟这个小型 framework 交流最少。架子主要解决的是内存资源管理问题和用 cache 提升索引性能的问题。
我定义了两个内部数据结构,借用 linux 的 vfs 中的概念表达。一种叫 dentry 描述目录项,一种叫 inode 描述文件项。但没有暴露这两个数据结构的内部布局。用户扩充的时候,需要给出各一个额外的数据指针来扩展自己的结构。这种手法,我曾经描述过。实际应用的时候,没有定法。
所有函数都应该是可重入的,但暂不要求线程安全。以此实现文件系统的嵌套 mount 。起初,我认为实现一个 zipfs 会很容易。可以 mount 上通用的 zip 文件使用。实际实现时,发现无论是通用的 zlib 还是另一个使用执照稍微麻烦一点的 zziplib ,都不提供高效的 seek 接口。我花了一整个晚上研究 zip 的文件格式和解码算法。发现对于这种流式数据压缩,很难做到特别高效的 seek 算法。
利用 zlib 的底层 api ,我想了个办法来提高 zlib 中带的 minizip 库的 seek 效率(目前必须通过假读来实现),不过也不可能达到 O ( LogN ) 的水平。所以我放弃了这个打算。没有高效的 seek 接口,坏处在于嵌套的 mount zip 文件中被打包的 zip 文件性能会很差。当然,可以选择在 zip 被打包进 zip 时不压缩,这样稍微改造一下 minizip ,就能把 seek 提高到 O(1) 的水平。我权衡了一下,还是把此类需求留到以后自己设计一个新的包格式为佳。(采用分块压缩即可)
最终我实现了一个基本的 rootfs ,一个 memfs 用于在内存中创建文件和目录(主要用于创建出最初的 mount 点),一个 nativefs 用于把本地文件系统上的目录树以只读方式映射给引擎,一个 zipfs 实现开发期基本的打包方案。未来可能会增加一个可写的文件系统,用于保存一些本地设置。一个自定义的包方案。
同时在同事的协助上,把 engine 中老的资源操作的接口迁移到新系统上。
btw, 我还考察了一个修改过的 unrar 的库。不过由于繁杂的执照问题,暂时没有采纳。如果人力充足的话,日后倒可以找人来加上。
Comments
Posted by: zhanxw | (17) September 1, 2010 01:33 PM
Posted by: Siney | (16) July 19, 2010 07:51 PM
Posted by: hi | (15) July 7, 2010 10:56 AM
Posted by: lbaby | (14) June 26, 2010 09:22 AM
Posted by: lichking | (13) June 25, 2010 12:28 AM
Posted by: littlebug | (12) June 24, 2010 01:33 PM
Posted by: 126bt | (11) June 21, 2010 08:26 AM
Posted by: zes | (10) June 21, 2010 08:25 AM
Posted by: 小x | (9) June 19, 2010 10:12 AM
Posted by: youngs | (8) June 18, 2010 04:01 PM
Posted by: sjinny | (7) June 14, 2010 11:05 AM
Posted by: cc | (6) June 13, 2010 09:09 PM
Posted by: sandy_zc_1 | (5) June 13, 2010 07:57 PM
Posted by: Stabber | (4) June 13, 2010 06:18 PM
Posted by: cloud | (3) June 13, 2010 04:36 PM
Posted by: cloud | (2) June 13, 2010 04:27 PM
Posted by: analyst | (1) June 13, 2010 04:04 PM