1.概述
最近因为工作方向变动,可能以后要从事Linux底层相关的开发工作,所以给自己定制了一个学习计划,系统的学习下操作系统,这门课程作为一个计算机专业的学生都会涉及,但本科毕竟学校学的知识毕竟有限,况且当时自己也是经常打酱油,虽然考试成绩还可以,但只是一知半解,借此机会也奉劝一句在校的学生们,抓住机会好好学习,就算你以后不从事相关工作,也能锻炼自己的学习能力,毕竟操作系统还是有些难度的。好了,废话不多说,begin!!
说到操作系统,操作系统与运行操作系统的计算机硬件密不可分,可以这么认为,操作提供帮我们和硬件之间做了一层适配,它来帮助我们管理当前我们所拥有的硬件资源,操作系统扩展了计算机指令集并且管理这些资源。作为一个程序员,如果不是从事内核或者一些偏底层的开发工作,一般都是调用操作系统提供一个系统调用,来满足一些应用需求的开发。这里先简要介绍一下现在个人计算机中的主要的计算机硬件,然后再一一剖析。
从概念上来说,一台简单的计算机可以抽象成如下图所示的模型:
像CPU、内存以及I/O设备都是由一条系统总线连接起来并通过总线与其他设备通信。现代个人计算机结构更加复杂,包含多重总线,但总体架构不会较大差异。接下来开始进入正题,“CPU”。
CPU(CPU,Central Processing Unit)也叫*处理器,其由一块超大的集成电路组成,是一台计算机的运算核心和控制核心。它的主要功能是解释计算机指令和处理计算机软件中的数据。
*处理器主要包括运算器(算数逻辑单元 ALU Arithmetic Logic Unit)和高速缓冲处理器(cache)以及实现它们之间联系的数据、控制及状态的总线(Bus)。它与内部存储器(Memory)和输入输出(I/O)设备是计算机中比较重要的三部分。
2.硬件组成
CPU主要包括运算逻辑部件、寄存器和控制部件等。硬件逻辑部件主要用来执行定点或浮点等一些逻辑操作。寄存器又包括寄存器、专用寄存器和控制寄存器。通用寄存器又可分为定点和浮点两类,它们用来保存指令执行过程中临时存放的寄存器操作和中间的操作结果。通用寄存器是CPU的主要部件之一。控制部件呢,主要是负责对指令进行解码操作,并且发出为完成每条指令索要执行的各个操作的控制信号。其结构又分为两种,一种是以微存储为核心的微程序控制方式,一种是以逻辑硬布线结构为主的控制方式
3.主要功能
CPU可以说是计算机的大脑,它从内存中取出指令并执行。在每个CPU基本周期中,首先从内存中取出指令,解码以确定其类型和操作数,接着执行,然后再取指、解码并执行下一条指令。每个CPU都有一套可执行的专门指令集。所以x86处理器不能执行ARM程序,而ARM处理器也不能执行x86程序。由于用来访问内存已得到指令或数据的时间比执行指令花费的时间长得多,因此所有的CPU内部都有一些用来保存关键变量和临时数据的寄存器。通常指令集中提供一些指令,用以将一个字从内存调入寄存器,以及将一个字从寄存器存入内存,其他的指令可以把来自寄存器、内存的操作数组合或者用两者产生的一个结果,如将两个字相加并把结果存在寄存器或内存中。除了用来保存变量和临时结果的通用寄存器之外,多数计算机还有一些对程序员可见的专用寄存器。其中之一是程序计数器,它保存了将要取出的下一条指令的内存地址。在指令取出之后,程序计数器就被更新以便指向后继的指令。
另一个寄存器是堆栈指针,它指向内存中当前栈的顶端。该栈包含了每个执行过程的栈帧。一个过程的栈帧中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量。
当然还有程序状态字(PSW)寄存器。这个寄存器包含了条件码位、CPU优先级、模式(用户态或内核态),以及各种其他控制位。用户程序通常读入整个PSW,但是,只对其中的少量字段写入。在系统调用和I/O中这类寄存器的作用则很重要。
如上图,现在一般都是使用这种模式,其中有多个执行单元,例如:一个CPU用于布尔运算。两个或更多的指令被同时取出、解码并装入暂存缓冲区中,直至它们执行完毕。只要有一个执行单元空闲,就检查保持缓冲区中是否还有可处理的指令,如果有,就把指令从缓冲区中移出并执行。这种设计存在一种隐含的作用,即程序的指令经常不按顺序执行。在多数情况下,硬件负责保证这种运算与顺序执行指令时的结果相同,但是,仍然有部分令人烦恼的复杂情形被强加给操作系统处理。
正常系统中的CPU都用两种工作模式,一种是内核态和用户态。通常,在PSW中有一个二进制的位控制着两种模式,当在内核态运行时,CPU可以执行指令集中的每一条指令,并且可以使用硬件的美中功能。在台式机和服务器上,操作系统在内核态下运行,从而可以访问整个硬件。相反,用户程序在用户态下运行,仅允许执行整个指令集的一个子集和访问所有功能的子集。一般而言,在用户态中有关I/O和内存保护的所有指令都是禁止的。
为了从操作系统中获得服务,用户程序必须使用系统调用,以 陷入内核并调用操作系统。TRAP指令把用户态切换到内核态,并启用操作系统。当有关工作完成以后,在系统调用后面的指令把控制权返回给用户程序。
从Intel Pentium 4引入了被称为多线程或超线程的特性,x86处理和其他一些CPU芯片就是这样做的,近似的说,多线程允许CPU保持两个不同的线程状态,然后再纳秒级的时间尺度来回切换。线程是一种轻量级进程,即一个运行中的程序。如果某个进程需要从内存中读出一个字需要花费多个时钟周期,多线程CPU则可以切换至另一个线程,多线程不提供真正的并行处理。在一个时刻只有一个进程运行,但是线程的切换时间则减少到纳秒数量级。
多线程对操作系统而言是有意义的,因为每个线程在操作系统看来就像是单个CPU。考虑一个实际有两个CPU的系统,每个CPU有两个线程。这样操作系统把它看成是4个CPU。如果在某个特定的时间点上,只有能够维持两个CPU忙碌的工作量,纳秒在同一个CPU上调度两个线程。
除了多线程,还出现了包含两个或4个完整处理器或内核的CPU芯片。每个芯片都是一个独立的CPU,通过缓存来做并行处理。其实在大规模计算方面,现在的GPU性能毋庸置疑,GPU指的是由成千上万个微核组成的处理器。它们擅长处理大量并行的简单计算,比如图像渲染等,但是不适合做串行任务。