--
date: 2021年11月12日
Abstract: 本文自底向上,阐述了作者对计算机体系,文件系统和开源相关精神的理解。并放眼未来,探讨这些方向将会怎么发展,以及将带来怎样的变革。
keywords: 计算系统,文件系统,开源软件

1,我对计算机科学学科的理解

理论计算机科学

在电子计算机发明之前,理论计算机科学作为数学的一个分支已经得到了长足的发展。主要领域有数据结构和算法,计算理论,信息论,编程语言和形式化方法。

一个有趣的事实是,理论计算机科学中的停机问题和第三次数学危机中的关键问题罗素悖论有着非常紧密的联系。

在电子计算机发明之后这些理论迅速得到了广泛而深刻的应用,电子计算机成为了理论计算机科学的一个应用平台,理论计算科学因此得到了更加快速的发展。

计算机硬件

现代语义中计算机常常被定义为电子计算机,然而在电子计算机得到发展之前就有许多机械式计算机出现过,比如著名的差分机以及分析机,不那么著名的二战时期用于美国战列舰的机械式火控计算机。更广泛的计算机定义为能够自动执行计算的机器。

电子计算机基于数字电路逻辑门,因单个数字电路逻辑门能做的极小,电子计算机得到了比机械式计算机更强大的计算能力以及通用程度。其中的集成电路按集成度高低的不同可分为小/中/大/超大/特大/巨大规模集成电路,历史上集成电路的发展也是这个顺序。

在电子计算机迅速发展的过程当中,电子计算机电路规模越来越大,从最初的人力设计所有电路转向部分电路由电子计算机设计(即电子设计自动化)。有趣的是,这个和上述的罗素悖论也涉及到了一个相同的命题-自我指涉。

组成一个计算机的计算机硬件由五部分组成,控制器,运算器,存储器,IO设备和总线。

主要计算机架构有哈佛架构和冯诺依曼架构,前者和后者的最大区别是前者将程序和数据分开存放,无法使用统一的地址空间访问程序和数据。后者则将程序和数据统一放置,程序可以当成数据,数据可以当成程序。

硬件工程师通过使用各种手段(cache,更多晶体管等)来优化各个部件的速度和降低成本。

计算系统

计算系统由计算机硬件和软件组成,软件分为系统软件、支撑软件和应用软件。系统软件由操作系统、实用程序、编译程序等组成。这些对象的关系可由下图表示。

图1-1.计算系统

这么发展的根本目的是为了让程序员更快的编写应用程序,让应用程序安全的高效的运行。

系统软件

  • 操作系统是一组管理计算机硬件和软件资源,为其他计算机程序提供公用服务的计算机程序。常见的操作系统有Windows,Linux。

  • 编译程序(编译器)是用于将某种编程语言写成的源代码转换成另一种编程语言。常见的编译器有gcc,clang,java。

  • 实用程序是用于帮助分析、配置、优化、维护计算机的系统软件。比如杀毒软件和文件管理器等。

另一个有趣的事实是,在现实中,构建一个简单的编译程序可以编译 可以编译更复杂代码的编译程序,通常用来设计更复杂的编译程序。这一现象被称为自举,根上述的罗素悖论也涉及到了一个相同的命题-自我指涉。

操作系统因其复杂性,常常被划分为一个领域。

编译器是理论计算机科学中编程语言理论的试验场。

支撑软件

支撑软件为应用软件的开发,调试,运行,评估等需求提供各种各样的辅助工具。常见的支撑软件有数据库软件和VPN软件。

应用软件

自电子计算机被发明以来,各种各样的应用程序被开发出来应用于许多领域。

  • 文字处理软件(MS Office)
  • 计算机辅助设计软件(AutoCAD)
  • 集成开发环境(Visual Studio)
  • 3D设计软件(Blender)
  • 科学计算软件(Matlab)

等等

这些应用软件也归属于不同的领域以及有着需要攻克的课题,文字处理软件有多语种排版课题,计算机辅助设计软件和集成有人机交互的课题,3D设计软件有计算机图形学应用的课题,科学计算软件有优化科学计算的课题。每一个课题的进展都将被应用到实际上,使应用软件更易用好用。

总结

计算机科学是一门研究信息与计算理论以及如何在计算系统中实现和应用的学科。研究范围广,需要程度深,发展前景好,社会影响大,21世纪是计算机的世纪。

2.我对文件系统的理解

概述

文件系统是一种存储和组织计算机数据的方法。传统的文件系统使用文件和树型目录的抽象结构来管理数据。常常被构建于高容量高时延的存储器上(如固态硬盘,机械硬盘,光盘,u盘)。也有将文件系统构建于内存的情况,常常用来高速存放,共享临时文件数据。也有通过网络协议提供的文件系统(如SMB协议),通常用来共享文件。也有分布式文件系统(Google),这种文件系统通常可以部署在很多机器上提供统一的文件系统,每个机器的存储器通过网络同步数据,为不同物理区域的用户提供高速低时延的文件系统功能。

文件系统为所有程序提供持久化的数据保存服务。使得计算机启动可以自动启动整个计算系统,用户可以保存他们的工作内容,操作系统可以通过在文件系统内设置交换文件等方式扩展内存。

同时文件系统还有很多扩展功能,比如权限,加密,版本控制。

操作系统常常需要支持很多文件系统来保证兼容性。UEFI定义了特殊的FAT文件系统(EFI系统分区),为UEFI程序提供了引导加载程序。

文件

一个文件通常包含文件元信息和文件内容。文件元信息包括文件名,文件权限,其他文件属性等。文件元信息通常由树形目录结构存储。

文件物理上保存在扁平的大容量存储器地址空间,当程序写一个文件时,可能会发生文件紧挨着一个文件的情况,此时文件系统通常会使用类似链表的方法跳转到另一处空闲的地址空间存放文件接下来的内容。

当这种情况过多时,会产生一个现象"碎片化"。碎片指的就是这些分割的内容过多的现象,此时磁盘读写一个文件会因文件分散在不同物理位置需要更多的时间来转动磁头,整体上减慢了磁盘速度。因此需要一个叫做碎片整理的程序将这些碎片合并成一个连续的块。加速磁盘。(对于固态硬盘则没有这种问题)

一般来说,磁盘大小远大于文件数量,不用过于担心这种类似链表的方法所额外占用的磁盘空间。

树形目录结构

树形目录结构通常和文件内容在物理上分开存放,基本单元是文件夹,附有权限和文件夹名称,允许文件和文件夹放入文件夹中。从数据结构的角度上看,文件是叶子节点;文件夹是分支节点;树根叫根文件夹,是一个特殊的文件夹。

特殊文件/文件夹

链接文件/文件夹

链接文件/文件夹为文件/文件夹创建了可以随处放置的引用,访问链接文件/文件夹会跳转至对应的文件/文件夹。

设备文件

块设备文件允许随机读写,字符设备文件不允许随机读写。在Linux里通常被认为是具体硬件的抽象。(/dev/ttyUSB0)

总结

文件系统未来的发展趋势不应该局限于PC等小型机,随着网络带宽越来越高,延迟越来越低,数据中心越来越多,网络文件系统(SMB)、分布式文件(Google File System)系统应该会迎来更大的发展。此外这种文件系统应该还需要做好去中心,容灾等处理。这种情况恰好符合区块链的要求,现实中也有正在使用的区块链文件系统(IPFS星际文件系统)。

个人电脑的文件系统未来应该会脱离树形目录结构,转而向标签式文件系统,数据库型文件系统发展。当然这些也可以软件实现,但是势必绕不开现在文件系统的弊端(碎片化等)。Apple Mac的颜色标记功能已经为我们揭示了这种可能,我期待未来这个方向的优秀实现。

3.我对开源软件、认证与许可三者关系的理解

他们是什么

开源软件

开源软件即意味着这个软件的源代码面向公众开放。以下列举一些知名的开源软件

  • Git
  • Blender
  • Linux
  • GNU Project

开源软件具有极其深远的积极意义,以下列举其中一些。

  • 每个人都可以研究贡献软件代码,使开源软件代码质量高,学习到这款开源软件的哲学
  • 每个用户可以按照自己的需求裁剪开源软件,让开源软件适用性广
  • 开源软件用户很多,可以反馈更多的bug,让开源软件更健壮

开源软件这个概念从1990年被提出之后就迅速风靡整个计算机行业。随着互联网的发展和计算机硬件的发展,存储价格和数据传输单价逐渐下降,人们沟通协作的成本越来越低,开发大型软件再也不是大公司的专利,人们越来越喜欢开源软件。这代表了一种崇尚知识自由传播,目的是加速全人类发展的伟大精神。

认证

认证指由国家认可的认证机构证明一个组织的产品、服务、管理体系符合相关标准、技术规范(TS)或其强制性要求的合格评定活动。

对于计算机行业,认证可以分为这两类

  • 对于单一UNIX规范的UNIX认证等软件认证
  • 国内计算机等级证书等技术能力认证

其中软件认证在历史上曾经火热过一阵,如今计算机行业更多的是定义标准,开发者遵守标准编写符合标准的代码,从而达成统一。而技术能力认证则一直火热着,培养鼓舞着一代又一代计算机从业者。

许可

在计算机行业中许可通常指一种具有法律性质的合同或指导,规范受著作权保护的软件的使用或散布行为。

以下是一些例子。

  • Linux采用的GPLv2开源许可协议
  • 微信的软件许可及服务协议

他们具有什么关系?

开源软件和许可

最开始开源软件为了保护自己的开源性,免被商业公司复制转向闭源开发,通常会定义一些许可来保护自己。

图3-1.怎么选择开源软件许可

之所以开源软件的许可这么多,一是因为现实中开源软件合作开发形式的多样,更多的是主要开发者对于保护的认识不同。时至今日,顺着自由软件运动的发展甚至诞生出了"WTFPL"(你他妈的想干嘛就干嘛公共许可证)。开源软件选定许可如今更多的像是一种昭示主要开发者精神的行为的惯例,确定在主要开发者允许用户到什么程度的精神。

开源软件与认证

开源软件从诞生起来就看不起软件认证,开源软件始祖Linux大胆的宣称自己是符合POSIX标准但没有执行POSIX认证的Unix-Like操作系统,完全不把Unix认证和POSIX认证放在眼里。而此后Linux凭借开源大获成功,向世人展示了一种全新的可能——只要软件实现了标准就符合软件认证,所有开发者都能用各种方法确认,完全没有必要去为了一个商标去花时间和金钱。而软件认证也走向了下坡路,现在除了商业公司和商业公司之间的惯例行为,很少有软件认证了。更多的是在开发某种软件时达成共识、设立标准、然后遵守。C++语言就是一个很好的例子,虽然C++语言不是软件,但是C++标准委员会并没有什么对编译器举行"C++认证"的规定。在各路编译器的开发者,C++语言的使用者的讨论中,达成共识,进入标准,大家一起遵守。这种去中心化的民主式管理是现在开源社区和各种语言标准编写者们广泛认可的管理方式。

许可和认证

许可和认证并不是牛马不相及,其根源都是让用户/开发者遵守某个约定。但是,许可是自由的,你可以不使用你不想遵守许可的软件;认证是不自由的,存在认证垄断行业的风险。所以在当今自由软件的潮流下许可的兴起和认证的衰落就是自然的了。

展望未来

本文从作者对计算机的理解开始,泛谈文件系统,最终以开源软件,许可和认证为结尾,展现了作者对于计算机的认识。作者始终认为,计算机行业未来的发展将会围绕着计算机底层展开,开创性的底层创新相比顶层创新有着更为深远的影响力和进步性。实现以点带面,以面带体的蓝海发展。

文件系统,这个看起来很自然的东西,实际上每一个电子设备都会有,或复杂或简单。网络文件系统,分布式文件系统,以后将会给电子设备们带来什么样的革命?脱离存储设备只需要网络和计算资源即可实现的电子设备,是低成本物联网的一种新的方向。将会在极广的范围内发起对存储器是否有必要存在的质疑。为我们带来充满着可能性的未来。

而开源软件,从计算机底层——开发人员下手,掀起了整个软件开发的革命。不分国籍种族等等条件通力合作开发软件,很难不让人跟共产主义先进的生产方式——生产资料公有制等联系起来。走出私有,迈向共产,很难不认为这是未来。

未来计算机行业究竟会怎样?随着前端AI热潮的退去,所有人的目光都习惯于底层所带来的约束时,打破这个约束就成了新发展的风向标。这也意味着我们计算机科学的学生应该更认真学习计算机底层知识——计算机组成原理,操作系统,编译原理等课程,打通计算机体系,充分理解计算机的每个细节和外节。更好的提升自己在计算机行业里的价值和对计算机行业的贡献。

因为时间原因,没有附上更多的参考文献和图片资料,望读者海涵。