(自我回顾用,若有错误,欢迎大家指正以及补充说明~
ps: 目录并不是全部内容的缩写,只是老师标的考点hhh)
操作系统--精髓与设计原理
第一章 计算机系统概述
操作系统定义:一组程序合集(有效、合理、方便)
处理器:执行单元(运算器)控制单元(控制器)
- 寄存器:存储数据,容量小,速度快
用户可见寄存器
对所有程序是可见的,可通过由处理器执行的机器语言来访问(DR\AR)
控制和状态寄存器
存储器地址寄存器MAR:指定下一次要读写的存储器地址
存储器缓冲寄存器MBR:包含要写入存储器的数据或者从存储器读取的数据
程序计数器(PC):包含将取指令的地址
指令寄存器(IR):包含最近取的指令内容
程序状态字(PSW)- 条件码( Condition codes ) :处理器硬件为操作结果设置的位,如算术运算的溢出等
- 中断允许禁止位( Interrupt enable/disable bit )
- 管理程序/用户模式位( Supervisor/user mode bit)
指令的执行
- 取指周期
1.(PC)->MAR, Read
2.(M)->MBR(MDR)->IR
3.PC+1 ->PC - 执行周期:处理器对所取指令进行解析,并执行相应操作
程序执行例子:
中断
中断是==提高处理器效率==的一种技术:
允许处理器与I/O操作并发执行,以提高处理器使用率
中断是指CPU对系统中发生的异步事件的响应,发生中断时正在执行的程序的暂停点叫做中断断点,处理器暂停当前程序转而处理中断的过程称为中断响应,中断处理结束之后恢复原来程序的执行被称为中断返回。
一个计算机系统提供的中断源的有序集合一般被称为中断字,这是一个逻辑结构,在不同的处理器有着很不相同的实现方式。
中断分类:
程序中断:因指令的执行结果而产生,如算术溢出、被零除等。
时钟中断:由处理器内部的计时器而产生。通常在分时系统中每个进程分配了一个时间片,当进程用完时间片后就会发生一个时钟中断,系统将处理器分配给另一个进程使用。
I/O中断:由I/O控制器产生,通常在I/O操作正常完成或错误时发出信号提示处理器响应中断,是最常见的中断类型。
硬件失效中断:因硬件故障而产生。
中断系统:硬件和软件结合
- 硬件中断装置
- 软件中断处理程序
多个中断:
- 顺序中断:中断允许/禁止位置位=1表示禁止中断,=0表示允许中断,
-缺点:没有考虑中断的相对优先级T和时间限制要求 - 嵌套中断:定义中断优先级,允许高优先级的中断打断低优先级的中断处理器的运行
存储器的层次结构
三个特性:价格、容量、访问速度
- 每bit价格递减
- 容量递增
- 存取时间递增
- 处理器访问存储器的频率递减
- 局部性原理: 处理器“成簇”地访问指令和数据
高速缓冲存储器Cache
提高处理器的执行效率:利用局部性原理,在处理器和主存储器之间提供一个容量小而速度快的存储器: cache
单个高速缓存:
高速缓存的读操作:处理器访问数据时,先检查是否在cache中,否则将包含所需数据(字节)的一个数据块读入Cache,再传递给处理器。
Cache 设计:
cache越小冲突频率越高、反之则读取速度减慢
块block:cache和主存进行数据交换的单元
因局部性原理,块越小命中率越高(读进无用的数据大于局部性原理的影响,命中率反而降低)
映射函数(Mapping function )
- 确定新读进的数据块将占据哪个cache单元
替换算法(Replacement algorithm )
- 最近最少使用算法(Least-Recently-Used algorithm,LRU )
写策略( Write policy)
- 当块的内容被修改时,确定何时写回主存储器
- 直写:每次块内容被修改时都写回主存
- 回写:只有当块被替换时才写回主存
-减少了存储器写操作的次数
-导致数据不一致性
I/O 通信技术
- Programmed I/O——程序控制I/O
- Interrupt-driven I/O——中断驱动I/O
- Direct memory access(DMA) ——直接存储器存取
前两者缺陷:
- I/O传送速度受限于处理器测试设备和提供服务的速度
- 处理器需要承担与I/O设备进行数据传送的工作
DMA模块解决上述问题
- DMA模块完成I/O与主存之间的数据交换
- DMA模块占用总线以完成数据交换(“总线窃取”)
第二章 操作系统概述
操作系统定义:
是控制应用程序执行的程序,在应用程序和计算机硬件之间提供接口
目标
方便(Convenience):使计算机易于使用
有效 (Efficiency):资源最大化利用
扩展的能力 (Ability to evolve):开发、测试和引进新系统功能
功能
从计算机系统组成观点――操作系统是系统软件
从资源管理程序观点――操作系统是系统资源管理者:实际上,操作系统就是一组程序,在处理器上同样以指令的方式执行
从软件分层、扩充机器的观点――操作系统是扩充裸机的第一层系统软件
从服务用户的观点――操作系统是用户与裸机之间接口
操作系统的发展过程
-
串行处理:人工输入
-
简单批处理:脱机输入输出技术(磁带、作业自动转换)、监控程序、用户程序、处理器控制权在两程序间切换(处理器取指和执行指令都在同一程序内)
-依赖于处理器可以从内存不同地方取指令的能力 -
多道程序设计:同时容纳两个或多个用户程序,宏观上并行执行,而在微观上多道程序在某个部件上(如CPU、I/O)是串行的,即多道程序轮流地使用部件,交替执行。监督程序(操作系统)是控制中心
-
分时系统:(单主机多终端)把计算机的系统资源(尤其是CPU时间)进行时间上分割,即将整个工作时间分成一个个的时间片,每个时间片分给一个用户使用,这样将CPU工作时间分别提供给多个用户使用,每个用户依次地轮流使用一个时间片
- 采用调进/调出的单道分时系统:单个程序的从外存调入内存中及内存中调出至外存
- 基于多道程序设计的多道分时系统:具有较好的系统性能,因为切换作业就在内存,不要花费大量时间用于调进调出
通用系统概念:系统本身没有要完成的作业,只是起着管理调度系统资源,向用户提供服务的作用(批处理、分时都是)
响应时间是重要指标:用户发出终端命令到系统开始作出响应的时间间隔。1T = n × q q = S + W
-
实时系统
特征:快速响应时间、有限的交互能力(专用系统)、高可靠性 -
微机操作系统:
- 单用户单任务操作系统MS-DOS
-
多任务操作系统MS Windows
-
多用户多任务操作系统SCO UNIX
-
Linux
-
网络操作系统(Network Operating System, NOS)
-
分布式操作系统( Distributed Operating Systems )
-
嵌入式操作系统 ( Embedded OS )
现代操作系统的特征
多道程序设计的问题:
- 不正确的同步(Improper synchronization )
信号机制设计出错会导致两个进程之间没法保证同步性
- 失败的互斥(Failed mutual exclusion )
- 不确定的程序操作(Nondeterminate program operation )
程序的结果可能取决于多个程序的执行先后顺序
- 死锁(Deadlocks )
进程
由三部分组成:
- 一段可执行的程序
- 程序所需的相关数据(变量、工作空间、缓冲区等)
- 程序执行的上下文环境(根本)
(执行上下文|进程状态)是操作系统用于管理和控制进程所需的内部数据
内存管理的五个职责:进程隔离、自动分配和管理、支持模块化程序设计、保护和访问控制、长期存储
虚拟内存
使用虚地址访问内存,通过地址映射机制(通常由硬件实现)将虚地址动态映射为主存中的实地址。进程执行时,只需要一部分块在内存中即可。当访问的块不在内存中时,产生缺页中断,将所要访问的块从磁盘调入内存
虚存寻址:
信息保护和安全
- 可用性 (Availability)
- 机密性 (Confidentiality)
- 数据完整性 (Data integrity)
- 认证 (Authenticity)
调度
- 公平性(Fairness )
平等、公平地访问资源 - 有差别的响应性(Differential responsiveness )
根据进程的不同优先级差别对待 - 有效性(Efficiency )
最大化吞吐量
最小化响应时间
尽可能容纳更多的用户
现代操作系统的特征
- 微内核结构(Microkernel architecture )
- 多线程(Multithreading )
将进程划分成可以同时运行的多个线程- 可分派的工作单元
- 顺序执行,可以被中断
- 对称多处理(Symmetric multiprocessing,SMP)
- 多个处理器,共享相同的主存和I/O设备
- 所有处理器执行相同的功能
第三章 进程
进程(Process)定义:“可并发执行的程序在一个数据集合上的运行过程”。
进程特征:动态性(基本特征)、独立性、并行性、异步性
结构特征:从结构上,进程实体由**程序段、数据段和进程控制块(PCB)**三部分组成。
进程状态
五状态模型
运行(Running):占有CPU
就绪(Ready ):除了CPU,其它所需资源都已占有,一旦得到处理机即可运行,则称此进程处于就绪状态
阻塞(Blocked ):等待某些事件
新建(New ): 已经创建了PCB并保存在主存中,但程序代码和相关数据还没有读入主存
退出(Exit )
就绪态――>运行态:当处理机空闲时,进程调度程序必将处理机分配给一个处于就绪态的进程 ,该进程便由就绪态转换为运行态。
运行态――>阻塞态:处于运行态的进程在运行过程中需要等待某一事件发生后,才能继续运行,则该进程放弃处理机,从运行态转换为阻塞态。
阻塞态――>就绪态:若其等待的事件已经发生,进程由阻塞态转换为就绪态。
运行态――>就绪态:分给它的处理器时间片用完,被抢占而让出处理机。
阻塞态――>运行态和就绪态――>阻塞态这二种状态转换不可能发生
挂起进程原因:处理器运行的速度远远地快于I/O设备,运行一段时间后会出现所有进程都处于阻塞态,就绪态进程数为0,处理器等待的情况。
挂起(Suspended):
- 阻塞/挂起(Blocked/Suspend )
- 就绪/挂起(Ready/Suspend )
- 该进程不在主存中(外存磁盘)
- 进程挂起与否与进程阻塞与否没有必然的联系
堵塞/挂起态――>就绪/挂起态在进程等待的事件出现后
进程的描述
操作系统维护的四种表
存储表、I/O设备表、文件表和进程表 (控制记录进程和资源的当前状态信息)
PCB的作用
进程存在的唯一实体
PCB中所包含信息
- 进程标识信息
唯一的标识进程,有外部(字母)/内部(整数)标识符二种 - 处理器状态信息
由处理器各种寄存器的内容组成,使得中断后能恢复现场继续运行 - 进程控制信息
进程状态(running、ready、blocked)、队列(就绪、阻塞队列)、队列指针,调度参数:进程优先级、进程已执行时间和已等待时间、进程间通信的信号系统、进程所分配的内存空间指针等
进程控制
执行模式:
4. 用户模式(目态)
5. 系统模式、控制模式或内核模式(管态)
模式切换
三个问题:
6. 为什么需要两种执行模式?
保护操作系统和重要数据不受用户干扰。
-
处理器如何知道当前系统处于哪个执行模式下?
程序状态字(PSW)中管理程序/用户模式位记录了当前系统所处的模式信息 -
模式如何切换?
用户调用操作系统服务(系统调用)或发生中断时,执行模式从用户模式切换到内核模式
当系统服务返回或中断返回到用户进程时,执行模式从内核模式切换到用户模式
进程切换
何时发生切换?
在操作系统从当前正在运行的进程中获得控制权的任何时刻发生:中断、陷阱、系统调用
发生进程切换,操作系统需要做什么?
- 保存处理器上下文环境
- 更新当前运行态的进程的PCB
- 上述进程PCB移到相应队列
- 就绪队列选择另一进程(进程调度)
- 更新所选的进程的PCB
- 更新内存管理的数据结构
- 恢复处理器的上下文:
载入PC和其它寄存器最后一次保存的值
进程切换和模式切换的区别?
- 进程切换时,操作系统必须使其运行环境发生改变
- 进程切换必然会存在模式切换(只有在内核模式下才能实现进程调度),但模式切换不一定会发生进程切换
- 进程切换比模式切换更复杂
(考试范围外)OS是无进程的内核,运行发生中断或系统调用则控制权交给内核,在用户进程的上下文中执行所有操作系统程序。
第四章 线程
线程的基本概念
资源拥有单元称为进程(或任务)
调度的单位称为线程、又称轻便进程
线程只拥有一点在运行中必不可省的资源(程序计数器、一组寄存器和栈),但它可与同属一个进程的其它线程共享进程拥有的全部资源
1.每个线程有独立的栈和控制信息
2.所有线程共享进程的状态和资源
(题外:引入线程的好处)创建、终止、切换时间比进程更短;因为同一进程内所有线程共享资源则修改资源后大家都能访问,因此线程通信无需内核。
线程和进程的关系
线程定义为进程内一个执行单元或一个可调度实体,是进程的组成部分
线程的状态
主要状态有:运行Running, 就绪Ready 和阻塞Blocked
(挂起一个进程则该进程内的所有线程都将挂起)
多线程系统的特性
一个线程的阻塞不会引进整个进程的阻塞
线程的两种实现方式
用户级线程 (User-level threads, ULTs)
应用程序管理线程
- 内核并不知道线程的存在
- 使用线程库来实现多线程
当一个线程因系统调用而被阻塞时,该进程内的所有线程都被阻塞(为什么?)
系统调用使得模式从用户模式切换到内核模式,操作系统只知道进程,故操作系统将进程置为阻塞状态,从而使得该进程内的所有线程都被阻塞
一次进程中只有一个线程可以执行,使多线程技术不能得到应用
内核级线程 (Kernel-level threads, KLTs)
- 管理的所有工作都由内核来完成
- 程序只调用内核级线程的API
- 操作系统基于线程进行调度
多个线程调度到多个处理器中,从而更好地利用多道程序设计技术
如果一个进程内的线程阻塞,内核可以调度同一进程内的其他线程运行,不会导致整个进程被阻塞
内核例程自身也可以使用多线程
同一进程两线程的切换需要内核模式的切换
第五章 并发:互斥和同步
并发基本概念
临界区(critical sections)
多个进程共享临界资源(一次只允许一个进程使用)时必须互斥使用,将程序中使用临界资源的那一段代码称为临界区
死锁( deadlock )
指多个进程互不相让,都得不到足够的资源
互斥( mutual exclusion )
指多个进程不能同时使用同一个资源
饥饿( starvation )
指一个进程一直得不到资源(其他进程可能轮流占用资源)
* 竞争条件
多个进程或线程在读写一个共享数据时,结果依赖于它们执行的相对时间,这种情形叫竞争
* 进程同步
多个相关进程在执行次序上的协调称为进程同步。用于保证多个进程在执行次序上的协调关系的相应机制称为进程同步机制,遵循下述四条准则:
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
互斥:软件和硬件的方法
软件尝试
单标志法(Dekker’s 算法):可实现互斥,但仅可顺序执行,只有当前允许进入临界区的进程在访问了临界区之后,才会修改turn的值,违背了“空闲让进”原则
双标志先检查法:都可进入临界区,违背了“忙则等待”原则
双标志后检查法:都不能可进入临界区,可能会死锁,违背了“空闲让进、有限等待”原则
Peterson算法:“让梨”思想,turn变量表示让谁先进入临界区,违背“让权等待”原则
硬件支持
中断禁用 (Interrupt Disabling)
- 对于多处理器环境下,无法保证互斥
特殊的机器指令
- Testset指令
- Exchange指令
信号量机制解决互斥和同步问题
信号量(Semaphores)的含义
- 同步信号量(专用)
只有C进程完成某操作后 V,B进程才可通过 P执行操作。
先做动作的进程C在动作完成后对同步信号量施加signal操作,代表发送消息;后做动作的进程B在动作前对同步信号量施加wait操作,代表测试消息是否到达。
;- 互斥信号量(公用)
每个进程都可对其进行PV操作(初始值为1)
信号量的操作
信号量初始值n含义:表示一次允许最多有n个进程进入临界区
- S.count≥0:s的值表示可供使用的资源数
- S.count <0:表示资源已被占用,s的绝对值表示有n个进程因等待资源而阻塞
semSignal(s)/V(s) 发送信号 S+1
semWait(s) /P(s) 接收信号 S-1 (若值为负数则阻塞执行P操作的进程)
经典进程同步问题
生产者/消费者
读者/写者
哲学家就餐问题(包含死锁和饥饿)
总结
wait( P ) / signal(V)操作必须成对出现,有一个wait( P )操作就一定有一个signal(V)操作
当为互斥操作时,它们同处于同一进程
当为同步操作时,则不在同一进程中出现
如果wait(S1)和wait(S2)两个操作在一起,那么wait操作的顺序至关重要,一个同步wait操作与一个互斥wait操作在一起时,同步wait操作在互斥wait操作前;而两个signal操作无关紧要
第6章 并发性:死锁和饥饿
(前面也有提到)所谓死锁是指计算机系统和进程所处的一种状态。在系统中,两个或多个进程无限期地等待永远不会发生的条件,此时称系统处于死锁状态。
造成死锁的原因和四个条件
原因:
- 竞争资源引起死锁
- 进程推进顺序不当引起死锁
条件:
- 互斥 (Mutual exclusion)
一次只有一个进程可以使用一个资源 - 占有且等待 (Hold-and-wait)
当一个进程在等待分配得到其他资源时,将继续占有已分配到的资源 - 非剥夺 (No preemption )
不能强行抢占进程已占有的资源 - 循环等待 (Circular wait)
存在一个封闭的进程-资源链,每个进程至少占有一个该链中下一个进程所需要的资源
(前三个条件是死锁存在的必要条件而非充分条件,要产生死锁需要第四个条件)
三种死锁处理机制
死锁预防(Prevention)
方法:破坏四个产生死锁的必要条件之一
- 破坏互斥条件
互斥使用是资源本身特征所决定的。使用硬软件结合可改变资源本身特性 - 破坏不可抢占条件
可采用抢占式调度,但抢占式调度法主要用于处理机和存储器资源调度,它们的状态容易保存和恢复。此法对外部设备和私有数据不宜使用 - 破坏请求和保持条件
系统可采用资源静态预先全分配方式来破坏请求保持条件。 - 破坏循环等待条件
有序资源使用法:所有进程对资源的请求必须严格按资源序号递增的次序提出
死锁避免(Avoidance):银行家算法
定义:允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。进程的请求被拒后由运行态变为阻塞态。
算法结构:
前提:一个具有n个进程和 m 种不同类型资源系统
每个资源的总量:Resource=R=(R1,R2,…,Rm)
可用的资源数:Available=V=(V1,V2,…,Vm)
需求矩阵:Claim=C:矩阵,Cij表示进程i对资源 j的最大需求
已分配到的资源数:Allocation=A:矩阵,Aij表示当前进程i已分配到的资源j的数量
当前需求资源数:Need=N:矩阵,表示每个进程尚需的各类资源数, Need[i,j]=k 表示进程i还需要j类资源k个。Need[i,j]=Claim[i,j]-Allocation[i,j]
限制
- 必须事先声明每个进程请求的最大资源数
- 考虑的进程必须是无关的,即进程之间不存在同步关系
- 分配的资源数目必须是固定的
- 在占有资源时,进程不能退出
死锁检测(Detection):死锁检测算法
定义:不限制资源访问或约束进程的行为,只要系统资源能满足进程的请求就立即满足,定期用算法检测,若发生死锁则进行恢复
算法主要思想:标记没有发生死锁的进程(包括未占用任何资源的进程)
算法步骤如下:
- 标记在Allocation矩阵中全为0的进程。因为这些进程没有占用任何的资源,肯定不会造成死锁。
- 初始化一个临时向量W,W= Available。
- 查找下标 i,使得Qik≤Wk。如果找不到,终止算法。
- 如果找到,则标记进程 i,并设置Wk= Wk+Aik. 返回步骤3。
(题外)恢复策略:
- 终止所有的死锁进程
- 回到之前某个备份点,重启所有的进程
- 依次终止死锁进程,直到不再发生死锁
- 依次抢占死锁进程所占有的资源,直到不再发生死锁
第 7 章 内存管理
基本概念
存储管理的主要对象是内存,核心是进一步细分用户可访问的内存部分,以满足多个进程的要求。
重定位机制
进程对内存访问的逻辑地址在运行时动态地被转换为物理地址,从而保证进程可以占据内存的不同区域
关键词:名字空间、地址空间(相对/逻辑地址)和存储空间(绝对地址)、逻辑地址、相对地址(逻辑地址的特例)、物理地址
分类:
静态重定位:装配模块装入内存前修改有关修改地址的指令
动态重定位:依靠硬件——重定位寄存器(基址寄存器)
内存的保护和共享
保护:确保每道程序都在自己的内存空间运行,互不干扰
共享:提高主存储器的利用率,减少不可用的存储空间(称为“碎片”、“零头”),允许多道程序动态共享主存
逻辑地址
程序员访问的地址,与当前数据在内存中的实际位置无关,在进行内存访问时,必须将其转换成物理地址
物理地址
也称为绝对地址,是数据在主存中的实际位置
内存管理技术(表7.1)
固定分区 (Fixed Partitioning)
事先进行内存划分,分区的个数不可变,分区的大小不可变(大小相等或不等)
分区说明表:每个表目说明一个分区的大小、起始地址和是否已分配
两个问题:1、程序过大只能放一部分进主存2、主存利用率不高,易产生内部碎片( fragmentation):进程被分配到的分区中多余的部分
不足:1、分区的数目事先生成,因此限制了系统中活动进程的数目2、小作业不能有效地利用分区空间3、存在内部碎片问题
动态分区(Dynamic Partitioning)
内存被划分成两块,一块用于常驻的操作系统,另一块则是完整的空闲区(用户区)
空闲分区表/链记录空闲分区:包括分区的序号、大小、始址和状态
动态分区分配算法
最佳适应算法BF(Best Fit)、首次适应算法FF(First Fit)、循环首次适应算法/邻近算法NF(Next Fit)、最坏适应法
可变分区回收算法 :回收分区时合并相邻空闲区
分区的存储保护:
用户程序只能访问自己的用户分区,不能访问系统分区和其它程序的分区。分区存储保护常用方法是界地址法或界限寄存器(不在界限范围内产生中断)
伙伴系统:如果请求分配的空间大小s满足2U-1 < s <= 2U, 则分配整个空间块(2U);否则,将2U 一分为二,分为两个大小相等的伙伴,大小均为2U-1 。(可用二叉树表示)
简单分页(Simple Paging)
将一个进程的地址空间划分成若干个大小相等的片,称为页面或页,相应地,将内存空间划分成与页相同大小的若干个块,称为(物理)帧(块)或页帧。在为进程分配内存时,将进程中的若干页离散地装入不相邻接的物理帧中,解决了“碎片”问题,提高了存储器的利用率。
操作系统如何知道进程中的某一页具体被分配到哪个物理帧中?
答:在内存为每个进程建立了一张页表(page table)(有多少个进程就有多少个页表)
即,页表作用:实现从页号到物理块号的地址映射。
分页系统的地址结构有两部分:页号P与页内位移量W(即页内地址)
地址变换计算:
1、虚地址分成页号P+页内地址d
页号P=(逻辑地址/页大小)取整
页内地址d=逻辑地址 mod 页大小
2、根据页号查页表,由页表项读出块号(页号默认从0开始)
3、块号和页内地址构成物理地址:
物理地址=块号×页大小+页内地址
简单分段(Simple Segmentation)
作业的地址空间按逻辑信息完整性被划分为若干个段,每个段都有自己的名字,编译后都是从零开始编址的一段连续的地址空间,段的长度由相应逻辑信息组的长度决定,因而各段长度是不等的
段表:类似页表
逻辑地址中的段号和段内地址位数如何确定?
A:取最大段的长度为段内地址位数
第八章 虚拟内存
一个进程在执行的过程中,不需要所有的块都在内存中,当处理器需要访问一个不在主存中的块时,系统将产生一个内存访问故障中断(缺页中断)。
虚拟内存的特性
优点:
内存中可以容纳更多的进程
- 并发性提高
- 处理器利用率提高
进程可以比主存的全部空间还大
- 实存 (Real memory):内存
- 虚存 (Virtual memory):磁盘的存储空间
局部性原理
即在一段时间内,程序的执行仅局限于某个部分;相应地,它所访问的存储空间也局限于某个区域内。(时间、空间)
局部性原理确保了虚拟存储机制的可行性。但利用局部性原理的同时,要避免系统出现抖动现象(thrashing),即处理器大部分时间都用于交换块,而不是执行指令。
虚拟内存的实现:软件和硬件结合
硬件上:请求分页、请求分段、段页式
请求分页:页式虚拟存储系统
虚地址求物理地址:
- 虚页号=虚地址/页大小(取整)
- 页内地址(块内地址)=虚地址-页号p×每页大小
- 查页表得物理页号(也可能页失效,产生缺页中断调入内存)
- 物理地址=物理页号×页大小+页内地址
快表(Translation Lookaside Buffer,TLB):提高了地址变换的速度
处理器先查询TLB,若命中则直接访问内存变换得到物理地址,否则查找页表看是否在页表内:或发生缺页中断访问外存。
请求分段:段式虚拟存储
内含段表机制、缺段中断机构以及地址变换机构(置换时对内存的管理采用动态分区管理)
段表项如下:
段页式
将内存空间划分成大小相同的若干个块,将用户程序先按逻辑完整性分为若干个段,再把每个段划分成若干个与块大小相同的页,将这些页离散装入不相邻接的块中。
以分页的方式管理内存,具有分页系统能有效地提高内存利用率的优点;又以分段的方式管理用户的逻辑地址空间,具有分段系统能很好地满足用户需要的长处.
系统中必需同时配置段表和页表。由于将段中的页进行离散地分配,段表中的内容不再是段的内存始址和段长,而是页表始址和页表长度。
地址结构:
地址变换过程(需访问三次内存)
- 逻辑地址截成段号S、段内页号P与页内地址W
- 段号S与段长TL(段表寄存器中)比较(S≥TL,表示段号太大访问越界,产生越界中断信号;)
- 利用段表始址(存在段表寄存器中)和段号查段表得到该段的页表始址
- 利用段内页号P查页表得对应物理块号b(状态位为零产生缺页中断)
- 用块号b和页内地址W拼成物理地址
软件上:操作系统的各种策略(表8.3)
缺页率( page fault rate )=“缺页次数 / 内存访问次数” (比率)
常用的替换策略 (OPT\LRU\FIFO\CLOCK)
最佳(OPT)置换算法
选择那些永不使用的,或者是在最长时间内不再被访问的页面置换出去
最近最久未使用置换算法(Least Recently Used,LRU)
选择最近最久未使用的页面予以淘汰
先进先出(FIFO)置换算法
选择在内存中驻留时间最久的页面予以淘汰
Clock置换算法/最近未用算法NRU(Not Recently Used)
当页第一次读入内存时,其访问位为1;当某页被访问时,其访问位置1。在选择一页淘汰时,沿循环替换指针检查页面,如其访问位是“0”,就选择该页换出;若为“1”,则重新置为“0”,暂不换出该页,在循环队列中检查下一个页面,直到访问位为“0”的页面为止。置换时是将未使用过的页面换出去
第九章 调度
暂略…(上次写完没保存)
第十一章 I/O管理和磁盘调度
设备管理(I/O管理)的目的和功能
设备管理的目标
提高设备的利用率。为此,应尽量提高CPU与I/O设备之间的并行操作程度,主要利用的技术有:中断技术、DMA技术、通道技术、缓冲技术、磁盘cache。
为用户提供方便、统一的界面。所谓方便,是指用户能独立于具体设备的复杂物理特性之外而方便地使用设备。所谓统一,是指对不同的设备尽量使用统一的操作方式,例如各种字符设备用一种I/O操作方式。这就要求用户操作的是简便的逻辑设备,而具体的I/O物理设备由操作系统去实现,这种性能常常被称为设备的独立性。
设备管理功能
设备分配。指设备管理程序按照一定的算法把某一个I/O设备、及其相应的设备控制器和通道分配给某一用户(进程),对于未分配到的进程,则插入等待队列中。
缓冲区管理。为了解决CPU与I/O之间速度不匹配的矛盾,在它们之间配置了缓冲区。这样设备管理程序又要负责管理缓冲区的建立、分配和释放。
实现物理I/O设备的操作。对于具有通道的系统,设备管理程序根据用户提出的I/O请求,生成相应的通道程序并提交给通道,然后用专门的通道指令启动通道,对指定的设备进行I/O操作,并能响应通道的中断请求。对于未设置通道的系统,设备管理程序直接驱动设备进行I/O操作。
设备独立性和I/O功能的逻辑结构
用户程序的设备独立性是:用户程序不直接使用物理设备名(或设备的物理地址),而只使用逻辑设备名;而系统在实际执行时,将逻辑设备名转换为某个具体的物理设备名,实施I/O操作。
I/O软件的设备独立性是:除了直接与设备打交道的低层软件之外,其他部分的软件并不依赖于硬件。I/O软件独立于设备,就可以提高设备管理软件的设计效率。
设备独立性的好处:
易于实现I/O重定向、设备分配时的灵活性
采用分层结构,一般分四层:中断处理程序(调度和控制),设备驱动程序(设备I/O),与设备无关的操作系统软件(逻辑I/O),以及用户级软件(指用户空间的I/O软件)
I/O缓冲区技术
单缓冲
每当一个用户进程发出一个I/O请求时,操作系统便在主存的系统区中为之分配一个缓冲区
CPU从磁盘上读一块数据分三步:磁盘->缓冲区->用户区->CPU计算
双缓冲
在设备输入时,先将数据输入到缓冲区A,装满后便转向缓冲区B。此时操作系统可以从缓冲区A中提取数据传送到用户区,最后由CPU对数据进行计算。
循环缓冲
可增加缓冲区的个数来改善CPU与I/O设备间速度不匹配的矛盾。
将多个缓冲区组织成循环队列的形式,其中一些队列专门用于输入,另一些队列专门用于输出
磁盘调度算法
先来先服务FCFS
根据进程请求访问磁盘的先后次序进行调度
优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
缺点是算法未对寻道进行优化,致使平均寻道时间可能较长(平均响应时间长)。
短寻道时间优先SSTF
总是满足那些与当前磁头所在的磁道距离最近的请求,也就是执行寻道时间最短的那个I/O请求(饥饿现象)
这种调度算法有较好的平均寻道时间。对中间磁道访问服务比内、外两侧磁道服务好,造成响应时间变化幅度大,在服务请求多时,内外边缘请求被无限期延迟,不可预期。
扫描(SCAN)算法(电梯调度算法)
当磁头正在自里向外运动时,SCAN算法要选择的下一个访问对象是其欲访问的磁道在当前磁道之外,又是距离最近的。直至再无更外的磁道需要访问时,才将磁臂换向,自外向里运动。
克服SSTF服务集中中间磁道和响应时间变化较大缺点,两侧磁道的访问的频率低于中间磁道。
循环扫描 CSCAN算法
规定磁头只能单向运动(自里向外或自外向里),当磁头运动到最外面的被访问磁道时,磁头立即返回到最里面的欲访的磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
磁盘Cache
在主存中设置的一个缓冲区,包含磁盘某些扇区的副本
如何将磁盘cache中的数据传送给请求的用户进程?
使用共享存储空间,将指向该共享空间的指针传递给进程即可,避免了数据直接传送的耗时
如何替换cache中的数据块?
LRU和LFU算法
最不常用算法LFU:替换访问次数最少的块。
- 块被读入时,计数器的值为1;每次访问到该块时,计数器的值+1。
替换时,选择计数器值最小的块。
存在一个问题:某些块可能在一段时间内被频繁地访问,使计数器值变得很大,但后面就不再访问到。因计数器值大,可能永远都不会被替换,虽然这块可能再也不会用到。
最近使用算法LRU:往头部加入新的数据,如果该数据存在则将其放到头部,如果加入时已满,则从底部淘汰掉数据
- 这种方式虽然简单,在频繁访问热点数据的时候效率高,但是它的缺点在于如果是偶尔的批量访问不同的数据时其命中率就会很低。比如我频繁的访问A,接着访问不同的数据直到A被淘汰,此时我再访问A,则不得不又再次把A加入到Cache中,显然这种方式是不合时宜的,因为A已经访问了很多次了,不应该将其淘汰而把一堆只访问一次的数据加入到Cache中。
第十二章 文件管理
文件和文件系统的定义
文件是存储在某种介质上的(如磁盘、磁带等)并具有文件名的一组有序信息的集合.
文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构(如目录和索引表等)的集合。
文件系统的目标和功能
目标:方便的文件访问和控制、并发文件访问和控制、统一的用户接口、多种文件访问权限、优化性能、差错恢复
功能:
- 创建:定义一个新的文件
- 删除:删除文件结构,释放资源
- 打开:打开一个已存在的文件,以便对该文件的操作
- 关闭
- 读:读文件中的部分或所有数据
- 写:更新文件、添加数据或更改内容
五种文件组织方式
堆 (Pile)
数据按先来后到的次序组织,每个记录由一串数据组成,是串结构的顺序文件
在堆文件中访问所需要的记录需穷举搜索。
目的是积累大量数据并保存,不适合大多数应用。
能较好地用于穷举查找且易于修改。
顺序文件 (sequential file)
顺序文件常用于批处理应用,适用于对所有记录的处理,对于查询或更新某个记录的请求的处理性能不佳(需要遍历)。
是唯一可以很容易地存储在磁盘和磁带中的文件组织
索引顺序文件 (indexed sequential file)
索引顺序文件极大地减少了访问单条记录的时间,同时保留了顺序文件的关键特征
索引文件 (indexed file)
常用于实时处理环境中,对信息的及时性要求比较严格。
直接或散列文件 (direct, or hashed, file)
常用于需要高速访问文件且每次访问一条记录的应用中。
文件目录和文件共享
FCB(文件控制块)
系统必须为每个文件设置用于描述和控制文件的数据结构,它至少要包括文件名和存放文件的盘物理地址,这个数据结构称为文件控制块FCB
文件控制块的有序集合称为文件目录,即一个文件控制块FCB就是一个文件目录项
文件共享
两个问题
- 访问权限(Access rights):无、知道、执行、读(复制+执行)、追加、更新、改变保护、删除
- 对同时访问的管理:读者与写者问题
三种记录组块技术
固定组块 (Fixed blocking)
- 记录长度固定
- 若干条完整的记录被保存在一个块中
- 存在内部碎片
可变长度跨越式组块 (Variable-length spanned blocking)
- 记录长度可变
- 紧缩在块中,解决了内部碎片问题
- 某些记录可能跨两个块,通过指针指向后继块
可变长度非跨越式组块 (Variable-length unspanned blocking)
- 记录长度可变
- 记录不跨块,存在内部碎片问题
三种方式比较
固定组块是记录长度固定的顺序文件最常用的格式
可变长度跨越式组块存储效率高,但难于实现
可变长度非跨越式组块会导致空间的浪费,并且记录大小受块大小限制
二级存储管理
文件分配表(FAT表):跟踪文件分配的情况
三种文件分配方式
- 连续分配(Contiguous allocation)
- 创建文件时,给文件分配一组连续的块
- 预分配策略,分区大小可变
- 文件分配表FAT中每个文件只需要一个表项
- 起始块和文件长度
- 存在外部碎片,需定期执行压缩技术
(读取文件中第i块需要访问1次磁盘)
- 链式分配
- 基于单个块进行分配,链中每一块都包含指向下一块的指针
- 动态分配:按需进行块分配
- FAT表中每个文件一个表项
- 起始块和文件长度
- 优点是盘存储空间利用率高,文件增删改记录方便,不存在外部碎片
- 局部性原理不再适用,可周期性地对文件进行合并
(读取文件中第i块需要访问i次磁盘)
- 索引分配
- 文件分配表FAT中对每个文件都包含一个一级索引
- 文件索引保存在单独块中,在FAT的表项里指向这一块的值
- 分配可基于固定大小的块,也可基于可变大小的分区
- 索引块中包括指向文件所有块的指针或指向分区起始块的指针
- 支持顺序访问文件和直接访问文件,是最普遍的一种文件分配形式
(读取文件中第i块需要访问2次磁盘,第一次,根据FAT找到该文件的索引块;第二次,根据索引的指针找到所要访问的第i块)
三种磁盘空闲空间管理方式
磁盘分配表(Disk allocation table,DAT)用来记录磁盘上哪些块是可用的
位表(Bit tables)
使用一个向量,向量的每一位对应磁盘中一个块的使用情况
其值为0 时表示对应盘块空闲;值为1时盘块已分配。
链式空闲区(Chained free portions)
空闲区通过指针链接,链表中每个结点都包含空闲区的长度及指向下一个空闲区的指针
使用一段时间后,磁盘会出现很多碎片,许多区都变成了只有一个块大小
创建文件和删除文件可能非常耗时
索引(Indexing)
将空闲空间看作一个文件
采用文件分配的索引分配方式来管理空闲空间
索引应基于可变大小的分区,而不是块
磁盘中每个空闲分区都有一个表项
(用户数为n,每个用户的运行时间片为q,则系统的响应时间为T=n×q。每个用户分到的时间片q由二部分组成,用于进程切换时间W和用于真正处理时间S。 ↩︎