操作系统引论
操作系统的定义:计算机操作系统是管理和控制计算机软、硬件资源,合理地对各类作业进行调度,以及方便用户使用计算机的程序的集合。
操作系统所处的地位:是裸机之上的第一层软件,是建立其他所有软件的基础。
操作系统的基本特征:并发、共享、虚拟和异步性。
操作系统的五大主要功能:存储器管理、处理机管理、设备管理、文件管理、用户接口管理。
操作系统的形成和五大类型:批处理操作系统、分时操作系统、实时操作系统、网络操作系和分布式操作系统。
计算机操作系统的 4 个发展阶段:手工探作阶段(对应第一代计算机),早期批处理和执行系统(对应第二代计算机),批量操作系统、分时操作系统(对应第三代计算机),个人计算机操作系统、网络操作系统,分布式操作系统(对应现在的第四代计算机)。
批量操作系统的的主要特征是“批量”,优点是系统吞吐率高,缺点是对用户的响应时间较长,用户不能及时了解和控制自己的程序的运行。
分时系统的主要特点:多路性、独立性、及时性、交互性。
实时操作系统的特点以及与分时系统的区别:
- 系统对外部实时信号必须能及时响应,响应的时间间隔要足以能够控制发出实时信号的那个环境。
- 系统要求有高可靠性和安全性,效率则放在第二位。
- 系统整体性强,要求所管理的联机设备和资源,必须按一定的时间关系和逻辑关系协调工作。
- 实时操作系统没有分时操作系统那样强的交互会话能力,通常不允许用户通过实时终端设各去编写新的程序或修改己有的程序,终端设备只作为执行装置或询问装置。
- 分时系统通用性强,交互性强,及时响应性要求一般(通常数量级为秒):实时系统往往是专用的,系统与应用很难分离,常常紧密结合在一起,实时系统并不强调资源利用率,而更关心及时响应性(通常数量级为毫秒或微秒)、可靠性等。
多道程序设计:在内存中同时存放若干个作业,并使他们共享系统的资源且同时运行。有利于提高 CPU 的利用率,提高内存和 I/O 设备的利用率,提高系统的吞吐量。
进程的描述与控制
程序顺序执行的特征:顺序性、封闭性、可再现性。
程序并发执行的特征:间断性、失去封闭性、不可再现性。
进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。
进程的特征:动态性、并发性、独立性、异步性。
进程的基本状态:就绪、执行、阻塞。
进程控制块(PCB)的作用是将程序变成可并发执行的进程。
进程控制是进程管理的最基本功能,主要包括创建和终止进程、负责进程运行过程中的状态转换等,是操作系统的内核通过原语实现的。
进程同步是指多个相关进程在执行次序上进行协调。
两种制约关系:
- 间接相互制约(资源共享)互斥。
- 直接相互制约(进程合作)同步。
临界资源:一次仅允许一个进程使用。
临界区:访问临界资源的那段代码。
同步资源应遵循的规则:空闲让进、忙则等待、有限等待、让权等待。
信号量(用来实现进程同步的整型或者记录型变量):
- wait(P):请求一个信号量
- signal(V):释放一个信号量
管程:由一组局部的共享变量、对局部变量进行操作的一组过程以及对局部变量进行初始化的语句序列构成的一个软件模块。
进程通讯:进程之间的信息交换。
低级通讯:如进程之间的同步和互斥,可进行一定的信息的交换。
高级通讯:用户可直接利用操作系统所提供的一组通讯指令,高效地传送大量数据的一种通讯方式。包括共享存储器系统、管道通信、消息传递系统、客户机-服务器系统
线程:一个可执行的实体,CPU 调度和分派的基本单位。
OS 引入进程的目的:实现多个程序并发执行。
进程和程序的区别:
- 每个进程实体包含了程序段和数据段两个部分。
- 进程是程序执行一次的过程,是动态的,而程序是静态的。
- 多个进程实体能够并发的执行,而程序并发执行具有不可再现性。
- 进程是一个能够独立运行、独立分配资源和独立接受调度的基本单位,而程序不能独立运行。
- 进程和程序不一一对应。
消息缓冲队列通信机制应具有的功能:构成消息、发送消息、接受消息、互斥和同步。
进程和线程的比较:
- 调度性:传统操作系统中,进程是拥有资源、调度分配的基本单位,在引入线程的操作系统中,线程是调度和分配的基本单位。
- 并发性:引入线程的操作系统中,不仅进程能并发执行,同一进程内的多个线程也能并发执行。
- 拥有资源:进程是拥有资源的基本单位,线程只拥有运行过程中必不可少的小份资源。
- 独立性:线程之间的独立性要比进程之间的独立性低。
- 开销:进程切换时所要保存和设置的现场信息明显多于线程。
- 支持多处理机系统:传统的进程,只能运行在一个处理机上,多线程的进程可以运行到多个处理机上。
处理机调度与死锁
一个作业从提交开始,一般经历三个调度:
- 高级调度(作业调度、长程调度):决定把外存队列中的哪些作业调入内存,为他们分配资源,并创建进程。
- 低级调度(进程调度、短程调度);决定哪些进程先分配给处理机。
- 中级调度(内存调度、中程调度):按一定的算法将外存中已具备运行条件的进程换入内存,将内存中某些阻塞状态的进程换至外存。
调度算法:
- 先来先服务算法(FCFS):选择最先进入就绪队列的进程投入执行(非抢占调度),既可用于作业调度也可用于进程调度。
- 短作业优先(SJF):选择就绪队列中估时最短的进程投入执行(非抢占和抢占调度都可),既可用于作业调度也可用于进程调度。
- 优先级调度算法(PSA):根据进程紧迫程度赋予每个进程优先级,选择最先优先级的进程投入使用(非抢占和抢占调度都可),既可用于作业调度也可用于进程调度,优先级分为动态优先级和静态优先级。
- 高响应比优先调度算法(HRRN):实际上时动态优先级调度算法,以响应比作为进程或作业的动态优先权。响应比=响应时间/要求服务时间=(等待时间+要求服务时间)/要求服务时间。
- 时间片轮转法(RR):在分时系统都采用时间片轮转法调度进程,将进程按 FIFO 排成一个队列,每次只能执行一个时间片,再放入队尾(抢占调度),只能用于进程调度。
- 多级队列调度算法:将不同性质或类型的就绪进程固定分配到不同的进程队列中,队列可采取自己的调度方法。
- 多级反馈队列调度算法(FB):设置多个不同优先级的就绪队列,优先级越高,时间片越小,新就绪的进程总是排在第一级队列末尾,队列采取 FCFS 执行,若没在规定时间片内完成,则放置下一级队列末尾,按照优先级依次执行队列中的进程。
实时调度算法:
- 最早截止时间优先算法(EDF):非抢占和抢占调度都可。
- 最低松弛度优先算法(LLF):松弛度=任务必须完成时间-任务本身运行时间-当前时间,通常为抢占调度。
抢占原则:
- 优先权原则。
- 短作业优先原则。
- 时间片原则。
死锁:一个进程集合中每个进程都在等待只能由该集合中的其他进程才能引发的事件,那么该组进程进入死锁状态。
产生死锁的原因:资源竞争、进程推进顺序非法。
产生死锁的必要条件:互斥条件、请求与保持条件、不剥夺条件、环路等待条件,后三个条件可以预防。
银行家算法的数据结构:
- 可利用资源向量
Available
:是个含有 m 个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K
,则表示系统中现有 Rj 类资源 K 个。 - 最大需求矩阵
Max
:这是一个 n×m 的矩阵,它定义了系统中 n 个进程中的每一个进程对 m 类资源的最大需求。如果Max[i,j]=K
,则表示进程 i 需要 Rj 类资源的最大数目为 K。 - 分配矩阵
Allocation
:这也是一个 n×m 的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K
,则表示进程 i 当前已分得 Rj 类资源的 数目为 K。 - 需求矩阵
Need
:这也是一个 n×m 的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K
,则表示进程 i 还需要 Rj 类资源 K 个,方能完成其任务。Need[i,j]=Max[i,j]-Allocation[i,j]
。
设进程 cusneed 提出请求 REQUEST [i]
,则银行家算法按如下规则进行判断。
- 如果
REQUEST [cusneed] [i]<= NEED[cusneed][i]
,则转(2);否则,出错。 - 如果
REQUEST [cusneed] [i]<= AVAILABLE[i]
,则转(3);否则,等待。 - 系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
- 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
安全性检查算法:
- 设置两个工作向量
Work=AVAILABLE
、FINISH
- 从进程集合中找到一个满足下述条件的进程,
FINISH==false
;NEED<=Work
;如找到,执行(3);否则,执行(4) - 设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work=Work+ALLOCATION;
Finish=true;
GOTO 2
- 所有的进程
Finish = true
,则表示安全;否则系统不安全。
死锁的解除:剥夺资源、撤销进程。
引起进程调度的因素:
- 正在执行的进程正常终止或异常终止。
- 正在执行的进程因某种因素阻塞:提出 I/O 阻塞,资源不足阻塞,执行原语阻塞。
- 引入时间片系统中,时间片用完。
- 在抢占调度方式中,优先权更高的进程进入就绪队列。
存储器管理
物理地址:程序在内存中的位置。
逻辑地址:模块中指令和数据的地址是相对于装入模块的首字节而编址的。
程序的装入:
- 绝对装入模式:在编译时,事先知道程序将驻留在内存的哪个位置,则编译程序可直接将程序的符号地址转换成绝对地址。
- 可重定位装入模式和静态重定位:由装入程序根据主存的实际使用状况,将装入模块装入主存适当的地方。
- 动态运行时装入模式:对程序的重定位不在装入时进行,而应推迟到程序真正执行时进行。
程序的链接:将编译后的目标模块以及所需库函数连接在一起,形成一个完整的装入模块。
- 静态链接方式:在程序执行之前,将各目标模块以及所需库函数链接形成一个完整的装入模块,以后不在拆开。
- 装入时动态链接:链接在装入时进行,优点便于对程序模块进行修改和更新。
- 运行时动态链接:链接在程序运行时进行,能提高内存的利用率。
连续内存分配:为一个用户程序分配一段连续的内存空间。
- 单一连续分配:将内存分为系统区和用户区,用户区仅能存放一道作业。
- 固定分区分配:将内存的用户空间分成若干个区域,这些分区大小位置不再变化,每个分区仅能存放一个作业。
- 动态分区分配:当作业装入时,动态地为作业从可用内存中划分出一个分区,有一下算法:
- 首次适应算法:将空闲分区按起始地址递增的次序排列。
- 循环首次适应算法:将空闲分区按起始地址递增排列形成循环链表,每次分配位置从上次分配位置之后查找。
- 最佳适应算法:将满足要求的最小空闲分区分配出去。
- 最坏适应算法:将满足要求的最大空闲分区分配出去。
- 可重定位分区分配:通过移动作业位置,对内存进行紧凑。
分区的保护:防止一个用户作业破坏系统作业或其他用户作业。
- 界限寄存器:存放正在运行的作业的起始和结束地址。
- 保护键:为分区分配一个单独的保护键,相当于锁,为进程分配一个单独保护键,相当于钥匙。
对换:将内存中暂时不能运行的进程或暂时不用的数据或程序,调到外存中去。
基本分页存储方式的基本方法:系统将进程的逻辑地址空间分成若干个大小相等的片,称为页,同时将内存空间分成若干个与页面同样大小的块,称为物理块。
分段存储方式:根据自己作业的逻辑关系将内存空间分成若干段,若不存在段上则产生越界中断。
分段和分页的比较:
- 页是信息的物理单位,分页是为了提高内存利用率;段是逻辑单位,分段是为了更好满足用户需要。
- 页的大小固定,段的大小不固定。
- 分页的地址空间是一维的,分段的地址空间是二维的。
分段更容易实现信息的共享。
虚拟存储器
虚拟存储器:具有请求调入功能和置换功能、能从逻辑上对内存加以扩充的存储器系统。必须建立在离散分配的基础上。
虚拟存储器的特征:多次性、对换性、虚拟性。
请求分页存储管理方式:在分页的基础上增加请求调页功能和页面置换功能。
请求分页原理:与分页系统对地址空间和内存空间采用相同的方式,但它只要求将部分页面放入内存中便可开始运行作业,其余页面放在磁盘中。
页表项出了内存块号和存取访问字段外还有状态位 P(表示是否调入内存)、访问字段 A(记录本页在一段时间内被访问的次数或未被访问的持续时间)、修改位 M(表示进入内存后是否被修改过)、外存地址。
内存分配策略和置换策略:
- 固定分配局部置换策略:为进程分配固定的物理块数目,只能换出进程自己的页面。
- 可变分配全局置换策略
- 可变分配局部置换策略
调页策略:
- 请求调页策略:请求时若不在内存,则调入。
- 预调页策略:预先调入可能需要的页面。
置换策略:
- 最佳置换算法(OPT):选择以后不在使用或最长时间内不再被访问的页面予以淘汰。
- 先进先出置换算法(FIFO):最先进入内存的予以淘汰。
- 最近最久未使用置换算法及其近似算法(LRU):赋予一个访问字段 t,记录自上一次访问经历的时间,选择 t 最大的予以淘汰。
- clock 算法:设置访问位和修改位,进入内存为 1,每次遍历将其变成 0。
- 最少使用置换算法(LFU):选择内存访问次数最少的页面予以淘汰。
- 页面缓冲算法(PBA):设置缓冲池。
请求分页存储管理方式:在分段的基础上增加请求调页功能和页面置换功能。
输入输出系统
I/O 系统是用于实现数据输入、输出和存储的系统。
I/O 系统应具有的基本功能:
- 隐藏物理设备的细节(对设备的抽象)。
- 与设备的无关性。
- 提高处理机和 I/O 设备的利用率。
- 对 I/O 设备进行控制。
- 确保对设备的正确共享。
- 错误处理。
I/O 设备:执行 I/O 操作的机械部分。
- 按信息交换的单位分类:块设备(数据块为单位)、字符设备(字符为单位)。
- 按使用特性分类:存储设备、I/O 设备。
- 按传输速率分类:低速设备、中速设备、高速设备。
设备控制器:CPU 和 I/O 设备的硬件接口,它接收从 CPU 发来的命令,并去控制一个或多个设备。
CPU 可通过两种方式来读取设备控制器里的寄存器:给每个控制寄存器分配一个 I/O 端口号;内存映射 I/O。
I/O 通道:独立于主机 CPU、专门用来管理 I/O 设备的特殊处理机。
中断:CPU 暂停当前执行的程序,保留现场,去处理相应的事件,处理完事件之后,再回到断点继续执行暂停程序。
I/O 中断处理程序工作过程:
- 检查本次 I/O 操作的完成情况。
- 进行 I/O 结束或错误处理。
- 唤醒被 I/O 阻塞的进程。
- 启动下一个请求。
- 中断返回。
设备驱动程序:I/O 进程和设备控制器之间的通信程序。
设备驱动程序处理过程:
- 将抽象要求转换成具体要求。
- 检查 I/O 请求的合法性。
- 读出和检查设备状态。
- 传输必要参数。
- 启动 I/O 设备。
I/O 控制方式:
- 轮询方式:一段时间发送 I/O 请求。
- 中断方式:先阻塞进程,执行其他进程,直到 I/O 设备空闲。
- 直接存储器访问方式(DMA)。
- I/O 通道控制方式。
设备无关性:应用程序与与具体使用的物理设备无关。
通过在系统配置:设备控制表 DCT;控制器控制表 COCT;通道控制表 CHCT;系统设备表 SDT;实现都独占设备的分配。
同时,在系统中需要配置一张逻辑设备表 LUT,用于将逻辑设备名映射为物理设备名。
SPOOLing(假脱机操作)技术是对脱机输入、输出系统的模拟。由以下组成:输入井和输出井(用来模拟脱机输入输出时的磁盘)、输入输出缓冲区(暂存数据)、输入输出进程(脱机输入输出时的外围控制机)、井管理程序(控制作业与磁盘井之间的数据交换)。
假脱机打印系统:在输出井中申请一个空闲的磁盘块区,将输出的数据放入其中;为用户申请一张空白的用户请求打印表,将用户打印要求填入表中,再将其挂到假脱机文件队列上。
固定头磁盘:在每条磁道上都有一读/写磁头,所有的磁头都被装在一刚性磁臂中。这种结构的磁盘主要用于大容量磁盘上。
移动头磁盘:每一个盘面仅配有一个磁头,也被装入磁臂中。为能访问该盘面上的所有磁道,该磁头必须能移动以进行寻道。广泛应用于中小型磁盘设备中,在微型机上配置的温盘和软盘都采用移动磁头结构。
磁盘寻道时间:磁头移动到磁道上所经历的时间。
旋转延迟时间:扇区移动到磁头下面所经历的时间。
传输时间:实际进行读写的时间。
磁盘调度(当有多个进程要访问磁盘时,根据某种算法决定为哪个磁盘先服务,使平均寻道时间最短):
- 先来先服务调度算法(FCFS)。
- 最短寻道时间优先调度算法(SSTF)。
- 扫描调度算法(SCAN):又称电梯调度算法,当前磁头移动方向上与磁头所在磁道最近的磁道上的请求。
- 循环扫描调度算法(CSCAN):磁头移动方向不变。
- N-step-SCAN 调度算法:将磁盘请求队列分成长度为 N 的若干个子队列,采用 FCFS 依次处理这些子队列,每个子队列用 SCAN 处理。
- FSCAN 调度算法:N-step-SCAN 调度算法的简化,分为两个子队列,一个用 SCAN 处理,在扫描期间到达的请求放入另一个队列。
文件管理
文件:具有文件名的一组相关信息的集合。
文件系统:操作系统中与文件管理有关的那部分软件以及被他们管理的文件和文件属性的集合。
文件系统应具有的功能:
- 文件存储空间管理。
- 目录管理。
- 读写管理。
- 安全性管理。
- 提供数据接口。
文件的使用:创建、删除、读、写、设置文件的读/写指针、打开、关闭。
文件的逻辑结构:从用户角度出发所观察到的文件组织形式。
从逻辑结构考虑可分为:有结构文件(数据组成可分为数据项、记录和文件)和无结构文件(由字符流构成)。
文件目录用来对对文件实施有效的管理。
文件控制块(FCB)是 OS 描述和控制文件的一个数据结构,基本内容有文件名和文件物理地址。
文件控制块的有序集合称为目录,通常存放在外存中。
目录结构(文件目录的组织方式):
- 单级目录结构:文件系统中只建立一张目录表,每个文件占其中一个表项。
- 两级目录结构:系统为每个用户建立一个单独的文件目录,还建立个主文件目录,每个用户文件目录占其中一个表项。
- 多级目录结构(树形目录结构)。
文件共享(系统允许多个用户(进程)使用同一个文件):
- 基于索引结点的共享方式:在索引结点上新增一个共享数目的字段。
- 利用符号链实现文件共享:新建一个包含共享文件地址的文件。
外存的分配通常以块为单位:
- 连续组织方式:为每个文件分配一组相邻的物理块。
- 链接组织方式:隐式链接(将文件离散的分配在外存上,首个物理块地址存在文件的 FCB 中,后面地址存在前一块物理块中);显式链接(链接指针登记在文件分配表中)。
- 索引组织方式:为每个文件建立索引表,登记分配给文件的所有物理块号。
- 混合索引方式:直接地址、一次间址、多次间址。
- NTFS 的文件组织方式:以卷为单位,将每一卷中的所有信息记录在一张主控文件表中。
文件存储空间管理方法:
- 空闲表法:用一张空闲表来管理空闲的文件存储空间。
- 空闲链表法:将所有空闲区拉成一条空闲链。
- 位示图法:用二进制的一位表示一个块的存储情况。
- 成组链接法:所有空闲盘块按固定大小分成若干组。
磁盘存储器的管理
提高磁盘 I/O 速度的途径:磁盘高速缓存、提前读、延迟写、优化物理块布局、虚拟盘、廉价磁盘冗余阵列。