深入理解计算机系统 | 学习笔记(三)

一、操作系统管理硬件

无论是简单的 hello 可执行程序还是 shell 应用程序,它们之所可以运行起来,并没有直接访问键盘、显示器、磁盘或者主存,而是依靠操作系统提供的服务。因此,我们可以把操作系统看成是应用程序和硬件之间插入的一层软件。

操作系统的两个核心基本功能:

1)防止硬件被失控的应用程序滥用。2)向应用程序提供简单一致的机制(API)来控制复杂而又通常大相径庭的低级硬件设备。

面对花样百出的硬件,操作系统就像是保姆,所有脏活累活都自己大包大揽,只给用户提供一个简单的 API 供程序们幸福的使用。程序运行在操作系统之内,就收到操作系统的管理,如何统一管理各式各样的应用软件是一大看点。

三大抽象概念

怎么将程序和上篇文章中提到的硬件系统相对应起来,是值得玩味一番。操作系统设计者们设计出以下三个重要的抽象概念来实现上述的核心基础功能:进程、虚拟存储器和文件。

文件是对 I/O 设备的抽象表示。

虚拟存储器是对主存和磁盘 I/O 设备的抽象表示。

进程是对处理器、主存和 I/O 设备的抽象表示。

操作系统提供的抽象表示

1.1 进程

进程是操作系统对一个正在运行的程序的一种抽象。进程概念的提出使得所有跑在操作系统上程序一个很逼真的假象:看上去只有这个程序在使用处理器、主存和 I/O 设备,即该程序的代码和数据是系统存储器中唯一的对象。

即使是操作系统上有多个程序(进程)在运行,也让用户感觉到每个程序都是相互独立的并发运行:一个进程的指令和另一个进程的指令交错执行。其可以实现这样高效的运行机制是因为硬件技术的支持:CPU 有可以在进程之间来回切换执行进程的功能,操作系统就是利用这一机制实现了这种机制,叫上下文切换

具体来说来讲,操作系统时刻记录并跟踪进程运行所需的所有状态信息(也就是上下文),其中包括PC 和寄存器文件的当前值,以及主存的内容等,以保证能够在一个进程执行到一半并将其暂停,去执行一会儿另一个进程,再待另一个进程执行一段时间将其暂停,再回到本进程继续执行。

进程的上下文切换

线程

在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

线程和进程区别在于作用域的不同,进程是在操作系统层面,进程是在某个进程层面。

1.2 虚拟存储器

虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。

进程的虚拟地址空间

每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。图中地址空间的底部区域存放用户进程定义的代码和数据,地址从下往上逐渐增大。

  • 程序代码和数据

    对于所有的进程来说,代码是从同一固定地址开始并且只读,之后就紧接着是数据位置(和 C 全局变量相对应的数据位置)。注意:代码和数据区是在进程一开始运行时就被规定了大小。

  • 代码和数据区后紧随着的是运行时堆,堆可以在运行时动态地扩展和收缩。

  • 共享库

    大约在地址空间的中间部分是一块用来存放像 C 标准库和数学库这样共享库的代码和数据的区域。

  • 位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。调用一个函数时,栈就会增长 ;从一个函数返回时,栈就会收缩。

  • 内核虚拟存储器

    内核总是驻留在内存中,是操作系统的一部分。地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。

虚拟存储器这样结构的设计目的就是实现操作系统对硬件的信息交互,硬件中的电压信息能够被解释转换为计算机操作系统中的位(bit)信息,并与之在软件层面进行更广泛的交互。

虚拟存储器运作的基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

1.3 文件

文件就是字节序列,仅此而已。每个 I/O 设备,包括磁盘、键盘、显示器,甚至网络,都可以视为文件。它向应用程序提供了一个统一的视角,来看待系统中可能含有的所有各式各样的 I/O 设备。

二、系统之间利用网络通信

现在的计算机已经不是单兵作战,而是通过网络连接着不同的操作系统对应的计算机,但是它们在硬件和系统软件层面都有着相同的结构设计,因此使得全世界的计算机能够互联起来,形成信息巨大的互联网。

从一个单独的系统来看,网络可视为一个 I/O 设备。当系统从主存将一串字节复制到网络适配器时,数据流经过网络到达另一台机器,而不是其他地方,例如本地磁盘驱动器。相似地,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。

网络也是一种 I/O 设备

三、并发与并行

并发(concurrency)是指一个同时具有多个活动的系统。并行(parallelism)指的是用并发使一个系统运行得更快。

并行可以在计算机系统的多个抽象层次上运用。按照系统层次结构中由高到低的顺序分为三层次:

3.1 线程级并发

在进程的抽象概念下引入了线程,而线程级并发的概念,就是指的多个线程在同一时间(并非是绝对同时的)活动,即一个一个进程中执行多个控制流。

由一个处理器在多个任务之间来回切换的早期计算机叫单处理器系统。

当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。其中多核处理器是将多个 CPU(称为“核”)集成到一个集成电路芯片上。

超线程,有时称为同时多线程(simultaneous multi-threading),是一项允许一个 CPU 执行多个控制流的技术。它涉及 CPU 某些硬件有多个备份,比如程序计数器和寄存器文件 ;而其他的硬件部分只有一份,比如执行浮点算术运算的单元。

3.2 指令级并行

可以同时执行多条指令的属性称为指令级并行。计算机使用了流水线(pipelining)技术,将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行地操作,用来处理不同指令的不同部分。

如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量(superscalar)
处理器。大多数现代处理器都支持超标量操作。

3.3 单指令、多数据并行

现在的计算机硬件几乎都允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即 SIMD 并行。通俗的讲也可以理解为,一条指令操作多个数据。比如书中所提到的例子,一些处理器具有并行地对4对单精度浮点数做加法的指令。

计算机之所以越来越快,这得益于计算机硬件技术的发展,它从物理逻辑上实现了具有 SIMD 并行、超标量的多核处理器。

四、抽象不简单

在处理器里,指令集结构提供了对实际处理器硬件的抽象。使用这个抽象,机器代码程序表现得就好像它是运行在一个一次只执行一条指令的处理器上。计算机系统中的一个重大主题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性。

除了上面的三个抽象概念,还有一个上世纪 60 年代提出的重要抽象概念:虚拟机,它提供对整个计算机(包括操作系统、处理器和程序)的抽象。

五、小结

抽象的概念成为了计算机世系统相互互联的基础,从单台计算机上硬件与操作系统之间的信息交互,到操作系统与本地应用程序之间,再到计算机和网络端的另一台计算机,都遵循着同样的软硬件结合标准,从而使得信息可以在每台计算机之间交流传递。

处理器读取并解释存放在主存里的二进制指令。因为计算机把大量的时间用于存储器、I/O设备和 CPU 寄存器之间复制数据,所以将系统中的存储设备划分成层次结构 —— CPU 寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM 主存和磁盘存储器。

为了提升计算机的运行性能,操作系统对硬件中的设备进行抽象:1)文件是对 I/O设备的抽象 ;2)虚拟存储器是对主存和磁盘的抽象 ;3)进程是对处理器、主存和 I/O 设备的抽象。

updated updated 2020-03-01 2020-03-01
本文结束感谢阅读

本文标题:深入理解计算机系统 | 学习笔记(三)

本文作者:木鲸鱼

微信公号:木鲸鱼 | woodwhales

原始链接:https://woodwhales.cn/2018/10/19/012/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%