第一章:概述
1.1、基本概念
**概念:**控制和管理计算机软件和硬件资源
特征:
- 并发:两个或多个时间在同一时间间隔内发生。
- 并发:一段时间内,宏观上同时发生,微观上交替执行。
- 并行:同一时刻下完成两种或两种以上工作。
- 共享:系统中的资源可供内存中多个并发进行的进程使用。
- 虚拟:一个物理实体变为若干逻辑上的对应物。
- 异步:进程的执行,不是一贯到底,而是走走停停,以不可预知的速度向前推进。
操作系统的目标和功能:
- 管理功能
- 处理机管理
- 存储器管理
- 文件管理
- 设备管理
- 接口功能
- 命令接口:联机、脱机
- 程序接口:系统调用
1.2、操作系统发展与分类
手工操作阶段
- 存在人机矛盾,CPU等待手工操作,资源利用率低
单道批处理阶段
- 一定程度上缓解了人机矛盾,但内存中仅有一道程序执行,高速CPU仍要等待低速的I/O操作,资源利用率不高
多道批处理阶段
- 多个独立的程序能同时运行,宏观并行,微观串行。资源利用率提高。
- 但没有人机交互功能。
分时操作系统
- 提供人机交互功能,处理器划分时间片,按时间片轮流把处理器分配给不同作业。
- 但不能处理一些紧急事务。
实时操作系统
- 接收信号后能及时处理,并在严格时间内处理完接收的事件。
分布式计算机
- 系统中任一计算机构成子系统,共享资源,并行工作,协同完成任务。
1.3、运行环境
CPU状态:
- 内核态:
- 用户态:
**中断:**为了进行核心态和用户态两种状态的切换,引入中断机制。
- 内中断(异常、例外)
- 陷入
- 故障
- 终止
- 外中断(中断)
- 时钟中断
- I/O中断请求
中断处理过程:
- 关中断
- 保存断点
- 中断服务程序寻址
- 保存现场和屏蔽字
- 开中断
- 执行中断服务程序
- 关中断
- 恢复现场和屏蔽字
- 开中断
- 中断返回
系统调用:
- 是操作系统向用户程序提供的接口,用户在程序中调用操作系统的一些子功能。
系统调用与库函数的区别?
- 系统调用是内核提供给用户程序的接口,运行在内核空间,许多库函数会使用系统调用来完成自己的功能,没有系统调用的库函数,效率更高,因为不需要上下文的切换。
大内核与微内核:
- 大内核:主要功能模块都运行在核心态
- 高性能,但结构混乱,难以维护
- 微内核:只将最基本的功能保留在内核
- 结构清晰,方便维护,可靠稳定;但降低了系统性能
第二章:进程管理
2.1、进程与线程
进程:
- 进程是程序的一次执行过程,是资源分配的基本单位
进程的状态和转换:
- 创建态
- 就绪态:仅缺少处理机
- 运行态:
- 阻塞态:等待态,等待某一事件
- 结束态
阻塞是一种自主行为,请求资源失败,或等待某种操作的完成,进程会自我阻塞。
唤醒是被动行为,被相互联系的其他进程唤醒。
进程的通信:
- 共享存储:通信进程之间存在一块共享空间,通过对共享空间的读写实现进程之间的信息交换。
- 消息传递:数据交换以格式化的消息为单位,进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
- 管道通信:发送进程将数据写入管道,接收方从管道中接收数据。管道半双工通信,不能同时读和写。
线程:
- 为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能,引入了线程。
线程特征:
- 同一进程的线程共享该进程的全部资源。
进程和线程的比较:
- 传统中进程是资源和处理机调度的基本单位。
- 引入线程后,进程是资源分配的基本单位,线程是处理机调度的基本单位。
- 引入线程后,进程可以并发执行,多个线程之间也可以并发执行。
用户级线程和内核级线程:
多线程模型:
- 多对一:多个用户级线程映射到一个内核级线程。
- 效率高,但一个线程阻塞全部线程都会阻塞。
- 一对一:单个用户级线程映射到单个内核级线程。
- 并发能力强,但创建线程开销大。
- 多对多:多个用户级线程映射到多个内核级线程。
- 既可以提高并发性,又适当降低了开销。
2.2、处理机调度
概念:对处理机进行分配,即从就绪队列中按一定算法选择一个进程并将处理机分配给他。
调度的层次:
- 作业调度(高级调度):从辅存中选择作业送入内存。
- 内存调度(中级调度):将暂时不能运行的进程调至外存,使其进入挂起态。(进程映像调至外存,PCB形成挂起队列)
- 进程调度(低级调度):从就绪队列中选取一个进程,将处理机分配给他。
作业调度次数最少,进程调度频率最高。
典型的调度算法:
- 先来先服务算法:
- 从就绪队列中选择最先进入该队列的进程将处理机分配给他
- 对长作业有利,不利于短作业。
- 短作业优先算法:
- 优先选择运行时间最短的进程
- 对短作业有利,但容易造成饥饿现象
- 优先级调度算法:
- 每次从就绪队列中选择优先级高的作业分配处理机。
- 可能会产生饥饿现象。
- 高响应比算法:
- 计算就绪队列中每个作业的响应比,选出响应比最高的。 (响应比 = (等待时间+要求服务时间)/ 要求服务时间 )
- 不会导致饥饿。
- 时间片轮转算法:
- 分时系统,进程按到达次序排队,依次在时间片内占用处理机,时间片到达就释放。
- 不会导致饥饿。
- 多级反馈队列调度算法:
- 实现思想:
- 设置多个就绪队列,为每个队列设置不同的优先级,优先级依次递减;
- 每个队列时间片各不相同,时间片依次递增
- 每个队列按照先来先服务算法排队,规定时间片内没有完成 则进程放入下一级队列。
- 高级队列为空,低级队列才开始调度。
- 实现思想:
2.3、进程同步
**同步:**直接制约关系,为了完成某任务而建立的多个进程,相互合作。
**互斥:**间接制约关系,当一个进程访问临界资源的时候,其他进程不能访问。
实现临界区互斥的方法
- 软件方法:
- 单标志法
- 双标志先检查法
- 双标志后检查法
- 皮特森算法
- 硬件方法:
- 中断屏蔽法
- 硬件指令法
—>均未满足“让权等待”
记录型信号量PV操作,满足让全等待。
利用信号量实现同步:
- 设置同步信号量,初始值设为0
- 前V后P
利用信号量实现互斥:
- 设置互斥信号量,初始值设为1
- 先P后V
管程:
- 信号量机制中,每个要访问临界资源的进程都要自备同步的PV操作,大量PV操作给系统管理带来麻烦,同时不当的PV操作会导致系统死锁。
- JAVA中类似管程的 操作,关键字 "Synchoronized"描述一个函数,则该函数同一时间段内只能被一个线程调用。
2.4、死锁
多个进程因为竞争同一种资源而全部无法向前继续推进。
产生原因:
- 系统资源的竞争
- 进程推进顺序非法
- 死锁产生的条件:互斥条件、不可剥夺条件、请求并保持条件、循环等待条件
死锁预防:
- 破环死锁产生的条件
死锁避免:
-
在资源动态分配中,用某种方法防止系统进入不安全状态
-
银行家算法
死锁的检测和解除:
- 死锁定理:
死锁、饥饿、死循环的区别?
- 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进。
- 饥饿:长期得不到想要的资源,进程无法向前推进
- 死循环:某进程执行过程中一直跳不出某个循环。
第三章:内存管理
3.1、内存管理的功能
1、内存空间的分配与回收
-
连续分配管理方式
-
单一连续分配:系统区和用户区,有内部碎片
-
固定分区分配:划分若干固定大小的区域,有内部碎片
-
动态分区分配:根据进程大小动态分配分区,有外部碎片(“紧凑”解决外部碎片 )
- 首次适应算法:空闲分区按地址递增分配
- 最佳适应算法:空闲分区按大小递增分配
- 最坏适应算法:空闲分区按大小递减分配
- 临近适应算法:分配内存时从上次查找结束的位置开始继续查找
-
-
非连续分配管理方式
- 基本分页存储管理
- 把主存空间划分为大小相等且固定的块,每个进程以块为单位申请空间
- 块的大小相对分区要小很多;进程只会在为最后一个不完整的块申请一个主存块空间时,才产很小的内部碎片
- 基本分段存储管理
- 按照用户进程的自然段划分逻辑空间,段内要求连续,段间不要求连续。
- 段页式管理
- 地址空间首先被分为若干逻辑段,每个段非为若干大小固定的页。
- 基本分页存储管理
单级页表 ----》两级页表 --------》 虚拟存储技术
-
单级页表的问题:
**1、**页表必须连续存放,因此页表很大时需要占用多个连续的页框。
-
====》两级页表
- 在原有页表结构上再加一层存储页表的页表
**2、**没有必要让整个页表常驻内存,因为进程一段时间内只需要访问某几个特定页面。
-
====》 虚拟存储技术: 需要访问时才把页表调入内存。
分页和分段?
- 分页是从计算机角度考虑设计的,对用户不可见;为了提高内存的利用率。
- 分段是从用户和程序员的角度,对用户可见;为了方便编程,信息保护和共享。
2、地址转换
编译:将高级语言变为机器语言,将用户源码编译成若干模块
**链接:**将编译后的模块连接在一起,形成完整的装入模块,(在这一步,形成完整的逻辑地址)
- 静态链接:程序运行前
- 装入时动态链接:装入内存时
- 运行时动态链接:程序执行中
**装入:**将装入模块放入内存运行,完成地址转换
- 绝对装入:装入时按实际内存地址
- 可重定位装入:地址变换在装入时完成
- 动态运行时装入:程序运行时才转换
3、内存空间的扩充
1、覆盖:
- 程序运行时一段时间内只需要访问若干页面,不需要访问全部数据。
- 将用户空间分为一个固定区和若干覆盖区,活跃的部分放在固定区,其余部分需要时调入覆盖区。
- 按照自身逻辑结构,让那些不可能同时被访问的程序段共享一个覆盖区。
2、交换:
- 对换区和文件区,对换区追求换入换出的速度,文件区追求存储空间的利用率。
- 内存空间紧张时,系统将某些进程调出内存 ,把外存中谋刺蛾已经具备运行条件的进程换入内存。
3、虚拟存储:
- 传统存储方式的特征
- 一次性:作业一次性装入内存
- 驻留性:作业装入内存后,一直驻留在内存
=====》虚拟内存管理
-
基于局部性原理,程序的一部分装入内存,一部分驻留在外存,需要的时候将外存内容调入内存。
-
调入内存:请求调页
- 请求分页
- 请求分段
- 请求段页
-
换到外村:页面置换
- 最佳置换算法:最长时间内部再访问的页面进行淘汰
- 先进先出页面置换算法:淘汰最早进入内存的页面,Belady异常:增大分配的块数,却页数不减反增。
- 最近最久未使用置换算法:淘汰最长时间内没有被访问的页面。
- CLOCK置换算法:访问位
- 改进型CLOCK置换算法:访问位、修改位
-
4、存储保护
**上下限寄存器:**存放用户作业在主存的上限和下限地址,每当访问一个地址时,分别和两个寄存器的数据比较,判断是否越界。
**基址寄存器和限长寄存器:**基址寄存器是最小物理地址值,限长寄存器是逻辑地址最大值。将逻辑地址与限长寄存器比较。
第四章:文件管理
4.1、基础
文件的逻辑结构:
-
无结构文件:
- 将数据按照顺序记录并保存,以字节为单位;比如:”记事本“
-
有结构文件:
- 顺序文件
- 索引文件:
- 定长记录文件:A = i * L
- 变长记录文件:建立索引表
- 顺序索引文件
- 将顺序记录文件分为若干组;建立索引表啊,为每组的第一个记录建立一个索引项
- 直接文件或散列文件
- 给定记录的键值 或 通过散列函数转换的键值直接决定记录的物理地址。
文件的物理结构:
-
对非空闲块的管理
- 连续分配:每个文件在磁盘上占有一组连续的块。 文件名 | 起始块号 | 长度
- 随机存取,但文件长度不宜动态增加,会产生外部碎片
- 链接分配:
- 隐式链接:磁盘块分散,除最后一个盘块,每个盘块都有一个指针指向下一个盘块
- 不支持直接访问 ========》显式链接、、索引分配
- 显式链接:把用于指向盘块的指针提取出来,显示的存放在内存中的一张文件分配表FAT
- 隐式链接:磁盘块分散,除最后一个盘块,每个盘块都有一个指针指向下一个盘块
- 索引分配:把每个文件所有盘块集中在一起,形成索引块(表)。每个文件都有一个索引块,索引块第i项指向文件第i个块
- 多层索引
- 混合索引
- 连续分配:每个文件在磁盘上占有一组连续的块。 文件名 | 起始块号 | 长度
-
对空闲块的管理
- 空闲表法:为空闲区建立一张空闲盘块表。 序号 | 第一个空闲盘块号 | 空闲盘块数
- 空闲链表法:
- 空闲盘块链:将所有空闲空间以盘块为单位拉成一条链
- 空闲盘区链:将所有空闲盘区拉成一条链,空闲盘区第一个盘块记录盘区长度、下一个盘区指针
- 位示图法:磁盘上所有盘块都有一个二进制位表示该盘块的使用情况
- 成组链接法:UNIX系统
- 结合了空闲表和空闲链表的特点
- 目录区中用一个盘块作为超级块,第一个表项存储下一组的空闲盘块数,后面表项是空闲盘块号。
目录结构
文件控制块(FCB):
- 一个FCB就是一个文件目录项
- 文件名 | 文件物理位置 | …
索引节点:
- 文件名 | 索引节点指针
- 索引节点指针指向索引节点,除了文件名之外的所有信息都存放在索引结点。
目录结构分类:
- 单级目录结构:一张目录表,每个文件占一个目录项
- 两级目录结构:主目录和用户目录,主目录记录用户名,用户目录项记录文件
- 多级目录结构:树形目录结构,不利于实现文件共享
- 无环图目录结构:在树形目录结构的基础上增加指向同一节点的有向边,成为一个有向无环图,利于文件共享
文件共享
硬链接
- 多个指针指向同一个索引结点,同时索引节点中设置链接计数count
- 只要还有一个指针指向索引节点,索引节点就不能删除
- 查找速度快
软链接(类似快捷方式)
- 共享的是文件的路径
- 因为是按照文件路径名查找文件,因此会增加时间开销及启动磁盘的频率
文件保护
**口令保护:**口令存储在系统内部(不安全),用户请求访问时要提供相应的口令。
**加密保护:**用户对文件进行加密,访问时需要密钥进行解密
**访问控制:**根据用户身份,进行控制,为每个文件增加一个访问控制列表,规定每个用户允许访问的类型。
类似:RBAC基于角色的访问控制。
文件系统层次结构
- 用户调用接口
- 文件目录系统 ======》查找目录找到文件的索引信息
- 存取控制验证 ======》通过查看FCB上的信息查看用户是否有对应权限
- 逻辑文件系统与文件信息缓冲区 ======》开始寻址,首先找到逻辑地址
- 物理文件系统 ======》逻辑地址转换为物理地址
- 辅助分配模块 ======》寻址完成后,管理空间
- 设置管理程序模块
4.2、磁盘组织与管理
磁盘结构:
- 磁道
- 盘块
- 扇面号–柱面号–盘区号
磁盘调度算法:
- 读写时间:寻道时间、延迟时间、传输时间
- 算法:
- 先来先服务算法:按照进程请求访问磁盘的先后顺序调度
- 最短寻道时间优先算法:选择距当前刺到最近的请求调度
- SCAN算法:磁头移动到一侧,才能向另一侧移动 ====》LOOK
- C-SCAN算法:磁头单向移动,回返时直接回到起始端 ======》C-LOOK
磁盘管理:
磁盘初始化
- 低级格式化:物理分区
- 逻辑格式化:创建文件系统
引导块:
存放自举程序,计算机启动时运行自举程序,启动操作系统
第五章:I/O管理
5.1、I/O控制方式
程序直接控制方式:
- 从外部设备读取数据到存储器,每读一个字,对于读入的每一个字,CPU都要对外设状态进行循环检查,直到确定改字已经在I/O设备控制器的数据存储器中。
- 优点:容易实现,操作简单
- 缺点:降低了CPU利用率
中断驱动方式:
- 允许I/O设备注主动打断CPU的运行并请求服务,进而解放CPU,使其向IO控制器发送读命令后可以继续做其他有用的工作
- 读写单位:一个字
- 缺点:数据传输仍要经过CPU,消耗CPU时间
DMA方式:
- CPU收到DMA请求时,发送命令给IO控制器,启动DMA控制器,由DMA控制器与存储器进行数据传输,传输完成,给处理器发送中断信号。
- 读写单位:数据块
- 提高了CPU利用率
通道控制方式:
- 通道就是一个专门负责输入输出的处理机,数据块的读写由通道控制。
- 读写单位:数据块
- 提高了资源利用率,但实现较为复杂
DMA与通道方式的区别?
- DMA只负责传输数据块,而数据块大小、传输位置等信息由CPU控制;在通道方式中,这些信息由通道控制
- DMA控制器对应一台设备与内存传递数据;通道可以控制多台设备与内存的数据交换。
5.2、IO子系统层次结构
用户层IO软件 库函数接口
设备独立性软件 实现用户程序与设备驱动器的接口
设备驱动程序 实现系统对设备发出命令
中断处理程序 处理中断
硬件设备 包括一个机械部件和一个设备控制器(CPU和IO设备机械部件之间的中介)
SPOOLING技术:
- 为了缓解CPU与IO设备的速度差异矛盾,,利用专门的外围控制机,将低速IO设备上的数据传送到高速磁盘上,或者相反
- 将独占设备改造成虚拟上的共享设备,供多个进程同时使用,提高了独占设备的利用率。
高速缓存与缓冲区的区别:
相同:
- 都介于高速设备和低速设备之间
不同:
- 存放的数据:高速缓存存放的是低速设备上的复制数据,缓冲区存放的是低速设备传递给高速设备的数据.
- 目的:高速缓存是为了提高磁盘的IO速度;缓冲区是为了缓解高速设备和低速设备之间的速度差异矛盾。