第一章 引论
计算机由硬件和软件组成,软件中最基础的部分是操作系统,它运行在内核态(也称管态,核心态)。在这个模式中,操作系统具有对所有硬件的完全访问权,可以执行机器能够运行的任何指令。软件的其余部分运行在用户态下。在用户态下,只使用了机器指令中的一个子集。特别地,那些会影响机器的控制或可进行I/O操作的指令,在用户态中的程序里是禁止的。
用户接口程序处于用户态程序中的最低层次,允许用户运行其他程序。
1.1 什么是操作系统
1.1.1 作为扩展机器的操作系统
操作系统的任务是创建好的抽象,并实现和管理它所创建的抽象。
1.1.2 作为资源管理者的操作系统
操作系统的主要任务是记录哪个程序在使用什么资源,对资源请求进行分配,评估使用代价,并且为不同的程序和用户调解互相冲突的资源请求。
资源管理包括用以下两种不同方式实现多路复用(共享)资源:在时间上复用和在空间上复用 。
1.2 操作系统的历史
第一代:真空管和穿孔卡片(1945-1955)
第二代:晶体管和批处理系统(1955-1965)
第三代:集成电路和多道程序设计(1965-1980)
第四代:个人计算机(1980至今)
1.3 计算机硬件简介
1.3.1 处理器
1.每个CPU都有一套可执行的专门指令集。所以X86处理器不能执行ARM程序,反之一样。
2.由于用来访问内存以得到指令或数据的时间要比执行指令花费的时间还要长,因此,所有的CPU都有一些用来保存关键变量和临时数据的寄存器,
3.除了用来保存变量和临时结果的通用寄存器之外,多数计算机还有一些对程序员可见的专用寄存器,其中之一便是程序计数器,它保存了将要取出的下一条指令的内存地址。在指令取出后,程序计数器便被更新以便指向后续的指令。
4.另一个寄存器是堆栈指针,它指向内存中当前栈的顶端。该栈包含了每个执行过程的栈帧。一个过程的栈帧中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量。
5.程序状态字寄存器(PSW)。这个寄存器包含了条件码位、CPU优先级、模式(用户态或内核态),以及各种其他控制位。用户程序通常读入整个PSW,但是,只对其中少量的字段写入。
6.操作系统必须知晓所有的寄存器。在时间多路复用CPU中,操作系统经常会中止正在运行的某个程序并启动(或再启动)另一个程序,每次停止一个运行的程序时,操作系统必须保存所有 的寄存器值,这样在稍后该程序被再次运行时,可以把这些寄存器重新装入。
7.先前提到多数CPU都有两种模式,即前面已经提及的内核态和用户态。通常,在PSW中有一个二进制位控制这两种模式。当在内核态运行时,CPU可以执行指令集中的每一条指令,并且使用硬件的每种功能。
相反,用户程序在用户态下运行,仅允许执行整个指令集的一个子集和访问所有功能的一个子集。一般而言,在用户态中有关I/O和内存保护的所有指令是禁止的。当然,将PSW中的模式为设置成内核态也是禁止的。
8.为了从操作系统中获得服务,用户程序必须使用系统调用以陷入内核并调用操作系统。TRAP指令把用户态切换成内核态,并启用操作系统。计算机使用陷阱而不是一条指令来执行系统调用。
多线程和多核芯片
面对使用大量晶体管的问题,出现的解决方法。多线程和多核芯片。
1.3.2存储器
在任何一种计算机中,第二种主要部件都是存储器。由于技术原因,当前无法同时满足存储器迅速,充分大和便宜三个目标。于是出现了不同的处理方式——存储器系统采用一种分层次的结构。
存储器系统的顶层是CPU中的寄存器。材料与CPU相同,所以和CPU一样块。典型容量位32位CPU中位32*32位,64位CPU中64*64位。在这两种情形下,其存储容量都小于1KB。程序必须在软件中自行管理这些寄存器。
下一层是高速缓存,它多数由硬件控制。主存被分割成高速缓存行,其典型大小为64字节,地址
,地址0-63对应高速缓存行0,地址64-127对应高速缓存行1,以此类推。
再下一层是内存,这是存储器系统的主力。主存通常称为随机访问存储器(RAM)
1.3.3磁盘
固态硬盘不是磁盘。
虚拟内存机制需要映像内存地址,这种映像由CPU中的一个称为存储器管理单元的部件来完成。
1.3.4I/O设备
I/O设备的输入输出都需要中断机制。
1.3.5总线
1.4 操作系统种类
1.大型操作系统
2.服务器操作系统
3.多处理操作系统
4.个人计算机操作系统
5.掌上计算机操作系统
6.嵌入式操作系统
7.传感器节点操作系统
8.实时操作系统
实时操作系统分为硬实时和软实时
9.智能卡操作系统
1.5 操作系统概念
1.5.1进程
进程本质是一个正在执行的程序。与每个进程相关的是地址空间,这是个从某个最小值的存储位置到某个最大值的存储位置的列表。
一个进程暂时被挂起后,该进程的所有信息都要被保存下来,再次运行时状态与之前相同。
在许多操作系统中,与一个进程有关的所有信息,除了该进程自身地址空间的内容以外,均放在操作系统的一章表里,称为进程表,进程表时数组(或链表)结构。
所以,一个(挂起的)进程包括:进程的地址空间以及对应的进程表项。
与进程管理有关的最关键的系统调用是那些进行进程创建和进程终止的系统调用。
若一个进程能够创建一个或多个子进程,而这些子进程又可以创建子进程,则容易得到进程树。
系统管理器授权给每个进程使用一个UID。每个被启动的进程都有一个启动该进程的用户UID。子进程拥有与父进程一样的UID。用户可以是某个组的成员。每个组也都有一个GID。
在UNIX中,有一个UID称为超级用户,或者windows中的管理员。
1.5.2 地址空间
1.5.3文件
1.6系统调用
只有系统调用可以进入内核,而过程调用不可以。
系统调用分为四类:1.进程管理 2.文件管理 3.目录和文件系统管理 4.杂项
1.6.1 用于进程管理的系统调用
fork是唯一可以在POSIX中创建进程的途径,他创建一个原有进程的精确副本,包括所有的文件描述符、寄存器等内容。在fork后,原有的进程及其副本(父与子)就分开了。在fork时,所有的变量具有一样的值,虽然父进程的数据被复制用以创建子进程,但是其中的一个后续变化不会影响到另一个。fork调用返回一个值,在子进程中该值为零,并且在父进程中等于子进程的进程标识符(PID)。
1.6.2 用于文件管理的系统调用
要读写一个文件,先要使用open打开该文件,这个系统调用通过绝对路径名或指向工作目录的相对路径名指定要打开文件的名称。
1.6.3 用于目录管理的系统调用
1.7 操作系统结构
1.7.1 单体系统
除了在计算机初启动时所装载的核心操作系统外,许多操作系统支持可装载的扩展,诸如I/O设备驱动和文件系统,这些部件可以按照需要载入。在UNIX中它们被叫作共享库,在windows中被称为动态链接库(DLL)。它们的扩展类型为.dll
1.7.2层次式系统
1.7.3 微内核
1.7.4 客户端-服务器模式
1.7.5 虚拟机
1.7.6 外核