持续更新…
0、中断
- 中断系统包括硬件子系统(完成中断响应)和软件子系统(完成中断处理)
- 处理流程:先是硬件部分(发现中断源、置中断码以备分析、交换新旧PSW)、然后是操作系统部分、即软件部分(保护未被硬件保护的现场信息、分析中断源、分别处理各类中断事件、调整进程队列、进程调度、恢复处理器现场信息)、最后再回到硬件部分(恢复PSW)
- 中断可以嵌套处理,所以引出了中断优先级和屏蔽中断的概念。可能同时接收到多个中断请求,则会通过中断优先级判断先响应哪些,同时在响应的过程中,若存在后被相应但是未被屏蔽的中断,则会优先处理后响应的中断
1、进程
操作系统为正在运行程序建立的一个管理实体(为了全方位的管理),进程就是指令的集合
进程的构成
- (OS管理运行程序的)数据结构P
- (运行程序的)内存代码C
- (运行程序的)内存数据D
- (运行程序的)通用寄存器信息R
- (OS控制程序执行的)程序状态字信息PSW
进程的状态
- 就绪态
- 运行态
- 等待态
- 挂起态:之前的三种状态都可转换为挂起态
- 挂起态与等待态的本质区别:后者占用已申请到的资源处于等待,前者没有任何资源
进程控制块PCB
OS用于记录和刻画进程状态及环境信息的数据结构
- 组成:标识信息、现场信息、控制信息
- 标识信息:系统分配的标识号、系统分配的进程组标识号、用户定义的进程名、用户定义的进程组名
- 现场信息:用户可见寄存器内容(数据寄存器、地址寄存器)、控制 / 状态寄存器内容(PC、IR、PSW)、用户 / 核心栈指针
- 控制信息:进程调度相关信息、进程程序 / 数据地址、进程队列指引元、进程通信相关信息(消息队列、信号量、锁)、进程处理器使用信息(占用的处理器、时间片、使用时间、已执行时间、记账信息)、进程特权信息(内存访问权限、处理器特权)、进程资源清单(正占有的资源、已使用的资源)
进程上下文
进程执行需要的环境,包括CPU现场和Cache中的执行信息
2、线程
多线程环境下进程与线程的概念
- 进程:是OS中进行保护和资源分配的独立单位
- 线程:是进程的一条执行路径,是调度的基本单位
状态
- 只有三种状态:就绪、运行、睡眠(无挂起状态,因为其并没有资源分配)
构成
- 线程执行状态
- 受保护的线程上下文,当线程不运行时,用于存储现场信息
- 独立的程序指令计数器
- 执行堆栈
- 容纳局部变量的静态存储器
KLT 内核级线程
内核空间中,线程管理所有工作由OS内核做,提供一个应用程序设计接口API,供开发者使用KLT,相当于”用户空间一个线程绑定内核空间一个线程“ 1:1
- 进程中一个线程阻塞,可调用统一进程的其他线程处理
- 内核自身也可用多线程技术,提高了操作系统的执行速度和效率
- 但是线程调度和管理在内核实现,同一线程中,切换开销较大
ULT 用户级多线程
用户空间运行线程库,任何应用程序均通过线程库进行程序设计,线程库再与OS交互,OS并没有意识到线程的存在,相当于“用户空间多个线程绑定了内核空间一个线程” N:1
- 线程调度和管理在用户空间,节省了切换开销和内核的资源
- 用户可根据特定应用选择特定调度算法,甚至裁剪调度算法
- 但是,不能利用多处理器的优点,OS调度进程时,仅有一个ULT能执行,且一个ULT阻塞,将引起整个进程阻塞
Process 混合式多线程
前两种实现的混和策略,单应用的多个ULT可以映射多个KLT,通过调整KLT数目,达到较好的并行效果,相当于”用户空间多个进程绑定内核空间多个线程” N:M
- KLT的三态:运行态、可运行态、阻塞态
- ULT的三态:可运行态、睡眠态、活跃态
- KLT三种状态都对应ULT的活跃态
3、调度
层次
- 高级调度:即作业调度,决定能否加入到执行的进程池中
- 低级调度:即进程调度,决定哪个可用进程占用处理器执行
- 中级调度:又称平衡负载调度,决定主存中的可用进程集合
三种调度的不同场合
调度算法遵守原则
- 资源利用率、响应时间、周转时间、吞吐量、公平性
调度算法
- 计算时间短(作业 / 进程)优先
- 剩余时间短进程优先
- 响应比高者优先(响应比 = 等待时间 / 估计计算时间)
- 先来先服务(多用于高级调度、低级调度中)
- 时间片轮转(重点在于时间片长短的确定)
- 分级调度:建立多个不同优先级的就绪进程队列,多个就绪进程队列间按照优先数调度,一个进程队列中按照时间片调度,越高优先级的队列分配的时间片越短
- 彩票调度:为进程发送针对系统各种资源(如CPU时间)的彩票,主要在于随机性
4、程序并发
相关概念
- 特性:并行性、共享性、交往性
- 临界资源:互斥共享变量所代表的资源,一次只能被一个进程使用
- 临界区:并发进程中与临界资源相关的程序段
PV操作(原子性)
- P操作:信号量减1、若信号量小于0,则调用进程被置为等待信号量的状态
- V操作:信号量加1、若信号量小于等于0,则释放一个等待信号量的进程
- 互斥问题:解决两个进程简单互斥的问题,需要一个s信号量,一对PV操作即可
- 同步问题:解决两个进程简单同步的问题,需要两个s信号量,两个PV操作(一个是否读空闲,一个是否写空闲)
- 苹果橘子问题:需要三个s信号量,是否有苹果、是否有橘子、是否有空位
进程通信
- 引入:交往进程通过PV信号量操作来实现互斥和同步是一种低级通信方式,有时还需要交换更多的信息,比如把数据传送给另一个进程,所以引进了更为高级的通信方式进程通信机制,通过信件来交换信息
- 直接通信:
send(A, 信件)
将信件发送给进程A,receive(A,信件)
从进程A接收信件 - 间接通信:
send(A,信件)
将信件发送到信箱A,receive(A,信件)
从信箱A接收信件 - 基于流的进程通信:多个进程使用一个共享的消息缓存区(管道、多路转接器、套接字)
- RPC:采用C/S计算模式,服务器进程提供一系列过程/服务,客服进程通过调用过程/服务来获得数据与服务
死锁
- 产生:竞争资源产生、PV操作不当、同类资源分配不当、临时性资源不加限制
- 四个必要条件:互斥条件、占有和等待条件、不剥夺条件、循环等待条件
- 死锁防止:破坏四个必要条件之一即可,但第一个和第三个并不是适用于所有资源,所以重点放在二四。静态分配(破坏第二条件),进程执行前要申请它所要的全部资源,满足后才开始执行;层次分配(破环第四条件),0·资源被分成多个层次 1·申请到一层的资源后才可以申请更高层的资源 2·释放一层的资源必须先释放所占用较高层的资源 3·获取某一层的一个资源后再申请该层另一个资源时,必须要显示该层中已占资源
- 死锁避免:需要了解每个进程的资源分配与申请情况,通过银行家算法来预测当前进程申请的资源是否可分配
- 死锁检测:两张表,等待资源表记录被阻塞进程所等待的资源,占用资源表记录已被进程占用的资源。通过检测两张表,列出所有等待占用关系(若进程P等待资源k1,而k1被进程P2所占用,则P1与P2具有等待占用关系W(P1,P2)),若出现了一组循环等待资源的进程,则检测到死锁
- 死锁检测后的解决方法:0·全部重新启动、1·定时设置校验点,从检验点开始重新执行、2·中止卷入死锁的进程,重新执行
5、主存储器(内存)
存储扩充
- 对换技术:将部分不运行的进程调出内存
- 虚拟技术:只调入进程的部分内容
虚拟存储器
- 局部性原理:编程代码具有顺序性和循环性,即空间局部性;某一阶段执行的代码多为相邻代码,即时间局部性
- 连个地址空间:虚拟地址空间(辅存)、实际地址空间(主存)
- 实现思路:首先,先将全部信息放在辅存中,执行时先将一部分装入内存,之后根据执行随用随调。其次,如果主存中没有足够的空闲空间,则将主存中暂时不用的信息调出到辅存中。
存储管理
- 单连续分区:一大块连续的分区、容易产生内存内零头
- 可变分区:分成多个可变的分区,动态调整分区大小,容易产生内存外零头(程序浮动技术,移动分区来解决内存外零头,其需要动态重定位技术的支撑,所以可变分区的分区表采用链表的格式)
- 页式存储:将主存划分成多个大小相等的页架,可不连续,不同页可以放在不同页架,位示图用来记录主存的分配情况,页表用于维系进程的主存完整性。由于每次执行需要访问两次内存(一次找对应页架号,一次访问)速度较慢,则提出了快表,快表在缓存中,存储部分页号与页架号的对应。
- 段式存储:将主存划分为多个任意大小的段,段内地址连续。
- 段页式存储:将页式和段式进行结合,段内地址可不连续,使用不连续的页架,即访问时,先找段,再找页。
页式虚拟存储管理
现代OS的主流存储管理技术
- 机制:首次只把第一页信息装入内存。
- 缺页中断:若有空闲页架,则根据辅存地址调入所缺页,更新页表与快表;若无空闲页架,决定淘汰页,更新页表与快表。
- 页面调度:
FIFO
LRU(最近最少用):每页创建一个引用标志,设置一个时间间隔中断,中断时引用标志全置为0,地址转换即使用时,当前页的引用标志置为1,淘汰页面时,从所有0中随机淘汰一个,难点在于时间间隔长短的设置。
LFU(最不常用):依旧基于时间间隔中断,每一页设置一个计数器,时间间隔发生后,中断时引用标志全置为0,每访问页一次就对应计数器+1,淘汰页面时,选择计数器最小的淘汰即可,
CLOCK(时钟):调入内存或访问时,标志置1,淘汰页面时,从指针当前指向的页面开始扫描循环队列,遇到1则置为0,遇到0则淘汰该页面。 - 反置页表:内存管理单元(MMU)所用的数据结构。之前的页表(每个程序都需要拥有自己的页表,随着程序增多,性能空间浪费),所以引入反置页表,拥有字段(页号、进程ID、控制位、链接指针),反置页表是全局的,进程通过自己的页号+进程ID进行HASH,通过链接指针来得到对应的页架号。
~、IO
I/O控制的几种方式
- 轮询:CPU重复向I/O控制器发送命令,等待I/O响应和操作完成。
- 中断:CPU向I/O控制器发送具体命令,然后执行自己的任务,I/O完成命令后发出中断,CPU响应中断,进行中断处理。
- DMA:采用直接存储器访问,DMA模块能够代替处理器控制主存和设备控制器间的数据交换,全部数据传送结束后,DMA发出中断。(周期窃取:DMA有访问主存的能力,所以CPU会把总线的占有权让给DMA几个主存周期。由于数据传送过程是不连续的,且CPU大部分情况下与Cache进行数据交换,所以周期窃取机制对数据交换性能影响不大)
- I/O通道:DMA升级版,可控制多台同类或不同类的设备。处理器不再执行和发送I/O指令,而是在主存中组织通道程序,由I/O通道来执行。
设置I/O缓存的目的
- 解决CPU与设备之间速度不匹配的矛盾
- 协调逻辑记录大小和物理记录大小不一致的问题
- 提高CPU和设备的并行性
- 减少I/O操作堆CPU 的中断次数
- 放宽对CPU中断响应时间的要求
~、文件
成组与分解
- 提出:一个物理记录只存放一个逻辑记录可能会造成极大的浪费,所以要进行多对多的映射
- 成组:将多个逻辑记录合并成一组,写入一物理块,对应一个物理记录
- 分解:将一个物理块对应的物理记录分离为多个逻辑记录
- 操作:系统设置独立于用户数据区的输入/输出缓冲区。成组操作在输出缓冲区进行,凑满一个物理块后才将缓存区中的信息写道存储介质上;对应地,分解操作在输入缓冲区进行,分离完毕后才可从输入缓冲区读取分解后的逻辑记录
- 优点:节省存储空间,减少输入输出操作次数,提高系统效率
- 缺点:引入了新的问题,提前读与推迟写
- 提前写:用户读请求,导致包含该逻辑记录的物理块读入输入缓冲区,这一操作可能读入了多个逻辑记录
- 推迟写:用户写请求,首先写入了输出缓冲区,只有该缓存区满后才进行了实际输出
辅助空间的分配方法
- 连续分配:顺序访问速度快,但会产生碎片,需进行碎片整理
- 非连续分配:动态分配,不连续,空间利用率高,碎片少,
- 引出空闲块的管理:位示图与空闲块成组链接法
文件系统的实现层次(由顶向下)
- 用户接口:接收用户发来的系统调用,进行语法检查,进入逻辑文件控制系统
- 逻辑文件控制子系统:根据文件路径名,搜索文件目录,建立活动文件表,根据文件结构和存取方法,把逻辑记录转换成相对物理块号和块内相对地址
- 文件保护子系统:识别调用者的身份,验证存取权限,判定本次文件操作的合法性
- 物理文件控制子系统:实现缓冲区管理,根据物理结构,将相对物理块号转换成实际物理块号,负责文件存储空间的分配,生成I/O控制系统的调用形式
- I/O控制子系统:执行具体的物理块I/O操作