当前位置 : 主页 > 编程语言 > java >

操作系统中的系统抽象

来源:互联网 收集:自由互联 发布时间:2023-03-22
抽象通常被认为是计算思维的基本原则,抽象思维能力被认为是工程们最重要的能力之一。2021年图灵奖庆祝了由阿尔弗雷德·阿霍和杰夫·乌尔曼设计的编程语言和编译器抽象,展示了

抽象通常被认为是计算思维的基本原则,抽象思维能力被认为是工程们最重要的能力之一。2021年图灵奖庆祝了由阿尔弗雷德·阿霍和杰夫·乌尔曼设计的编程语言和编译器抽象,展示了向更高级抽象的方向迈出了一步。

那么,什么抽象呢?对操作系统而言, 抽象又是怎样的呢?

操作系统中的系统抽象_算法

什么是抽象?

在哲学里,“抽象”是一种将观念抽离原本客体的思想过程, 是指认知某类个体内的普遍性质之概念形成及形成其性质概念之准则的过程。

具体一些,抽象是指以缩减一个概念或是一个现象的资讯含量来将其泛化的过程,主要是为了只保存与某一特定目的有关的资讯。例如,将一个皮制的蓝球抽象化成一个几何意义上的球,只保留一般球的属性和行为等信息。相似地,也可以将快乐抽象化成一种情绪,以减少其在情绪中所含的资讯量。

抽象的过程普遍存在于所有人类社会的思维过程当中,也是所有人类语言的一部分,也就是说,抽象的过程是普便的文化通则之一。

计算机科学中的抽象

在计算机科学中,抽象是将数据与程序,以它的语义来呈现出它的外观,但是隐藏起它的实现细节。抽象把一个问题或模型,以不同规则或方法所得出的不同的解(求解方法和解本身即抽象层),这些不同的解可以组合并还原成问题或模型的本身。抽象是用来减少程序的复杂度,使得程序员可以专注在处理少数重要的部分。一个计算机系统可以分割成几个抽象层,使得程序员可以分开处理它们。

抽象的意义是可以忽略非求解过程中必需的解。例如要用计算机程序去模拟“人”,在描述了人的动作如饮食、思考、移动等符合设计要求后,其他“人”的细节(躯干、器官、细胞活动乃至人际关系)都可以忽略,以集中设计需要的功能,并减低程序的复杂度。

为了使抽象的成品(例如,算法模型)不会出现问题,要注意抽象时是否漏掉了重要特征,在机器学习领域,凸显了特征工程的重要性。

一般地,在程序设计中,抽象类别包括下列4类:

  • 过程抽象:能够引入一些新的操作;
  • 资料抽象:能够引入新的资料对象类型;
  • 反复运算抽象:能够反复运算遍历在集合中的元素,而不必显示如何获得元素的细节;
  • 类型层次:能够从多个单独的数据类型中抽象成几组相关的类型。
  • 操作系统中的系统抽象_字段_02

    操作系统中的基本抽象

    对操作系统而言,也许是最基本的抽象是操作系统中的“进程”,意思是正在执行中的程序。追本溯源,这个抽象是为了解决早期操作系统中的可靠性问题。

    在1960年到1965年之间,操作系统设计者承诺要建造强大的计算系统,在大型用户网络中廉价地分配计算能力。这些系统旨在整合一系列的新发明,例如时间共享、虚拟内存、输入输出流、共享文件系统、目录系统和编程支持接口。这些发明最大限度地实现了信息共享,最小化了开发时间,并将昂贵的CPU和内存资源的成本分散到许多用户中。

    大约在1960年,大型程序的主要抽象是模块和接口。它呼吁将复杂的系统分解成简单的模块,通过它们的接口来交换信息。例如,操作系统将组织一个用于CPU调度、内存管理、输入输出、文件、目录和编程接口支持的模块。不幸的是,这种方法并没有起作用,那么,缺了些什么呢?

    即使设计者已经仔细地制定了模块功能和接口,当模块被连接在一起并承受用户工作负载时,系统总是会崩溃,而且调试工作极其困难。

    问题是,模块是一种控制结构,用于引导CPU一次完成一个任务。然而,操作系统必须为许多的用户管理许多的计算,但对于许多用户同时工作的模块及其界面通过而言,没有一种简单的方法来可视化。大型系统不仅仅是拥有更多用户的小型系统,而且在实现私有内存、共享文件和内存以及争夺有限的CPU资源的时候,多个用户还产生了新的动态。这些动态包括竞赛条件、死锁、繁忙的等待、在内存级别之间循环的数据、访问文件、用户通过创建新的自治服务来扩展系统,以及预测吞吐量和响应时间。

    这就需要一种新的思维方式,这种新的思维后来被称为并发控制。

    1964年,关于“进程”的抽象出现了,开启了其他问题的优雅解决方案。一个进程不仅仅是一个正在执行中的程序。它是一个自治的代理,可以根据请求为其他进程执行服务。进程是需要CPU时间和内存空间、与其他进程同步、创建和访问文件、搜索目录、响应事件以及与其他进程组合以生成动态计算结构的实体。

    这个“进程”的抽象产生了另一个重要的抽象——非终止计算,服务进程被设计为无限循环。在完成一个请求后,一个服务进程将返回到一个“归属位置”,并等待下一个传入的请求。隐藏在后台的守护进程执行了有益的事务管理功能,如内存回收或将修改后的内存内容写回磁盘。设计师们学会了用持续运行的计算系统来思考。

    到20世纪60年代末,大多数操作系统设计者将操作系统视为一个合作的社会,主要是不终止的进程,而不是大量的模块。今天,笔记本电脑的活动监视器通常会显示了操作系统中运行的数百个进程。

    相比之下,直到今天的大多数编程课程都只教授独立的终止程序:那些从输入开始,从输出停止的程序。在这种情况下,一个非终止的程序看起来就像一个bug——死循环。

    操作系统中的系统抽象_嵌套_03

    操作系统中的系统抽象

    系统抽象对于构建具有大量进程、用户、设备和网络连接的大型复杂系统至关重要。计算系统的每个主要领域有自己特有的抽象概念。例如,Internet有用于主机寻址的IP协议、用于克服噪声传输的TCP协议、基于DNS的域命名、url、网页、标记语言等等。Internet具有通用的无限名称空间、指向存储文件的不可存储的指针、数据中心、防止数据丢失的冗余等等。数据库系统有记录、字段、表、投影、连接、查询、原子事务、持久存储、文件对存储的持久化表达,等等。

    计算系统复杂性的一个主要来源是大量的数字对象,系统抽象通过两种方面简化了这种复杂性。首先是聚类,将所有相同类型的对象合并到一个类中,并为所有这些对象设计一个单一的管理器。管理器可以授权对这些对象执行的操作过程提供单个的接口。其次,类管理器为对象分配唯一的名称,并验证授权的每个访问。必须保护包含这些名称和访问代码的指针不被更改。

    我们可以通过文件系统的抽象来描述这一抽象的过程。

    操作系统中的系统抽象_字段_04

    在操作系统中,通过一种被称为“函数”(或系统调用)的较低级别抽象,满足了对指向对象不可改变的指针的需求。“函数“是一个由(类型、访问、句柄)字段组成。类型字段指示所指向的对象类型,访问字段是一个多位代码,指定可以对该对象执行类操作的哪个子集,句柄字段是对象的唯一代码,将其与所有相同类型的对象区分开来。

    因为没有任何用户进程可以改变内核空间中的任何东西,只要保持函数内核空间,它们就会受到保护。当它们被传递到外部时,它们将被增强为一个加密校验和,使接收者人能够验证它们自创建以来没有被更改。这一方式成为了实现面向对象编程语言的原则,也被用于一些云存储系统以保证文件的隐私。

    操作系统中的多层次抽象

    一类对象的系统抽象可以描述为“抽象机器”,其指令集是在接口上提供的操作,其隐藏的内部数据结构跟踪所有对象,例如文件管理器。

    在操作系统和网络中,我们可以将抽象的内容堆叠成一系列的级别。每个级别都可以由较低级别定义的抽象组成,但较低级别定义的抽象不能使用关于较高级别抽象的任何信息。

    这种分层的第一个工作例子之一是多重编程系统,这个想法已经被扩展到现代操作系统中。典型分层级别如下:

  • 中断和堆栈
  • 过程和信号器
  • 虚拟内存
  • 消息交换
  • 命名空间
  • 输入/输出流(文件、管道、设备)
  • 目录
  • 虚拟机
  • shell及用户界面
  • 服务
  • 级别1-5是微内核,它们在内核模式下运行,可以访问所有内存。级别6-10是用户内核,它们在用户模式下操作,只能访问调用它们的进程的私有内存。每个级别都是一个抽象的机器,它管理该级别的对象类。

    级别10是内核之外的用户服务的集合,例如图形用户界面、应用程序库(应用程序)和性能分析工具等等,每个用户服务都有其自己的系统抽象概念。

    对象和操作可以由较低级别的对象和操作组成。实际上,一个级别的抽象机器嵌套在某个抽象机器中,以便于升级到下一个级别。抽象机器的用户界面由所有嵌套机器的接口联合组成。这个嵌套隐藏了较高层的低级细节。

    在这一堆栈中,程序员必须进行设计,以便他们只向下调用,而不能向上调用。这可以防止循环等待(死锁)和自引用代码的循环,并使系统能够通过一次测试进行验证。这样,通过操作系统中的多层次抽象解决了任何关于循环性的问题。

    分层的系统抽象导致了广泛的思考,也有人担心它过于简化、过度约束和失去演进的能力,担心这些约束会引入更多的复杂性。但事实并非如此。当然,分层的系统总是会导致更小的内核,较小的内核速度更快,也更容易测试和验证。多年来,唯一可证明的安全操作系统都是分层结构化的。现代的Sel4内核就是最新的例子,它体积小而紧凑,能够满足物联网设备受限的内存约束。

    操作系统中的系统抽象_算法_05

    小结

    计算机的惊人进步是通过人们创造和使用系统抽象而实现的,操作系统的系统抽象只是用来组织大型系统的一些系统抽象。遗憾的是,现实生活中的工程师们很少讨论大型程序以及编译器的抽象,也很少讨论系统抽象。如果没有这些高级的抽象概念,很多大型系统都可能会成为无本之木,无水之源。

    那么,系统抽象是否完全描述了计算?当然不是,计算是对自然的以及人工的信息处理过程的研究,而系统抽象只是用于设计和研究大规模、复杂信息系统中的众多工具之一。

    然而,或许操作系统研发领域与我们相隔太远,那么在我们日常的软件开发和系统架构领域呢?

    如何对我们的业务系统进行系统抽象呢?

    系统抽象是如何影响架构决策的呢?

    架构决策的持续性与系统抽象又是怎样的关系呢?

    希望《持续架构实践》一书可以给大家带来些许的帮助——

    网友评论