操作系统总思维导图
操作系统概述
现在计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/ 输出设备构成 。
然而,程序员不会直接和这些硬件打交道,而且每位程序员不可能掌握所有计算系统的细节,这样我们就不用编写代码了 所以在硬件的基础上,计算机暗转一层软件,这层软禁啊能够通过响应用户的输入的指令达到控制硬件的效果 , 从 而满足用户需求,这种软件称之为操作系统, 它的任务就是用户程序提供一个 更好,更简单、 更清晰的计算机模型。常见的操作系统主要有Windows、Linux、 FreeBSD 或者 OSX , 这种带有图形界面的操作系统称为 图形用户界面(GUI). 而基于文本、命令行的通常称为Shell 。
操作系统的构建图:
操作系统所处的位置:
这是一个操作系统的简化图, 最下面的是硬件,硬件包含芯片、电路板、磁盘、键盘、显示器等我们上面提到的设备, 在硬件之上是软件。大部分计算机有两种运行模型: 内核态 和 用户态, 软件中最基础的部分是 操作系统, 它运行在内核态中, 内核态也称为 管态 和 核心态, 他们都是操作系统的运行状态,只不过是不同的叫法而已。 操作系统具有硬件的访问权限 ,可以执行机器能够运行的任何指令。 软件的其余部分 运行在 用户态 下。
用户接口程序(Shell 或者 CUI) 处于用户态中,并且它们位于用户态的最低层,允许用户运行其他程序,例如Web 浏览器、 电子邮件阅读器、音乐播放器等。 而且,越靠近用户态得到应用程序 越容易 编写, 如果你不喜欢某个电子邮件阅读器 你就可以重新写一个或者换一个 ,但你不能自行写一个操作i系统或者是中断处理程序。 这个程序由硬件保护,防止外部对其进行修改。
计算机硬件简介
操作系统与 运行操作系统的内核关系密切。 操作系统扩展了计算机指令集并管理计算机的资源。 操作系统因此必须足够了解硬件的运行, 这里我们先简要介绍一下现代计算机中的计算机硬件。
CPU
CPU 是计算机的大脑, 它主要和内存进行交互, 从内存中提指令并执行它**。一个CPU的执行周期是从CPU 中提取第一条指令,解码并解决它的类型和操作数, 执行,然后再提取、解码执行后续的指令**。
重复该循环直到程序运行完毕。
每个CPU都有一组可以执行的特定指令集。因此,X86 的CPU 不能执行ARM 的程序并且ARM的CPU 也不能执行X86 的程序。由于访问内存获取或数据要比执行指令花费的时间长, 因此所有的CPU 内部都会包含一些寄存器 来保存关键变量和临时结果。 因此,在指令集合中通常会有一些指令用于把关键字从内存中加载到寄存器中, 以及把关键字从寄存器存入到内存中。还有一些其他的指令会把来自寄存器和内存的操作数进行组合, 例如add 操作就会把两个操作数相加并把结果内存中。
除了用于保存变量和临时结果的通用寄存器外, 大多数计算机还有几个特殊的寄存器,这些寄存器对于程序员可见的。 其中之一就是 程序计数器(Program cunnter), 程序计数器会指示下一条需要从内存 提取指令的地址。提取指令后,程序计数器将更新下一条 需要 提取的地址 。
另一个寄存器是 堆栈指针(stack pointer), 它 指向内存中当前栈的顶端。栈堆指针会包含输入过程中的有关参数, 局部变量以及没有保存在寄存器中的临时变量。
还有一个寄存器是PSW(program Status Word) 程序状态字寄存器, 这个寄存器是操作系统维护的 8 个字节 (64)位long 类新房数据集合。 它会跟踪当前系统的状态。 除非发生系统结束, 否则我们可以忽略PSW。用户程序通常可以读取整个PSW, 但通常只能写入某些字段。PSW 在系统调用和I/O 中起着重要的作用。
操作系统必须了解所有的寄存器。 **在时间多路复用(time multiplexing) 的CPU 中,操作系统往往停止运行一个程序转而运行另外一个。**每次当操作系统停止运行一个程序时, 操作系统会保存所有的寄存器的值, 以便于后续重新运行该程序。
为了提高性能, CPU 设计人员早就放弃了同时去读取、 解码和执行一条简单的指令。 许多现代的CPU 都同时读取多条指令的机制。 例如, 一个CPU 可能会有单独访问,解码 和 执行单元, 所以,当CPU 执行第N 条指令时,还可以对N +1 条指令解码, 还可以读取N+ 2 条指令, 像这样的组织形式 被称为 流水线(pipeline )。
比流水线更先进的设计是 超标量(superscalar) CPU 下面是超标量CPU 的 设计
从上面这个设计中, 存在多个执行单元,例如, 一个用来机型整数运算、一个用来浮点数运算、一个用来布尔值运算。 两个或者更多的指令被一次性取出、 解码 并放入缓存区中,直至它们执行完毕。只要一个执行单元空闲,就会去检查缓冲区是否可以执行的命令. 如果有 , 就把指令从缓存区中取出并执行。 这种设计的含义是应用程序通常是无序执行的。在大多数情况下,硬件负责保证这种运算的结果与顺序执行指令时的结果相同。
除了用在嵌入式系统中非常简单的CPU 之外 , 多数CPU 都有两种模式 , 即前面已经提到的内核态 和 用户态。 通常情况下 ,PSW 寄存器 中一个二进制位会控制当前状态是内核态还是用户态。 当运行在内核态时,**CPU 能够执行任何指令集合中的指令并且能够使用硬件的功能。**在台式机和服务器上,操作系统通常以内核模式运行, 从而可以访问完整的硬件。在大多数嵌入式中, 一部分运行在内核态下, 剩下的一部分运行在用户态下。
用户应用程序通常运行在用户态下, 在用户态下,CPU 只能执行指令集中的一部分并且只能访问硬件的一部分功能。 一般情况下是,在用户态下, 有关I/O 和 内存保护的所有指令是禁止执行的。
当然, 设置PSW 模式的二进制位为内核态也是禁止的。
为了获取操作系统的服务, 用户程序必须使用 系统 调用(system call) ,系统调用会转换为内核态并调用操作系如。 TRAP 指令用于把用户态切换为内核态并启用操作系统。 当有关工作完成之后, 在系统调用后面的指令会把控制权交给用户程序。我们会在后面探讨操作系统的调用细节。
需要注意的是操作系统在进行系统调用时会存在陷阱。大部分的陷阱会导致硬件发出警告,比如说试图被零除 或 浮点下溢你。 在所有的情况下,操作系统都能得到控制权并决定如何处理异常情况。 有时 由于出错的原因 ,程序不得不停止。
多线程和多核芯片
Intel Pentinum 4 也就是奔腾处理器引入 了被称为 多线程(multithreading) 或 超线程 (hyperthreading, Inter 公司的命名) 的 特性,X86 处理器核其他的一些CPU 芯片就是这样做的。
包括 SSPARC 、Power5、Inter Xeon 和 Inter Core 系列。 近似地说, 多线程允许CPU 保持两个不同的线程状态并且在 纳秒级(nanosecond) 的时间完成切换。 线程是一种轻量级的进程, 我们会在后面说到。 例如, 如果一个进程要从内存中读取指令(这通常会经历几个时钟周期)、多线程CPU 则可以切换至另一个线程. 多线程不会提供真正的并行处理。在一个时刻只有一个进程在运行 。
对于操作系统来讲,多线程是有意义的,因此每个线程对操作系统来说都像是一个单个的CPU。 比如一个有两个CPU的操作系统,并且每个CPU 运行两个线程,那么这对于操作系统来说就可能是4 个CPU。
除了多线程之外,现在许多CPU 芯片上都具有四个、八个或者更多完成的处理器或内核。 多核芯片在其上有效地承载了四个微型芯片,每个微型芯片都有自己的独立CPU。
带有共享L2 缓存的四核芯片
带有分离L2 缓存的4核芯片
如果要说在绝对核心数量方面,没有能赢过现在的GPU (Graphics Processing Unit),GPU 是指成千上万个微核组成的处理器。 它们擅长处理大量并行的简答计算。