虽然,商品经济从早期的产能不足、物以稀为贵的时代,不断发展到了如今的所谓的产能过剩的时代。但是,有价值的资源、高端的产品从来都是稀缺的。
不止经济领域,计算机科学领域亦如是。
操作系统的3个抽象在冯诺依曼体系中,计算机系统由运算器、控制器、存储器(内存)和输入输出设备构成。其中,运算器和控制器组成为CPU,输入输出设备中的一个关键是数据持久化存储,也就是外存,或者泛指硬盘。
计算机硬件系统中最核心的资源是CPU和内存。
冯诺依曼体系中,计算机执行程序开展工作,可以简单描述为:
CPU从内存中获取一条指令(fetch),对其进行解码(decode)(做之前至少要搞清楚要做什么操作),然后执行(execute)。执行的操作,可能又包括简单的两个数字相加、从内存中读取操作数、条件的检查、跳转到函数等。完成当前指令后,处理器继续执行下一条指令,以此类推,直至程序最终完成。
为了屏蔽CPU和内存等硬件的复杂性及进一步提高资源的利用,操作系统应运而生。
操作系统的第一个抽象:虚拟机
完全硬件组成的计算机,可以称之为金属裸机。操作系统构筑在裸机之上,利用虚拟化(virtualization)技术,将物理(physical)资源(CPU、内存、磁盘)转换为更加通用、更加强大且更加易用的虚拟形式。因此,操作系统也被称为虚拟机(virtual machine)。
虚拟化的作用在于提高物理资源的易用性。
操作系统的第二个抽象:标准库
为了让用户能够基于操作系统进行对物理资源的功能使用,操作系统提供了一些接口(API),可以供用户的程序调用,典型的操作系统会提供几百个系统调用(system call)。由于操作系统提供这些调用来运行程序、访问内存和外设,所以,操作系统有时也被理解为为应用程序提供了一个使用物理资源的标准库(standard library)。
标准库的作用在于简化应用程序的开发。
操作系统的第三个抽象:资源管理器
虚拟化可以让许多程序同时运行(共享CPU),让每许多程序同时访问自己的指令和数据(共享内存),让许多程序访问设备(共享磁盘等),所以操作系统更多的时候是在扮演一个资源管家的角色,也被称之为资源管理器(resource manager)。
每个CPU、内存和磁盘等都是系统的资源(resource),操作系统扮演的主要角色是管理(manage)这些资源,以便做到高效或公平,或者实际上考虑其他许多可能的目标。
资源管理器的作用在于并发与协同,实现资源的高效利用,以及适度的公平策略。
操作系统考古1、只是一些库
早期的操作系统并没有做太多事情,只是一组常用的函数库,让程序员不用再重复编写低级IO处理代码,而直接调用操作系统提供的API。
在这个时期,操作系统一次运行一个程序,运行哪个、何时运行、运行的顺序由操作员手动完成。所以,这个时期的操作员干了很多现代操作系统所负责的事情(比如作业的调度等)。
最明显的问题是,计算机没有提供交互的使用方式,因为可能导致计算机的闲置、造成资源的浪费。但是,这种利用资源的策略,其实并没有充分利用资源。
2、学会保护
如果只是提供库,任意程序可以访问任何数据,毫无隐私可言,其危险是显而易见的。库的代码,本身与应用程序代码应该区分开。所以,产生了系统调用的概念。
不再将操作系统例程作为一个库来提供(这时候,只需要创建一个过程调用就可以访问它们),而是添加一些特殊的硬件指令和硬件状态,让操作系统过度为更正式的、受控的过程。
3、多道程序
批处理、单作业的模式,其实并没有充分利用计算机资源。为了能够更充分的利用计算机资源,多道程序(multiprogramming)变得很普遍。操作系统不是一次只运行一个作业,而是将大量作业加载道内存中,并在它们之间快速切换,从而提高CPU利用率。
这种切换非常重要,毕竟IO设备很慢,在处理IO时,还让该程序占用着CPU,是对CPU资源的浪费。那么,为什么不切换到另一个需要使用CPU的程序继续运行一段时间呢。
所以,这时候已经有了并发的存在。
4、现代操作系统
也就是虚拟机、标准库、资源管理器抽象下的操作系统。
操作系统,即便是PC机,也会有序不紊地同时在运行几百个进程,每个进程都觉得自己在独占CPU、内存和磁盘。
资源稀缺与并发编程1、早期的操作系统,一次只运行一个作业,程序完全独占操作系统,操作系统可以只是一个函数库。简单的同时,是对资源的不充分使用,以及性能的损耗。
2、如果资源不稀缺,为了提高性能,完全可以不断堆资源,大力出奇迹。比如,现在的大模型,核心算法其实比较简洁,但是所消耗的算力是非常巨大的。
3、有限资源的约束下,要提升整体的效率,就要充分利用各种资源,谁都不要闲着。所以,在仿照工业流水线的场景下,将作业切分为使用不同资源的任务,多个作业并发,让任意资源交替使用、减少空闲时间。
4、还原论指导下的作业切分,并发的是指是有限资源约束下的分时复用。
5、CPU看到的粒度,是一条条相互独立的保证原子性的指令。但是,从高层业务逻辑看,有些指令必须一同运行,要么一同执行完成,要么一行也不要执行,始终处于一个一致的状态。这里,原子性的语义出现了分歧,基于锁的隔离机制出现并有效解决了这个问题。
6、所以,并发编程是对稀缺资源充分利用的一种有效尝试。但是,代价是引入了更多的复杂性。
7、分时复用只是减少资源的空闲时间,本质上如何更加有效地切蛋糕,而蛋糕的大小是固定的。
8、只有资源冗余,才能实现真正的并行,不断堆积资源,提升并行度,效率也在得到不断的提升。
总结总的来说,资源的稀缺性,导致了并发概念的引入,进而提升了资源的利用率,实现了批量作业整体效率的提升,但是,是以引入复杂性为代价的。
现代高可用的系统架构,不断拆分、不断引入新的中间件、技术,变得越来越复杂。本质上来看,都是资源有限的约束下的无奈与妥协。
现代计算机科学,要么提升算法,更加充分利用现有资源,从而满足需求;要么大量堆积资源,简单直接,大力出奇迹。所以,算法和算力,复杂和简洁,本质上都是辩证存在的!
有点东西,[鼓掌]