Hang

数据库与操作系统

2019-08-22

数据库一般认为是一种系统软件。而操作系统处于更底层的位置。这是一种通常的认知。

Unix 的一切皆文件的设计思想,从一定程度上来讲,表明了操作系统内部不同组件之间有一定的结构上的一致性。比如网络接口和文件接口,都有如下的操作

  • Rread
  • Write
  • Close/Open
  • permission

等等。进程和内存管理也是类似的逻辑。所以我们现在可以看到 Linux 系统中有很多类似的尝试,用文件的形式来来作为很多内部组件对外的接口。

这是 Linux 一直在被夸赞的地方。一个听起来优美的设计哲学,吸引了很多人从奇怪的,程序员不友好的 Windows 逃离过来,并花费大量的精力来学习和理解这个设计之下隐藏的诸多肮脏的细节。

工作越久,越来越多的人发现。相比较而言,平时还是 Mac 和 Linux 用起来更方便。即使是爱折腾的程序员,也大多不愿再去浪费时间去折腾 Linux,去折腾 VIM/Emacs。不是因为年纪大了,而是因为这些东西确实用户不友好,而且有设计缺陷。

几十年前, 已经很清楚地点评了 Linux/Unix 上的诸多问题。然而它并没有推动 Linux/Unix 去改变和解决这些问题。开源是一面美好的大旗,但它也蒙蔽了跟着的人。

Linux 桌面的失败简直惨不忍睹。自由的 fork, Client-Server 的架构,无尽的口水仗。最终活下来了两个无法合作的 KDE/Gnome。Windows 自然也有很多设计的问题,但注册表现在看来相对于 Linux 的配置文件来说简直是太优秀了。多年人,有些人会想到:

  • 不同 cmd 的 input 和 ouput 的格式都不一样,增加了很多研发的负担
  • 能否用一种统一的数据格式来表达配置以及输入输出?比如 json

也有人尝试过,但从来不会真正影响到社区。即使成功了,systemd 的经历也历历在目。

虽然能将操作系统的诸多概念简化成文件,但文件仍然是一个相对复杂的抽象概念。除了文件系统,没有哪个其他模块能够与文件如此对齐。就数据本身而言,打开文件之后,读写数据,本质上简化为两个结构: listdict,组合起来就是一个 table

读写文件,基本上就是不断地对这个 table 做修改,增加,删除,修改行。CSV 格式的文件更是可以直接直接对应于一张表。所有其他的内部模块,其操作也是类似的;

  • 创建进程: 往进程列表里添加一个元素
  • 销毁进程: 从进程列表里删除一个元素
  • 添加设备: 往设备列表里增加一个元素
  • 配置设备: 修改设备的属性

不只是 Linux,所有操作系统面临的都是同样的问题,使用的都是同样的的机制: 不听地对Table 做各种操作。现状是,所有的操作系统在不同模块的管理上都是有差别的,因为没有统一数据模型的支持,每个模块都在不断地用不同的形式做类似的操作,其提供给用户的功能也因此而受限。

从 Table 的角度来看,数据库成了计算机的中心。数据库理论经过这么多年的发展,已经完成了对 Table 的几近完善的研究,如何操作,如何连接表,查询,并发,安全控制,性能优化、、、所有这一切,在操作系统的各个模块都有非常类似的但是极其拙劣的实现。文件的 RWX 权限,目录的设计, /proc 的映射、、、重复的劳动,同时带来了无尽的安全漏洞与性能问题。

从数据库的视角去重新想象操作系统的设计,几乎充满了无尽的可能性。一个在底层拥有完全一致的数据模型,安全机制的系统,文件系统、设备,进程都是同一个数据库里的一部分,可以互相连接。SQL 虽然不够优先,但可以成为一种统一的查询语言,所有的用户工具都可以用机器简单地方式重新设计出来,而且天生就使用同样的数据格式。相比于困难以及实现的难度,这样的可能性太值得去尝试了。

链接#

Tags: OS