引言
计算机系统总的来说分为软件和硬件,如下图所示。多数计算机有两种运行模式:内核态和用户态。软件中最基础的部分是操作系统, 它运行在内核态。操作系统具有对所有硬件的完全访问权限,可以执行机器能够运行的任何指令。 其他软件运行在用户态,只能使用部分机器指令。特别指出,哪些会影响极其的控制或可进行I/O操作的指令,在用户态中的程序是禁止的。 无法直接运行指令,则只能通过操作系统提供的接口来达到目的。
image.png操作系统由硬件进行保护,防止用户试图对其进行修改。
大家都操作过Windows、Linux等操作系统,感觉这是不是就是操作系统? 这些与用户交互的程序,实际上并不是操作系统的一部分,经它们使用操作系统来完成工作,基于图标的称为图形用户界面(GUI, Graphical User Interface),我们所用的Windows就是这种,可以看到各种图标; 基于文本的则通常称为shell, 比如我们在Windows中使用cmd命令, 或者在Ubuntu中是Xshell等软件程序。
不过,在嵌入式系统(没有内核态)或解释系统(如基于Java的操作系统,它采用解释方式,而非硬件方式区分组件), 上述划分的边界是比较模糊的。
1.1 什么是操作系统
操作系统是一种运行在内核态的软件,但这个说法并不总符合事实, 不过操作系统概括起来主要有两个作用:
1.为应用程序(程序员)提供资源集的清晰抽象
2.管理硬件资源
第二点好理解, 第一点用大白话说就是给上层提供相应的接口或者方法, 让上层应用程序可以使用资源。
另外,对于操作系统的理解,从不同角度看的,有不同的定义,
自顶向下看:操作系统为应用程序提供基本抽象,从而使应用程序在此基础上可以组合功能。也就是说操作系统给应用程序提供良好、清晰、优雅、一致的接口。(操作系统的实际用户是应用程序,当然是通过应用程序员)应用程序直接和操作系统提供的这些接口打交道。
自底向上看:操作系统用来管理复杂系统的各个部分,对资源的请求进行分配,调节不同程序见相互冲突的资源请求。其中, 资源的管理有两种不同方式实现多路复用(共享)资源:时间上复用和空间上复用:
时间上复用:当一种资源在时间上复用时,就是不同程序或者用户轮流使用它,大家排队使用。例如:若在操作系统上只有一个CPU,而多个程序需要在CPU上运行,操作系统则首先把该CPU分配给某个程序,在它运行足够长的时间后,另外一个程序进入CPU,以此类推
空间上复用:每个程序都得到资源的一部分,就不用排队了,这就是多个位置,一人坐一个。例如:通常在若干个运行程序之间分配内存,这样每个运行程序都可以同时驻入内存,这样就提高了CPU的效率
以上两种方式的公平和保护问题,由操作系统解决
1.2 操作系统的历史
image.png1.3 计算机硬件简介
以下是一个常见的个人计算机构成
image.png
处理器
处理器是计算机最重要的部分,就相当于人的大脑一样,它会从计算机的内存中取出指令去执行。
在每个CPU基本周期中首先从内存中取出指令,然后进行解码分析指令的类型和操作数,然后再去执行,以此类推。程序按照这种方式被执行完成。
每一个CPU都有一套自己的指令集,所以x86不能执行ARM程序,ARM处理器也不能执行x86程序。由于用来访问内存以得到指令或数据的时间要比执行指令花费的时间长度的多,所以CPU内部都有一些用来保存关键变量和临时数据的寄存器。这样,通常在指令集中可以提供一些将寄存器中的数据调入内存的指令。除了一些用来保存临时结果和变量的通用寄存器之外,还有一些只对程序员可见的专用寄存器。
专用寄存器的分类:
-
程序计数器:它保存了将要取出的下一条指令的内存地址,在指令取出后,程序计数器就被更新指向后继的指令。
-
堆栈指针:它指向当前内存的栈顶位置,在函数调用中,栈的作用有:参数传递、局部变量分配、保存调用的返回地址、保存寄存器状态以供恢复。栈由栈帧(stack Frame)组成。一次函数调用包括将数据和控制从代码的一个部分传递到另外一个部分,栈帧与某个过程调用一一映射。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。
-
程序状态字寄存器:这个寄存器包含了条件码位、CPU优先级、模式(用户态或者内核态),以及其他控制位
对操作系统来说,它必须知道所有的寄存器。在时间共享CPU中,操作系统经常会终止正在运行的某个程序启动另外一个程序,当操作系统去终止某个程序的时候,必须将这个程序中的所有寄存器值保存起来,以便再次启动该程序时,可以把这些寄存器重新装载。
现代CPU的读取指令机制:
流水线机制:一个CPU可以有单独的取指单元、解码单元和执行单元,于是当他执行指令n的时候,还可以对指令n+1解码,并且读取指令n+2。
超标量CPU:这种机制中有多个执行单元,例如:一个CPU用于整数算数运算,一个CPU用于浮点数算数运算,一个CPU用于布尔运算。两个或更多的指令同时被取出、解码并装入暂存缓冲区中直到它们执行完毕。只要有一个执行单元空闲,就检查保持缓冲区中是否还有可处理的指令,如果有,就把指令从缓冲区中移出并执行。这种设计存在一种隐含的作用,即程序的指令经常不会按照顺序执行。
image.pngCPU模式的切换
可以通过TRAP指令将用户态切换成内核态,并启用操作系统。当在工作完成之后,在系统调用后面的指令把控制权返回给用户程序。
超线程和多核技术参见深入理解计算机第一章内容
存储器
存储器是计算机第二重要的器件,存储器是采用一种分层的结构,顶层的存储器速度较高,容量较小,与底层的存储器相比每位成本较高,其差别往往是十亿数量级。
image.png
- 寄存器:和CPU一样快,32为CPU中容量为32位,64位CPU中为64位,小于1KB
- 高速缓存:由硬件控制。主存被分割成高速缓存行,大小为64字节,地址0至63对应高速缓存行0,地址64至127对应高速缓存行1,以此类推。下面详细介绍:
- L1缓存:一般与处理器同片封装,访问速度几乎和寄存器一样快,用来将已解码的指令调入CPU的执行引擎,通常是2-4个时钟周期,大小为8KB-128KB
- L2缓存:可以在处理器中也可以在外部,访问速度大约是是10个时钟周期,大小为64KB-8MB
- L3缓存:在处理器外部被多核处理器共享,访问速度大约是30~40个时钟周期,大小为4MB-128MB
image.png
在多核芯片中,L2缓存是否被所有
image.png
- 主存:系统存储的主力。通常称主存为随机访问存储器(RAM)
- 磁盘:磁盘是一种机械装置,因此在磁盘上随机访问数据时会较慢。但是容量较大。
网友评论