Windows 很大程度上依赖注册表来存储诸如机器 IP 地址之类的小信息。Unix、Linux 和 OS-X 则将所有内容存储在普通文件中。
谈到注册表,我发现它存在几个问题:
访问信息并不那么容易。例如,如果机器无法启动,我尝试通过将磁盘安装到另一台机器上以从不同的操作系统(可能是另一个 Windows 或 Linux)访问它来解决问题,我可以轻松访问所有文件(权限和加密除外),但对于注册表,虽然理论上可以读取(并且可能更改)它,但它需要额外的应用程序。
命令行访问(在机器无法再启动的情况下)是不可能的(除非也有应用程序可以实现,但我很确定安装和使用这些应用程序比简单地访问磁盘上的文件要困难得多)。
信息可以位于文件中,也可以位于注册表中,因此必须同时处理两个位置。
处理文件时使用的常用工具(例如
findstr
,Windows 的兄弟grep
)在处理注册表项时不存在。
我确信,如果微软最初实现了注册表,那一定是有充分理由的,并且为 Windows 相对于当时的其他操作系统带来了(哪怕是微小的)竞争优势。
我考虑过性能和空间限制,这在 Windows 诞生之时尤为重要,但我看不出在注册表中存储某些内容如何能提高性能或减少使用的空间(将 DWORD 作为实际的 DWORD 存储在注册表中,而不是将其字符串表示形式存储在文件中,这样可以节省空间,但即使在 1985 年,这有那么重要吗?
从安全角度来看,似乎也没什么区别。我不确定 1985 年是否也是如此,但如今基于文件的权限看起来与注册表项实现的权限一样强大,甚至更加强大。
组织也类似:基于树的结构,没有索引/搜索功能(而更高版本的 Windows 实现了文件索引)。
那么,与将所有内容都存储在文件中相比,注册表最初有什么好处呢?
答案1
在微软开始使用注册表之前,他们INI 文件(文本文件)。他们发现仅使用 INI 文件很难开发出好的平台,因为:
- 支持 Unicode 并不容易。
这是一个文本文件,因此权限是在文件级别设置的,而不是在密钥级别。有权访问该文件的人都可以访问其中的所有参数。
如果两个线程试图同时更新一个 INI 文件,它们可能会意外删除另一个线程所做的更改。
- 程序可以以独占模式打开 INI 文件并锁定其他所有文件。
- INI 文件仅包含字符串。如果要存储二进制数据,则必须以某种方式将其编码为字符串。
- 解析 INI 文件很慢。
- INI 文件的集中管理很困难。由于它们可能位于系统的任何位置,网络管理员无法编写脚本来检查应用程序状态并升级过时的程序。
- 系统开始支持多用户,控制每个用户的设置变得非常困难。这意味着有时需要为每个用户单独设置 INI 文件。
这些是促使微软寻找新解决方案的主要因素,而注册表就是其中的代表。注册表是一个数据库,因此它解决了之前的问题,但又产生了新的问题:
- 这是一个单点故障。
- 它是二进制的。一旦损坏,很难用双手修复。
- 将设置放在注册表中的应用程序的可移植性较差。
- 复杂的导航。
重要来源鸣谢:http://blogs.msdn.com/b/oldnewthing/archive/2007/11/26/6523907.aspx