题目的帽子可能有点大,不过我会尽量把自己的观点表达清楚一点。为什么我会关注并且思考操作系统设计的理念变化呢?都是因为早些时候在某乎看到了一干不明身份的程序员指责微软的Win RT框架屏蔽了绝大部分Win32 API,他们不明白为什么微软要做这么“愚蠢”的决定发布了一个功能残疾的新平台。对于这个问题可以简单的用四个字回答:为了安全。但是安全只是微软重铸Win RT的直接目的,而这么做的动机也是顺应了时代潮流和技术发展趋势而已。并不是微软故意要做个残废的平台,只是习惯了靠Windows平台开发来吃饭的那波人思想还停留在传统操作系统应用软件开发的阶段,他们没有注意到移动互联网的发展正悄悄的对IT行业中的各种技术格局产生了潜移默化的影响。
那Win RT是在顺应什么潮流和趋势呢?当然是为了打造移动终端的操作系统,所以Win RT也是在像IOS和Android系统的设计思想看齐的。而Win RT屏蔽了绝大部分的Win32 API,也只是在自我阉割传统操作系统的功能,其中最突出的三点就是:进程绝对隔离,用户接口去文件系统化,软件分发安装受控,而这三点也是目前以及将来一段时间内消费级市场操作系统的设计准则。了解操作系统原理都应该知道,文件系管理和进程管理是操作系统五大功能之中的两条不可缺少的功能,而软件的分发和安装应该是限制越少越高效自由,现在要做出这样的改变能对安全有什么贡献呢。
让我们来回顾一下操作系统的发展历史。20世纪80年代,最早的DOS操作系统,整个系统就是以磁盘文件系统为核心操作对象,这个时候操作系统中进程的概念虽然存在但是并不明显。用户接口只有文字命令行模式,对使用者的友好程度不必多说,让一个完全没有相关知识的人接受计算机都是很费力的事情。同时期的还有Mac操作系统,Mac比DOS领先采用了图形化界面,对使用者的友好度提高了一个档次,当然文件系统在用户接口中还是存在的。20世纪90年代开始,操作系统两大家族也形成了自己的格局,拥有图形化界面的Windows和类Unix操作系统都慢慢迭代,其中Windows在消费级市场中占据了主要地位,Linux一族在服务器市场崭露头角,而Mac OS则成为一种个性和品味的追求,直到现在在PC市场这种格局依然没有太大变化。这些操作系统虽然给人的感觉是千差万别,但是他们却有着相同的原理和理念,而其中Windows算是又是最最彻底的贯彻了对开发者友好灵活的思想,无论是在进程管理还是在文件系统方面,Windows都要比其他两个系统开放的多的多,而整个系统模块化,分层化也要比其他两个系统复杂。关于进程隔离和文件系统的现状是什么样呢?
一 进程隔离
在进程隔离方面,每个操作系统都做到了,但是目前PC操作系统中实现的隔离仅仅是进程运行时地址空间的虚拟隔离和复用。然而除了进程隔离之外,Windows还提供了各种各样的跨进程操作的方式,IPC,远程内存读写,各种各样的全局回掉等。而这些技术接口的提供完全是基于一个假设:这个世界上没有恶意的开发者,没有人会去做破坏别人进程的事情。这仅仅是一个道德约束,事实是这个世界上有太多恶意的开发者,他们就是要盗取别人的信息,就是要破坏别人的进程。你在网页输入银行密码,却不知道另一个进程已经读取了浏览器的内存,获取了你输入的明文密码。这可能是一个木马做的事情,当然也可能是一个正义感满满的杀毒软件做的,这些事情没有人可以控制。所以世面上就出现了各种卫士和管家,这些软件都是具有侵入性的,他们首先就破坏了操作系统本身的完整性和独立性,其次也让和他们共存的所有软件都失去了隔离的环境。这也是最近十年中杀毒软件和防护软件发展迅猛,战火燎原的原因,进程的不完全隔离,Windows给开发者提供了太过灵活开放的技术接口。
所以在进程隔离的改进上,三大平台是如何做的呢?Android整个系统架构应该是三个系统中设计最简单最偷懒的一个系统了,所以在进程隔离这方面做的是最简单粗暴的。Android底层是基于Linux,上层应用框架全部运行于虚拟机中,并且每一个App是独占的虚拟机进程,所以如果框架不开放接口,一个App要想跨进程访问另外一个App的运行时信息比如内存等,就要想办法先实现虚拟机逃逸了,这也是直接使用虚拟机来作为App运行时容器的一大优势了,省去了不少操作系统的设计问题。当然另一种方法是利用NDK开发native模块来做这种尝试,但是也要突破Linux系统自身的权限管理,然后还要想办法实现Linux入侵到另一个进程的内存空间。而IOS系统的APP还是Native层面每个App进程就是一个系统进程,直接运行于OC Runtime之上,同样在内存隔离方面也是由UNIX系统提供的保证。而到了Windows,事情就复杂了,因为Windows提供了过于开放接口,所以为了适应移动操作系统的安全,简单的特性,必须放弃一些在Win32子系统中存在的特性来实现进程内存的绝对隔离。所以Win32只能是Win RT框架,所以进程管理方面的API是肯定要屏蔽的,还有内存读写,以及一切可能出现进程加载外来模块的功能都要在Win RT中去掉。
二 文件系统化
文件系统管理是操作系统的一个必不可少的功能,这一点毋庸置疑也不会出现什么颠覆性的变化,但是文件系统对于一个只是希望使用计算机来进行日常工作娱乐的普通用户来说太过复杂了。对于初次接触计算机的人都会要迷惑一下文件和文件系统的概念,而出于保护目的给操作系统自身的文件的访问增加一些警告,这也会让用户感觉收到束缚。所以目前流行的操作系统对于普通用户来说暴露程度太高,影响用户的使用体验。另一方面由于文件系统接口过于开放,进程之间可以相互访问对方的文件,无论数据还是可执行文件,这样也不利于保证应用程序的自身完整性。可以想象一下,十年前开发一个软件没人会在乎别人来篡改他已经分发安装在用户终端上的文件,可是现在,你不带个驱动加个文件过滤你就无法避免别人恶意修改你的文件。但即使加了驱动也无法防止某些权限更高的软件修改文件,比如卫士管家什么的。这也反映出目前PC端软件开发的环境多恶劣,辛辛苦苦做完业务还要绞尽脑汁的去考虑安软件自身安全问题,这些问题本应由操作系统负责处理的。
在这用户接口层去文件系统这一点上,IOS是做的最彻底的,用户不会直接的和各种类型的文件接触到,而每个APP自己控制自己的文件访问,而文件的位置也全部由系统决定,所以在IOS里面没有文件系统这个概念。Android做了折中的处理,在APP框架中提供了类似IOS一样的访问控制,即为APP提供固定的存储位置。同时Android保留了对文件系统的访问,所以Android上还是有很多文件管理器,用户仍然可以看到一大堆各种各样类型的文件,包括系统文件,以及APP自身的各种文件。而Windows Phone从7.0版本开始就把文件系统接口在用户层屏蔽了,但是到了8.1又加回来了,所以现在Windows Mobile系统也是采取了这种做法。但是无论那种方法,APP在运行时是无法访问未授权的文件系统路径的,比如一个APP是没有办法读取另一个APP的数据和代码文件的。所以这是一个趋势,会有越来越少的人需要去访问复杂的文件系统的。
三 软件分发安装
传统的PC软件的分发和安装过程十分自由,软件开发商开发软件然后通过各种介质分发安装程序。用户只需要安装程序即可安装软件,中间没有任何约束限制,操作系统提供并没有参与应用软件的分发安装过程,同样的软件的更新升级都是需要软件开发商自己维护。这样的软件分发流程是非常灵活,但是不可否认的是这种分发安装方式有太多的缺陷和不安全因素。比如安装程序的可信任无法保证,程序行为无法控制,升级方式复杂等,最重要的一点是盗版严重。而在中国市场还有另一个更有趣的问题,杀毒软件厂商控制了所有软件安装的入口,某个公司历经数年开发了一款新产品,可是等到发布的那天发现,所有卫士管家都主动拦截了他们的安装包,虽然是经过了合法的数字签名,还是被这些流氓软件用鲜红的TIPS恐吓用户。后面就开始跟杀软厂商沟通,A说你给我推广就放行,B说给钱就给你放行啊。有没有觉得在中国做PC产品是那么艰难?这真的是目前中国PC端软件产品的现状!
所以,操作系统开发商就收紧了应用软件分发的渠道,App Store, Play Store 和 Windows Store,通过这种方式,一方面可以控制应用的安全问题,保护用户隐私,也保证应用生态圈中不会出现流氓软件。另一方面个可以有效的防止盗版,保护软件开发者的知识产权和经济收入。也省去了应用的升级模块问题,简化开发。
所以总结来说,进程绝对隔离,应用接口层去文件系统化,应用软件的受控分发和安装是目前移动端操作系统的三大鲜明特性。Windows 也不例外,所以开发者需要转变自己的思维,跳出传统PC应用软件开发的思维框架。而移动端经过最近几年的发展对互联网领域的技术格局也产生了极大影响。移动端应用开发相比传统PC开发太过简单,而移动操作系统开发商还在更加努力的让移动开发变得更简单,因为他们要圈人来扩大自己的生态,所以降低门槛永远是他们的不二选择。例如Android在设计之初就选择了Java作为其应用开发语言,想必也是出于Java开发人员数量庞大,而且是一门入门门槛很低的语言的原因了,但是Delvik虚拟机的指令集的设计不得不说有点鼠目寸光了,不然也不会撂下一个方法数的问题这么多年都没从根本上去解决。而苹果则基于LLVM开发了新的编程语言Swift,一方面是想取代很多开发者吐槽的OC,另一方面也是想继续保持IOS开发者生态的独特性。Windows呢?从Windows Phone 7的时候只支持C#,到了Windows Phone 8 又发布了C++/CX来支持Win RT开发,同时支持VB,HTML5,JavaScript。而到现在UWP平台,也是支持多种语言选择,并且开源了.NET,提供了一个跨平台的.NET Core运行环境和.NET FX框架。如果在降低门槛的同时能够不断改进提高操作系统本身,让那些因为门槛低而涌入的低水平开发者开发的代码也能很好的运行,这才是一个负责任的操作系统开发商,也是一个优秀的系统。
可以看到市场对于C/C++这些底层技术的需求在逐渐减少,并不是虚拟机语言的性能已经赶上了Native语言,而是由于移动应用的使用场景不不需要顾虑不同开发语言技术框架的性能差别了,而且如今的硬件性能足以弥补不同技术之间的差距(硬件性能提升对Web前端技术的发展影响最明显)。而在开发者眼里开发效率比比其他因素都显得更重要,这也是虚拟机语言越来越流行的一个原因。这些改变在Server端开发中也是很明显的,Python,Ruby等语言在后台开发中的比重提升就能证明,运行效率够了,开发效率就成了决定因素。
这一系列的变化,对Windows平台的开发者来说应该是最难适应的了,因为微软最近几年的行为显得如此缓慢和不靠谱。可以预见的一点是传统Windows应用软件最终会慢慢的淡出消费者市场,但是并不会消失,因为在工业科研教育等专业领域仍然是无可替代的。而在消费者市场UWP最终会挤掉传统应用的份额。所以如果作为Windows开发者的你不想转而去做后端,做Android和IOS,那就低下骄傲的头做.NET吧,也不要在偏执的去做什么C++/CX了,开发效率决定了市场需求。