计算机系统的层次结构一般被分为五层,下面两层属于硬件部分,在前文计算机组成原理部分介绍,并对第四层汇编语言机器部分的x86的汇编指令进行了简短的讨论。
本文在前文基础上继续讨论第三层,即操作系统,主要内容是概述和进程相关。
1 概述
1.1 基本概念
1.1.1 什么是操作系统
在操作系统原理这个科目中,计算机系统被分成了四个层次:硬件、操作系统、应用程序和用户,和前面介绍的分类稍有不同。操作系统作为硬件上面的第一个软件,用来管理各种计算机硬件、为其他软件和用户提供接口,操作系统是计算机系统中最基本的系统软件。
1.1.2 操作系统的特征
这些特征可以用来区别于其他软件。
-
并发(concurrence) 并发是指两个或多个事件在同一时间间隔内发生,操作系统的并发性是同时存在多个运行的程序,这些程序在微观上是分时交替执行,一个cpu的系统每个时刻只能有一个程序在执行。与之相关的一个概念是并行。后者指的是同一时刻可以处理多个任务。
引入进程就为了程序的并发执行。 -
共享(sharing)
即资源共享,系统中的资源可供多个并发执行的进程共同使用。共享可分为互斥共享和同时访问两种,互斥是一些资源同一时刻只能一个进程访问,该进程用完才允许另一个进程访问;同时访问是指多个进程在一定的时间间隔对资源进行访问,宏观上是同时访问。
并发和共享是操作系统的最基本的特征,其中只有并发才会出现共享的情况,只有共享才能实现并发。 -
虚拟(virtual) 虚拟是把一个物理实体映射为若干逻辑上的对应物,用户实现虚拟的技术称为虚拟技术,操作系统利用虚拟技术实现了虚拟处理器、虚拟内存和虚拟设备。
其中虚拟处理器和虚拟设备可以使多个用户共用同一个物理实体就像各自独享一样,虚拟内存可以从逻辑上扩容内存。
操作系统的虚拟技术可归纳为
- 时分复用,比如处理器
- 空分复用,比如内存
- 异步(asynchronism) 多个程序并发的前提下,每个程序不能一次性执行到底,其中的速度不可知,这就是进程的异步性。操作系统需要在运行环境相同的情况下,保证多次运行的结果相同。
1.1.3 功能
为了给多道程序提供良好的运行环境,操作系统应具有以下功能
- 处理机管理(Processor Management,关于什么是处理机,这里理解为cpu)。在多道程序环境下,处理机的分配和运行都以进程(或线程)为基本单位,因此对处理机的管理就是对进程的管理。
- 存储器管理
- 文件管理
- 设备管理
为了让用户操作计算机硬件,发挥操作系统的各项功能,需要提供对应接口。接口分两类
- 命令接口 又可分为
- 联机命令接口 用户在控制台或终端输入一条命令,控制权就交给操作系统执行,完成工作后返还控制权,实现交互。
- 脱机命令接口 将一组控制命令提交给系统,用户不能干预作业的运行,由操作系统进行批处理操作。
- 程序接口 由一组系统调用组成,用户可以使用程序通过函数的形式执行这些调用
1.2 操作系统的发展
1.2.1 无操作系统阶段
在这个阶段,程序的装入、运行、结果输出都需要人工干预,i/o和cpu速度不匹配,机器的利用率很低
1.2.2 批处理阶段
为了解决前述矛盾,出现了批处理,批处理又分为单道批处理和多道批处理。 单道批处理的系统在内存中始终保持一道任务,为了进一步提高资源利用率引入了多道程序技术,后者多个程序同时运行,当一道程序程序因i/o请求暂停运行时,cpu便去运行另一道程序,让各个部件尽量去忙。 批处理系统在处理任务期间没有交互能力。
1.2.3 分时操作系统
分时技术指的是把处理器的运行时间分为很短的时间片,按时间片轮流把处理器分配给各联机作业使用。由于计算机速度很快,作业运行流转也很快,因此每个用户都感觉自己独占一台计算机。
分时操作系统使多个用户通过终端同时共享一台主机,它们可以同时与主机交互而不互相干扰。
分时操作系统解决了交互问题,但是有些场景需要系统在短时间做出处理。
1.2.4 实时操作系统
为了能在短时间完成某些紧急任务而不需要时间片排队,引入了实时操作系统。
1.3 操作系统的运行环境
1.3.1 操作系统的运行机制
cpu执行的程序分为两种性质,一种是内核程序,一种是应用程序,前者是后者的管理者,可以执行一些特权指令。
特权指令是指的系统调用,这些调用涉及到资源管理、进程管理等,对整个系统影响很大,因此只能内核程序调用。
对应的是在cpu存在两种状态,核心态(又称管态和内核态)和用户态(又称目态)。只有在核心态时才能执行特权指令。内核程序运行在核心态,应用程序运行在用户态。
内核程序包括四个方面的内容
- 时钟管理,处理各种和时间相关的
- 中断机制,引入中断技术是为了在多道程序运行时提高资源利用率,中断机制中只有一小部分功能属于内核,负责保护和恢复中断现常的信息,转移控制权到相关的处理程序。
- 原语(atomic operation),是一些可被调用的共用操作集来原子性执行(不能被打断)一些调用频繁的任务,比如进程通信、cpu切换等
- 系统控制的数据结构及处理,比如pcb等
一个应用程序要想发起系统调用、执行特权指令才能调用的功能,需要执行陷入指令(trap指令或访管指令),即将cpu的使用权交给内核程序、操作系统内核程序处理完后将cpu使用权返还给应用程序。这里可以将系统调用理解为一个函数调用。
1.3.2 中断
在上一篇计算机组成的指令周期时提到,一个指令周期包括多个cpu周期。当一条指令执行期间需要交换中断信号时,该指令会含有一个中断周期,会在指令结束前发中断查询信号,若有中断请求,cpu进入中断处理阶段。
中断可以用来将cpu从用户态转向核心态来为应用程序执行特权操作,也可以使一个程序将未使用的资源释放以提高资源利用率。
- 中断分类
中断可以分为外中断和内中断。
其中外中断(interruption),源自cpu指令以外的事件,比如i/o结束中断表示输入输出已经完成、时钟中断表示固定的时间片到期。这一类指令与当前处理机处理的程序无关。
内中断(又称异常exception,陷入trap),源自cpu指令内部的事件,具体又可分为
- 自愿中断 比如陷入指令
- 被迫中断 比如地址越界、算术溢出
- 中断处理过程
这里只介绍了外中断处理的常规流程,分为以下阶段
- 关中断 cpu响应中断后,停止接收更高级中断请求
- 保存断点 为保证中断服务程序执行完毕后能继续执行原来的程序,需要把断点(pc中保存的指令)保存起来
- 引出中断服务程序 将中断服务程序的入口地址送入pc
- 保存现场和屏蔽字,现常是程序状态字寄存器(pswr)和某些通用寄存器的内存,屏蔽字用来表示优先级等中断状态
- 开中断 开始接收更高级中断请求
- 执行中断服务程序
- 关中断
- 恢复现场和屏蔽字
- 开中断,中断返回,继续执行原程序
1.4 操作系统的体系结构
操作系统分为大内核和微内核,如上所述,操作系统分为核心态和用户态,核心态要为用户态提供接口,如果操作系统的主要功能运行在核心态就是大内核,否则是微内核。
2 进程管理
2.1 进程
2.1.1 概念和特征
在多道程序环境下,为了使多个程序并发执行,引入了进程的概念。为了标记和保存特定进程的状态数据,每个进程包含一个数据结构,即pcb(process control block),创建进程就是创建这个进程的pcb. pcb和程序段、相关数据段一起组成一个进程实体,这个实体是静态的,而进程本身是动态的,可以理解为程序的一次运行过程,结合进程实体可以把进程理解为是进程实体的一次运行过程,是资源分配和调度的一个独立单位。
进程相对于程序而言,有以下特征
- 动态性 是进程最基本的特征,进程是带有生命周期的过程。
- 并发性
- 独立性
- 异步性
- 结构性,即进程实体的三个组成部分
进程的三部分如下
- 进程控制块 作为进程的唯一标志,其中保存着进程的各种信息,可以分为以下四类
- 进程描述信息,包括进程标识符(标记进程)和用户标识符(标记所属用户)
- 进程控制信息,包括状态和优先级等
- 资源分配清单,包括内存地址、所打开的文件清单和使用的输入输出设备
- 处理机相关信息,各寄存器的值
- 程序段
是被调度到cpu执行的代码段,多个进程可以同一个程序 - 数据段 包括原始数据和中间数据及输出结果
2.1.2 进程的状态与转换
进程的生命周期会在以下状态间变换
- 创建态 进程正在被创建,通常需要以下步骤
- 申请一个空白的pcb,并写入一些控制和管理信息
- 系统分配一些必要的资源
- 将该进程转入就绪态
- 就绪态 进程获得了除处理机外的一切所需资源,一旦得到处理机(处理机),便立即进入运行态。系统中所有就绪态的进程可能会有多个,它们排成一个队列,即就绪队列
- 运行态 进程在处理机上运行,单处理机环境每个时刻只有一个进程出于运行态
- 阻塞态 又称等待态,由于缺少处理机以外的其他资源或等待某一事件(比如i/o)而停止运行
- 结束态 由于进程正常完成或者中断退出,进程被置为结束态后,进一步释放资源
2.1.3 进程控制
对进程的控制就是对一个进程在各个状态间切换,由各种原语控制,具体可分为
- 进程的创建
在操作系统中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求都会引起进程的创建。一个进程也可以创建另一个进程,此时创建者是父进程,被创建者是子进程,子进程继承父进程的资源,子进程撤销时归还资源给父进程,且父进程被撤销时,其所有子进程也会被撤销。
创建进程使用创建原语,过程如下
- 为新进程分配一个pid,并申请一个空白的pcb(pcb限量),如果申请失败则创建失败
- 为进程分配资源,比如内存空间,如果资源不足则处于阻塞态等待资源
- 初始化pcb
- 如果就绪队列可以接纳,则进入就绪状态
- 进程的终止 引起进程终止的事件有三种
- 正常结束
- 内部异常结束
- 外界干预
终止进程要用撤销原语,过程如下 - 根据pid检索pcb,并读取其状态
- 如果处于执行状态,立即终止并将处理机分配给其他进程,然后将其资源以及子孙进程的资源归还给父进程或者操作系统
- 将此pcb从所在队列中删除
-
进程的阻塞和唤醒
分别使用阻塞原语和唤醒原语在运行态和阻塞态之间转换 -
进程切换 进程切换是处理机从一个进程的运行转到另一个进程上运行,过程如下
- 保存处理机上下文,包括pc和其他寄存器等
- 更新原进程pcb,并移入就绪或阻塞队列
- 运行另一个进程,并更新其pcb
- 恢复处理机上下文
2.1.4 进程通信
这里会介绍三种较速度快、传输量大的通信方式,另外pv通信会在后文介绍。
-
共享内存
需要通信的进程间有一块两个进程都可读写的空间,包括数据结构和内存两种方式。操作系统提供了共享使用的存储空间和同步互斥工具,各进程各自进行读写操作。 -
信息传递 进程可以通过系统提供的消息传递方式进行传递,包括直接通信和间接通信两种
-
管道通信 管道是连接一个读进程和一个写进程以实现通信的pipe文件,写进程以字符流的形式写入,读进程读出。这种通信是半双工的,且读取后就会抛弃。
2.2 线程
2.2.1 引入线程的必要性
进程解决了多道程序的并发,但是进程的创建销毁和切换时空开销过大,因此引入了线程,可以理解为轻量级进程。
引入线程以后,进程只作为除cpu以外的资源分配单元,线程作为cpu的分配单元,每个线程除了拥有少量必要资源外,还和同一个进程内的其他线程共享其他资源,同一进程内线程的切换开销很小。
线程也有就绪、阻塞和运行三种状态。
2.2.2 线程的实现方式
线程分为用户级线程和内核级线程,对于用户级线程,内核感受不到线程的存在,应用程序以单线程开始,可以利用线程库创建新的线程。
内核级线程,线程管理在内核完成,应用程序只有一个到内核级线程的接口。
2.2.3 多线程模型
有些系统同时支持用户级和内核级线程,因此产生了不同的多线程模型,即用户级别线程到内核级别线程的对应关系
- 多对一模型 多个用户级线程对应一个内核级线程,线程管理在应用程序中
- 一对一模型
- 多对多模型
2.3 处理机调度
2.3.1 调度原因
在多道程序系统中,进程数目往往大于处理机数量,因此需要对为各个进程分配处理机,其中分配到处理机的进程处于运行态。
2.3.2 调度层次
一个作业从提交到完成需要三个层次的调度,分别为
- 作业调度 又称高级调度,按照一定原则从处于后备状态的作业中挑选作业分配资源创建进程,没作业会被作业调度两次,调入一次调出一次
- 内存调度 又称中级调度,将暂时不能运行的进程调至外存等待,由阻塞态转为挂起态,即比五种状态多了一种,增加了内存利用率
- 进程调度 又称低级调度,用来从就绪队列中选一个分配处理机。
2.3.3 进程调度方式
即有一个优先级更高的进程进入就绪队列,怎么分配处理机,这里分两种
- 非剥夺调度 正在运行的进程继续运行,直到完成或者阻塞
- 剥夺调度 立即停止当前进程,分配处理机给高优先级进程
2.3.4 调度方式
下面介绍的几种调度算法可以适用于三个层次调度的一种或多种
- 先来先服务
- 短作业优先
- 优先级调度
- 高响应比优先
- 时间片轮转
- 多级反馈队列,综合了时间片和优先级
2.4 进程同步
2.4.1 进程同步的概念
在多道程序环境下,进程之间具有依赖关系,且由于操作系统的异步,如果不加以限制,执行顺序会不一定,这种限制就是指的是进程同步。
下面介绍几种概念
- 临界资源 指的是一次仅允许一个进程使用的资源,比如打印机。
- 同步 同步指的是直接制约关系,即协调为完成某个任务而创建的多个进程的执行顺序
- 互斥 也称间接制约关系,一个进程使用临界资源时,另一个进程必须等待。实现互斥有软件实现和硬件实现两种
2.4.2 信号量
信号量可以用来解决同步和互斥问题,由两个标准原语组成wait和signal,又称p操作和v操作,前者用于等待,后者用于唤醒。
2.4.3 管程
在信号量机制中,每个要访问临界资源的都需要有自己的pv操作,大量分散的同步操作给系统管理带来麻烦,于是引入了新的进程管理工具,管程,实现了进程互斥,而不需要进程自己实现。
2.5 死锁
2.5.1 概念
在多道程序系统中,当多个进程相互等待对方的资源陷入等待时就成发生了死锁,死锁产生的必要条件包括
- 互斥条件 进程要求的资源仅能一个进程使用
- 不可剥夺条件 资源在用完之前不能被剥夺
- 请求并保持 对已有资源不会因获取不到其他所需资源而释放
- 循环等待 存在一种进程资源的循环等待链
2.5.2 死锁的处理策略
为避免死锁,需要破坏死锁的四个必要条件,或者允许死锁发生但能监测出并解决。
3 内存管理
内存管理主要包括以下功能
- 内存空间的分配和回收
- 地址转换 将逻辑地址转化为物理地址
- 内存空间扩展,使用虚拟空间
- 存储保护 各道作业存储空间互不干扰
传统的内存管理方式需要将作业一次性全部装入内存,并且一直驻留在内存,对内存浪费。为了解决这个问题引入了虚拟内存,即将程序的一部分装入内存,将需要的内存装入内存,将暂时不需要的移出内存,这样好像为用户提供了比实际内存大得多的存储器,即虚拟存储器。
4 文件管理
本章会介绍文件相关基本概念,不讨论具体实现。
4.1 概念
文件是存储在辅存中的信息集合,包括文本文档、图片、程序等。用户进行的输入输出中,通常以文件为单位,可使用文件管理系统用来管理文件。
4.1.1 文件属性
- 名称
- 标识符,在系统内部的id
- 类型
- 位置
- 大小
- 保护
- 时间、日期、用户标识
4.1.2 文件的基本操作
- 创建文件
- 写文件
- 读文件
- 文件寻址
- 截断文件,即删除里面内容
4.2 文件的逻辑结构
文件的逻辑结构是从用户角度看到的文件组织形式,可分为
- 无结构文件(流式文件) 前端使用时可以参考whatwg的规范stream
- 有结构文件(记录式文件) 包括
- 顺序文件
- 索引文件
- 索引顺序文件
- 直接文件或散列文件