操作系统:向应用程序提供资源集的基本抽象,在相互竞争的程序之间有序地控制对处理器、存储器以及其他I/O接口设备的分配(资源管理:时间复用、空间复用)。
计算机硬件:
CPU:
- 每个CPU基本周期中,从内存取指令-解码(以确定其类型和操作)-执行,如此反复。
因为访问内存慢,CPU内设有寄存器:
- 通用寄存器:用来保存关键变量和临时数据
专用寄存器:
- 程序计数器:下个指令的内存地址
- 堆栈指针:当前栈顶端
- 程序状态字(PSW):条件码位(由比较指令设置)、 CPU优先级 、 模式(用户态或内核态)等控制位
现代CP设计:
- 流水线:有单独的取指单元 、解码单元和执行单元,能同时取出多条指令。
- 超标量:更先进,有多个执行单元(只要有一个执行单元空闲, 就检查缓冲区中是否还有可处理的指令, 如果有, 就把指令从缓冲区中移出并执行之。)
模式:
- 用户态:用户程序编码能够解决的
内核态:无法编码表示的,用户程序必须使用系统调用(内中断)陷入内核并调用操作系统。
内中断(异常)
- 出错(fault):保存指向触发异常的那条指令 (例:缺页异常)
- 陷入(trap):保存指向触发异常的那条指令的下一条指令(例:调试)
- 外中断
存储器
- CPU寄存器 1ns <1k:32位CPU是32\32 64位CPU是64\64
- 高速缓存 2ns 4M
- 主存 10ns 1-8G RAM ROM Flash CMOS
- 磁盘 10ms 1-4T 低端硬盘速率50MB/s, 高速硬盘160 MB/s
I/0设备
- I/0设备=设备控制器+设备本身
设备控制器
- 为操作系统提供一个简单的接口。在控制器中经常安装一个小的嵌入式计算机,运行为执行这些工作而专门编好的程序。
- 大多数设备驱动程序(专门与控制器对话,发出命令并接收响应的软件)需要在内核态运行
- 设备本身:设备本身有个相对简单的接口, 这是因为接口既不能做很多工作,又已经被标准化了。
- 实现IO的方式:忙等待、中断、直接存储器访问
总线
最主要的PCIe总线
- 简介:10+Gb/s是串行总线架构,取代传统PCI的并行总线架构,通过一条被称为数据通路的链路传递集合了所有位的一条消息,这非常像网络包。PCIe 2.0规格的16个数据通路提供64Gb/s的速度,升级到PCIe 3.0后会提速2倍,而PCIe 4.0会再提速2倍。
CPU
- 通过DDR3总线与内存对话
- 通过PCie总线与外围图形设备对话
- 通过DMI总线经集成中心与所有其他设备对话
集成中心
- 通过通用串行总线与USB设备对话
- 通过SATA总线与硬盘和DVD驱动器对话
- 通过PCle传输以太网络帧
USB用来将所有慢速I/0设备(如键盘和鼠标)与计算机连接的
- USB 1.0 12Mb/s
- USB 2.0 480Mb/s
- USB 3.0 5Gb/s
SCSI
- 一种高速总线用在 高速硬盘、 扫描仪、服务器和工作站 640MB/s
- 即插即用:系统自动地收集有关1/0设备的信息,集中赋予中断级别和I/0地址,然后通知每块卡所使用的数值。
启动计算机
BIOS 检查所安装的RAM数量,键盘和其他基本设备
- 扫描PCie和PCI总线并找出连在上面的所有设备
- 尝试存储在CMOS存储器中的设备清单决定启动设备
- 操作系统询问BIOS, 以获得配置信息
- 检查就绪设备驱动程序, 操作系统将它们调入内核
- 创建需要的任何背景进程,启动登录程序或GUI
操作系统基本特征
并发:同一时间段内发生
- 并行:同一时刻发生(多道程序处理宏观上并发,微观上交替执行)
共享
- 互斥共享(如音频设备 打印机)
- 同时访问(磁盘文件)
虚拟
- cpu:每个用户(进程)的“虚处理机”
- 存储器:每个进程都占有的地址空间(指令+数据+堆栈)
- 显示设备:多窗口或虚拟终端
- 打印设备:将临界资源变为同时访问资源
异步性
- 判据:无论快慢,结果相同
进程线程
进程
模型
- 一个进程就是一个正在执行程序的实例, 包括程序计数器 、寄存器和变量的当前值。
多道程序设计:(伪)并行情况下运行的进程集
```
CPU 利用率= 1-p^n
一 个进程等待I/0操作的时间与其停留在内存中时间的比为p
n称为多道程序设计的道数
```
创建
- 1)系统初始化.
- 2)正在运行的程序执行了创建进程的系统调用。
- 3)用户请求创建一个新进程。
- 4)一个批处理作业的初始化。
终止
- 1)正常退出(自愿的)。
- 2)出错退出(自愿的)。
- 3)严重错误(非自愿)。
- 4)被其他进程杀死(非自愿)。
- 阻塞 block
- 唤醒wakeup
- 挂起suspend
层次结构
- UNIX 进程和它的所有子进程以及后裔共同组成一个进程组。用户发信号后每个进程可以分别捕获该信号 、 忽略该信号或采取默认的动作, 即被该信号杀死。在整个系统中, 所有的进程都属千以 init为根的一棵树
- Windows 所有的进程都是地位相同的
进程的状态与转换
- 状态:就绪(ready) 执行(running) 阻塞(blocked)
- 具有挂起的状态:执行,活动就绪,活动阻塞,静止就绪,静止阻塞
进程控制块
进程控制块中的信息
处理机状态
- 通用寄存器
- 指令计数器
- psw
调度信息
- 进程状态
- 优先级
- 调度所需信息(进程已等待CPU时间,进程已执行的时间总和)
控制信息
- 程序、数据地址
- 同步和通信(消息队列指针 信号量)
- 占用资源清单
- 链接指针(本进程PCB所在队列的下一个进程PCB的首地址)
- 家族关系 子进程父进程标示
线程
概念
轻型实体:只拥有必不可少的资源,如:线程状态、寄存器上下文和栈
- 独立调度和分派的基本单位
- 就绪阻塞执行3种基本状态
- 创建、终止时间比进程短
- 同进程内线程切换时间比进程短,系统开销小
- 可并发执行
- 共享进程资源(如内存 文件)
模型
- TCB
POSIX线程(IEEE 1003.lc 线程标准)
- 线程包pthread
- pthread_create 创建一个新线程
- pthread_exit 结束调用的线程
- pthread_join 等待一个特定的线程退出
- pthread_yield 释放CPU来运行另外一个线程
- pthread_attr_init 创建并初始化一个线程的属性结构
- pthread_attr_destroy 删除一个线程的属性结构
实现
在用户态实现
优点
- 快捷(不需要陷入内核,上下文切换,刷新内存高 速缓存)
- 它允许每个进程有自己定制的调度算法
缺点:
- 若核心阻塞进程,则进程中所有线程将被阻塞
- 同一进程中的2个线程不能同时运行于2个处理器上
- 在内核态实现
混合实现
- 使用内核级线程,然后将用户级线程与某些或者全部内核线程多路复用起来
调度程序激活机制
- 目标:模拟内核线程的功能,为线程包提供通常在用户空间中才能实现的更好的性能和更大的灵活性。
弹出式线程
- 概念:一个消息的到达导致系统创建一个处理该消息的线程
- 优点: 快速创建。没有必须存储的寄存器 、 堆栈
进程间通信
临界区:对共享内存进行访问的程序片段。
- 互斥:阻止多个进程同时读写共享的数据
一个好的并发方案需满足:
- 1)任何两个进程不能同时处千其临界区。
- 2)不应对 CPU 的速度和数址做任何假设。
- 3)临界区外运行的进程不得阻塞其他进程。
- 4)不得使进程无限期等待进入临界区。
忙等待的互斥方案
- 屏蔽中断:每个进程在刚刚进入临界区后立即屏蔽所有中断,在离开之前再打开中断,避免不了竞争
- 锁变量:避免不了竞争
- 严格轮换法:自旋锁(spin lock ) 违反了3)
- Peterson解法:个不需要严格轮换的软件互斥算法。
- TSL指令:需要硬件支持(test and set lock 测试井加锁 )
- XCHG:原子性地交换了两个位置的内容
- 缺点:优先级反转问题
睡眠(sleep)与唤醒(wakeup)进程间通信原语使得在无法进入临界区时将阻塞
- 生产者-消费者(producer-consumer)问题(有界缓冲区)
信号量
实现互斥或同步。
- down(P)和up(V) (分别为一般化后的sleep和wakeup) 对一倌号县执行down操作, 则是检查其值是否大千0。若该值大千0, 则将其值减1 (即用掉一个保存的唤醒信号) 并继续;若该值为0, 则进程将睡眠, 而且此时down操作并未结束。检查数值、 修改变批值以及可能发生的睡眠操作均作为一个单一的、 不可分割的原子操作完成。
互斥量
- 信号量的简化版
管程
- 一种高级同步原语,任何时刻管程中只有一个活跃进程,进入管程的互斥有编译器负责,通常是一个互斥量或信号量。
- 引入条件变量和2个操作(wait signal)来保证进程在无法运行时被阻塞。
- 限制:太低级,在少数编程语言之外无法使用。(分布式系统多个CPU各有私有内存,这些原语则失效)
消息传递
- 2条原语。send:调用向一个给定的目标发送一条消息,receive:调用从一个给定的源(或者是任意源, 如果接收者不介意的话)接收一条消息。如果没有消息可用,则接收者可能被阻塞,直到一条消息到达,或者带着一个错误码立即返回。
屏障
- (barrier)用于进程组, 除非所有的进程都就绪准备着手下 一 个阶段, 否则任何进程都不能进入下一个阶段。
避免锁
- 读-复制-更新(Read-Copy-Update, RCU),增删引用节点而不用锁。
调度
调度时机:
- 1.在创建一个新进程之后, 需要决定是运行父进程还是运行子进程。
- 2.在一个进程退出时。
- 3.当一个进程阻塞在1/0和信号量上或由千其他原因阻塞时, 必须选择另一个进程运行。
- 4.在一个I/O中断发生时
调度算法分类和目标
所有系统
- 公平--给每个进程公平的CPU份额
- 策略强制执行--保证规定的策略被执行
- 平衡--保持系统的所有部分都忙碌
批处理系统
- 吞吐扯--每小时最大作业数
- 周转时间--从提交到终止间的最小时间
- CPU利用率--保持CPU始终忙碌
交互式系统
- 响应时间--快速响应请求
- 均衡性--满足用户的期望
实时系统
- 满足截止时间--免丢失数据
- 可预测性--在多媒体系统中避免品质降低
典型调度算法
批处理系统
- 先来先服务
- 最短作业(进程、线程)优先
- 最短剩余时间优先
交互式系统
- 时间片轮转调度算法
- 优先级调度算法
- 多级反馈队列调度算法
- 最短进程优先
- 保证调度
- 彩票调度
- 公平分享调度
- 实时系统
- 高响应比优先调度算法
策略和机制
- 调度机制和调度策略分离,是的调度算法参数化,可由用户设置改变。
- IPC问题
- 哲学家就餐问题
- 读者写者问题
内存管理
地址空间
- 地址空间:存储器抽象,用于内存寻址的一个进程
- 基址寄存器:程序起始物理地址
- 界限寄存器:程序的长度
- 交换技术:把一个进程完整调入内存, 使该进程运行一段时间, 然后把它存回磁盘。
- 空闲内存管理:动态分配内存时一般用位图和空闲区链表管理
页表
- 虚拟地址=虚拟页号(高位)+ 偏移量(地位部分)
加速分页过程
要考虑两个主要问题:
- 1)虚拟地址到物理地址的映射必须非常快。
- 2)如果虚拟地址空间很大, 页表也会很大
方案:
- 1)转换检测缓冲区(相联存储器/快表):为计算机设置一个小型的硬件设备, 将虚拟地址直接映射到物理地址,而不必再访问页表。
- 2)软件TLB管理: TLB 大到(如 64 个表项)可以减少失效率
针对大内存的页表
- 多级页表
- 倒排页表:实际内存中的每个页框对应一个表项,而不是每个虚拟页面对应一个表项。
页面置换算法
- 最优
- 最近未使用
- 先进先出
- 第二次机会
- 时钟
- 最近最少使用
工作集模型:
- 概念:分页系统都会设法跟踪进程的工作集,以确保在让进程运行以前,它的工作集就已在内存中。
- 算法:当发生缺页中断时,淘汰一个不在工作集中的页面。
工作集时钟
- 不必扫描整个页表才能确定被淘汰的页面
- 所需的数据结构是一个以页框为元素的循环表
文件
文件
- 命名
结构
- 字节序列;记录序列;树
目录
- 层次目录系统
文件系统实现
- 连续分配
- 链表分配
- 采用内存中的表进行链表分配
管理和优化
磁盘空间管理
块大小
- 从历史观点上来说,文件系统将大小设在1~4KB之间, 但现在随着磁盘超过了1TB, 还是将块的大小提升到64KB并且接受浪费的磁盘空间更好
记录空闲块
- 磁盘块链表 每一块要用到 32 位
- 位图 每块只用一个二进制位标识 1TB 磁盘 需要大约 130 000 个 1KB
磁盘配额
- 系统管理员分给每个用户拥有文件和块的最大数量, 操作系统确保每个用户不超过分给他们的配额。
备份
- 1)从意外的灾难中恢复。
- 2)从错误的操作中恢复。
一致性
- 块的一致性检查和文件的一致性检查
性能
- 高速缓存
- 块提前读
- 减少磁盘臂运动
- 碎片整理
输入输出
IO硬件原理
IO设备
分类:
- 块设备:把信息存储在固定大小的块中,每个块有自己的地址(磁盘)
- 字符设备:以字符为单位发送或接收一个字符流。(打印机 网络接口 鼠标)
组成:
- 机械部件(设备本身)
电子部件(设备控制器/适配器)
- 任务:把串行的位流转换为字节块, 并进行必要的错误校正工作
组成:
有几个寄存器用来与CPU进行通信,操作系统写入它从而发送|接收|开启|关闭
方式:
- 内存映射I/O
- 直接存储器存取(DMA)
- 可以读写的数据缓冲区
IO软件原理
目标
- 设备独立性:可以访问任意I/0设备而无需事先指定设备
- 统一命名:一个文件或一个设备的名字应该是个简单的字符串或整数,不依赖于设备
- 错误处理:尽可能地在接近硬件层面得到处理
实现
程序控制I/O:
打印例子:
- 1.软件首先要在用户空间的一个缓冲区中组装字符串
- 2.用户进程通过发出打开打印机一类的系统调用来获得打印机以便进行写操作
- 3.操作系统(通常) 将字符串缓冲区复制到内核空间中的一个数组(如p) 中
- 4.操作系统查看打印机当前是否可用(轮询、忙等待)
- 5.一旦打印机可用,操作系统就复制第一个字符到打印机的数据寄存器中(内存映射1/0),激活打印机
6.打印机的第二个寄存器表明其状态
- 当字符写到数据寄存器的操作将导致状态变为非就绪
- 处理完当前字符时设置某一位或者将某个值放到状态寄存器表明已就绪
- 7.重复5直到打印完,回到用户进程
- 缺点:忙等待将是低效的
中断驱动I/O
打印例子:
- 当打印机将字符打印完并且准备好接收下一个字符时,它将产生一个中断。这一中断将停止当前进程并且保存其状态。
- 缺点:中断发生在每个字符上
DMA的I/O
打印例子:
- 让DMA控制器一次给打印机提供一个字符,而不必打扰CPU。
- DMA控制器是程序控制I/O,由DMA而不是CPU做全部工作
- 将中断的次数从打印每个字符一次减少到打印每个缓冲区一次
IO软件层次
自顶向下4层:
- 1.用户级IO软件
- 2.与设备无关的操作系统软件
- 3.设备驱动程序
- 4.中断处理程序
磁盘
磁盘臂调度算法
- 1.先来先服务
- 2.电梯算法
错误处理
- 控制器中处理:对千每一个坏扇区, 用一个备用扇区替换它
- 驱动程序中处理:发出一个recalibrate (重新校准)命令,让磁盘臂尽可能地向最外面移动,并将控制器内部的当前柱面重置为0
高级磁盘控制器
- 相当强大的多核ARM处理器,有足够的资源可以轻易地运行Linux
稳定存储器
- 稳定写
- 稳定读
- 崩溃恢复
时钟
时钟硬件
2种类型:
- 简单时钟:每个电压周期产生一个中断, 频率是50Hz或60Hz
- 3部件构成:晶体振荡器 、 计数器和存储寄存器,1000MHz甚至更高的频率
可编程时钟操作模式:
- 完成模式:one-shot mode
- 方波模式:square-wave mode
时钟软件(时钟驱动程序)
- 1)维护日时间。
- 2) 防止进程超时运行。
- 3)对 CPU的使用情况记账。
- 4)处理用户进程提出的alarm系统调用。
- 5)为系统本身的各个部分提供监视定时器。
- 6) 完成概要剖析 、 监视和统计信息收集。
死锁
资源
- 可抢占资源: 可以从拥有它的进程中抢占而不会产生任何副作用(如 存储器 )
- 不可抢占资源:在不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来(如 蓝光光盘刻录机)死锁与不可抢占资源有关
- 定义:一个进程集合中的每个进程都在等持只能由该进程集合中的其他进程才能引发的事件
发生(资源)死锁的四个必要条件:
- 1.互斥条件
- 2.占有和等待条件
- 3.不可抢占条件
- 4.环路等待条件
死锁检测
- 每种类型一个资源的死锁检测:检测有向图是否有环路、
- 每种类型多个资源的死锁检测:基千向最的比较(每个进程起初都是没有标记过的。算法开始会对进程做标记,进程被标记后就表明它们能够被执行,不会进入死锁。 当算法结束时,任何没有标记的进程都是死锁进程。)
死锁恢复
- 利用抢占恢复
- 利用回滚恢复
- 通过杀死进程恢复
死锁避免
- 资源轨迹图
- 安全状态和不安全状态
- 单个资源的银行家算法
- 多个资源的银行家算法
死锁预防
- 破坏四个必要条件之一
其他问题
- 两阶段加锁
- 通信死锁
- 活锁
- 饥饿
参考资料
- 《现代操作系统 第四版》
- 计算机考研基础课《操作系统》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。