01 导论
操作系统是软硬件接口,它最主要的任务是向下协调硬件资源以达到尽可能高的时间效率和空间利用率,向上服务软件提供安全可靠的运行环境和简明操作抽象。其中,管理硬件资源包括对CPU、存储资源、设备的管理,服务软件则包括API接口、安全性封装性考虑以及各种抽象(eg. 进程、一切皆文件……)的管理。
特征
基本结构
系统调用
02 进程与线程
进程
概述
感觉这种可能考什么简答题
状态
状态
控制
其它
wait
感觉这个也会出题
这些参数可能得再细致研究一下
sleep
execve
介绍
为什么与fork分离
进程图
感觉这个也可能考,之后看看王道
异常控制流
概述
控制流
异常
这些需要注意下概念题,比如xxx属于哪种类型的异常
概述
中断
陷阱
故障
终止
进程间通信
共享内存
消息传递系统
TODO,区分一下信箱和消息队列,看起来好像。我记得以前知道的,可惜现在忘了。
管道
线程
概述
线程
多线程进程
并发线程
可以注意一下这个例题:
对比
多线程模型
多对一
一对一
多对多
果然一切问题都得中庸
就是加了个允许一对一绑定
Posix线程
创建
感受一下C语言的面向对象
终止
好像第一个一般传的NULL。第二个应该相当于是线程A让某个线程终止(可以是自己也可以是别的),然后被终止线程应该会有代码检查是否被cancel,是的话再滚蛋。
Join Detach
这个意义感觉还是有点模糊,到时候再看看网上的说法
这玩意我看着要吐了,以后有精力看看吧
03 并发与同步
信号
感觉这节很有意思,以前也没学过,值得仔细看看
用户程序通过系统调用针对某个信号注册了一个处理函数handler。然后另一个进程通过kill发送了该信号给这个用户程序。对这个信号的检测会推迟到用户程序陷入内核,并准备从内核返回的时候。这时候内核检查信号列表,发现了该待pending的函数,就直接强制性跳转到了用户自定义的处理函数handler(也就是说需要暂时返回用户态),执行完handler之后再回到中断上下文(回到内核态),然后返回到用户程序。
定义
收发
发送
用kill -信号ID来发送一个信号。
下面这个区别没看懂
接收
这里再仔细看看,信号的处理流程和时机
pending&block
阻塞位决定的是能否被接收,也就是说有可能出现阻塞位和挂起位都为1的情况。
阻塞
信号处理
处理函数
例子
安全性
printf不安全我想大概是因为用了变长参数之类的???这个值得深挖。或者说是因为它内里对数据处理非原子,所以可能导致输出混乱?
G3类似关中断
正确性
嵌套
处理流程
哦吼!到这里才意识到,原来我们xv6的sigalarm是实现了一次特殊的信号!(实在后知后觉……这个到时候再仔细看看)
例题
信号量
进度图与临界区
之后学习一下条件变量是什么。。。
信号量
这:
信号量实现互斥
P操作相当于减少信号量值,V操作相当于增加信号量值
进程同步
制约关系
也即竞争和同步的概念
同步
概念
这个概念区分值得注意
信号量实现
王道补充
整型信号量
记录型信号量
信号量实现互斥
初始值为1
信号量实现同步
这个可以保证456一定在12后面被执行,可以理解为生产者消费者模型
生产者消费者
除了这两个同步信号量,还需要多来一个互斥信号量表示对缓冲区的互斥访问
注意这里同步信号量和互斥信号量的顺序,如果交换了应该会死锁。p操作不能,因为它会阻塞。v就无所谓,因为不会阻塞
多生产者消费者
04 CPU调度与优化
基本概念
处理器调度
过程和开销
抢占与非抢占
计算/IO密集
指标
调度算法
这部分也需要注意考题,应该会考调度序列和各种指标计算。
预测CPU区间
FCFS
SJF
所以需要最小平均等待时间的话,用sjf是最好的
SRJF
相当于是SJF在任务到达时间有先后的情况下的一种拓展
RR
这个一下整了好多例子,感觉考查重点
每次pick应该是按照特定的轮转顺序?看图例大概是tid之类的
为什么实时调度都要用RR或者FIFO策略?
- 确定性:实时任务通常要求确定性的响应时间。SCHED_FIFO和SCHED_RR提供了可预测的调度行为,保证了高优先级任务能够及时获得CPU时间。相比之下,CFS设计用于提供公平性,但并不保证确定性的响应时间107。
- 优先级抢占:实时调度策略允许高优先级任务抢占低优先级任务的执行,这在需要立即处理的任务(如中断处理)中非常重要。CFS策略下的任务抢占行为是基于CPU使用时间的公平性,而非严格的优先级7。
- 实时性能要求:实时任务往往与系统的实时性能要求相关,如工业控制、音频/视频同步等,这些场景需要确保任务能够满足特定的时间约束。FIFO和RR策略能够提供这种保证,而CFS则更侧重于长时的CPU使用公平性5。
- 时间片管理:SCHED_RR通过时间片轮转为相同优先级的任务提供了公平的调度机会,而SCHED_FIFO则保证了相同优先级的任务将顺序执行,直到任务主动放弃CPU。CFS的时间片管理机制不适合实时任务的时间敏感性要求9。
- 系统资源的保障:实时任务可能需要独占或优先访问系统资源,而CFS策略下,系统资源是按需动态分配的,这可能导致实时任务无法获得足够的资源来满足其时间要求4。
- 实时任务的严格性:实时任务通常不能容忍延迟,因此需要一个能够保证任务在规定时间内执行的调度策略。FIFO和RR策略提供了这种严格性,而CFS策略则更适用于对实时性要求不高的普通任务8。 总的来说,实时调度策略(SCHED_FIFO和SCHED_RR)提供了实时任务执行所需的确定性和响应性,而CFS策略则更适合于一般目的的进程调度,它提供了良好的CPU使用公平性和效率。在需要严格实时性能的场景中,使用RR或FIFO策略是更合适的选择。
MLFQ
确实,它很好的一点就是每个队列可以用不同的调度算法。感觉这种分层级的思想或许也可以用于idea
彩票(Lottery)
05 死锁
Intro
四个产生条件
资源互斥访问
概念
四个条件
处理方法
死锁预防
静态分配,可能导致某些进程饥饿
我怎么感觉按序申请挺常见的(
死锁避免
原理
银行家算法
资源请求算法
死锁检测
资源分配图
资源分配图化简算法是死锁检测,注意与资源请求算法的差别
也相当于找到了一个安全序列
下面那个感觉是因为P4和P2还是有可能释放资源
然后还有环路和死锁的关系:【操作系统】死锁(详细)
① 如果进程-资源分配图中无环路
——>则此时系统没有发生死锁
② 如果进程-资源分配图中有环路,且每个资源类中仅有一个资源
——>则系统中发生了死锁,此时,环路是系统发生死锁的充要条件,环路中的进程便为死锁进程
③ 如果进程-资源分配图中有环路,且涉及的资源类中有多个资源
——>则环的存在只是产生死锁的必要条件而不是充分条件
不知道什么玩意
死锁恢复
死锁忽略
06 内存管理
背景
重定位
重定位三个时机:
编译链接
绝对代码
装载时
运行时
概念
地址
地址空间
没看懂后面两个的差别。。。
连续内存分配
固定分区
等长
变长
可变分区
分区分配算法
碎片问题
分段内存管理
概述
地址翻译
总结
分页内存管理
地址翻译
页表
页表项
地址空间
多级页表
概述
地址翻译
效率-TLB
总结
段页结合
将内存分为功能不同的段有助于提高数据局部性和实现数据隔离,将内存分为固定大小的页有助于缓解内存碎片化和方便回收分配管理,故而主流采用的是段页结合的内存管理,体现了一个软硬件之间的妥协。
ELF文件
X86内存
值得注意的是,以前只了解开启虚拟地址映射的时候会开启LDT,就是不大清楚这其中的具体含义,经同学启发,以及“每个进程都有一个LDTR”的表述,才意识到它能保证多个进程虚拟地址空间的管理。
具体来说这个地址映射的转化是这样的,实模式使用物理地址,即程序直接访问物理内存地址,没有分段或分页机制故而它有4MB的直接寻址空间。而它切到保护模式的时候会先切换为一个使用段表的新GDT表,开启对LDT表的使用,从而开启了段页结合的虚拟映射。
王道
连续内存分配
覆盖和交换
这个也就类似于swap,只不过swap换入换出单位为页,这个单位为整个进程
动态分区分配
这几个优缺点得背,比如说最主要的是最佳适配的内存碎片、开销问题,最坏适配的大分区用完问题,以及首次适配的性能最好。
非连续内存分配
上面这些包括什么动态分区分配算法(最先适配最佳适配等等)都是连续分配管理方式,接下来我们要学的分段分页属于非连续内存管理方式。他们逻辑空间连续,但是物理空间不一定连续
分页
页表项
可以发现如果只是单纯的分页,还是不用什么逻辑地址那么复杂的,只用有页号块号的映射表即可
这个意思是一个页表跨了多个页框存储,第一个页的最大为1364,所以1365也即下一个页框的起始地址需要做点小操作
地址转换
硬件流程
基本
TLB
tlb是存的页表项,可以不防存而访高速cache来得到物理地址
计算题
注意这个同时查找!
多级页表
值得注意的是,页表只能存在一个页里,不能多个,这个可以用来做题
又一个时间空间矛盾
分段
对比
段页结合
现在整了个二维TLB
07 虚拟内存
王道-虚拟内存
定义
6666,它这里说虚拟内存其实也就类似交换和覆盖技术。这个思想很牛逼
传统方式的一次性、驻留性
请求分页
页表机制
缺页中断
地址变换
之后就是直接查快表不是慢表了
页面置换算法
OPT
FIFO
LRU
简单CLOCK
- 初始时每个都为1,扫描指针指向第一个元素
- 如果所需页面存在,把对应的置为1(不用改扫描指针)
- 如果不存在,移动扫描指针(过程中把1改为0)直到遇到第一个0,把它t出去,换成新的进来置为1,然后扫描指针指向下一位
改进CLOCK
优先淘汰没写过的页面
页面分配
驻留集
策略
固定分配局部置换
一开始分配固定数量,然后进程内部选页换入换出,页面数量始终固定
可变分配全局置换
缺页从全局空闲块队列取,无空闲块则随便选个进程的某个页调出分配给缺页进程
可变分配局部置换
一开始分配一定数量,缺页时只在自己内部换入换出。
监测缺页率,太高就给它多几个物理块
颠簸
工作集
用来确定驻留集
内存映射文件
概述
按需调页
页面置换算法
FIFO
OPT
LRU
CLOCK
其它
COW
swap与工作集
swap
工作集
页面置换
置换策略
颠簸
页错误率PFF
Belady异常
程序优化
CSAPP
地址翻译
映射方法
全相联
直接映射
组相联
内存映射
它这里引入了一个很有意思的概念,将一般的内存映射与mmap结合在了一起。
对于进程来说,其代码段和数据段相当于映射到了某个磁盘上的普通文件,栈和.bss段相当于映射到了某个匿名文件。体会一下这种思想。
08 I/O与存储
设备管理概述
IO系统
组成
我记得ghost把enclave等等抽象为了设备文件,也只能说确实牛逼
命令发送
IO控制方式
轮询
中断
DMA
通道
缓冲技术
软件缓冲
SPOOLING
可以破坏死锁条件的互斥条件,预防死锁
磁盘设备
概述
磁盘调度算法
FCFS
SSTF
SCAN
C-SCAN
C-LOOK
磁盘编址
CHS
扇区编号LBA
进程IO
硬盘布局
确实诶,分区完就变成/dev/sda3这种了,然后依然可以对sda3进行fdisk
页面置换
固态硬盘SSD
概述
FTL
组成
地址映射
磨损平衡
垃圾回收
09 文件系统
王道
文件逻辑结构
顺序文件
注意这个顺序文件可以顺序存储或者链式存储
串结构就是没有按关键字排序
随机存储和检索记录还是两个概念
索引文件
索引顺序文件
相当于离散索引了呗
文件目录
由于减少了目录大小,所以减少了磁盘块占用大小,所以增大了索引效率
也就是说FCB实际上就是dentry+inode吗
文件物理结构
连续分配
链式分配
隐式
默认指隐式链接
显式
每次查FAT就够了
FAT不会读磁盘
索引分配
概述
感受一下跟FAT的差异
当一个磁盘块装不完全部索引,就需要采取以下几种方案:
链接方案
这个也就是咱的隐式链接了
多层索引
注意文件大小和IO次数的计算
混合索引
空闲空间管理
空闲表
空闲链表
位图
注意与盘块号的转换
成组链接
unix分成块组,这下看懂了
并且注意,每个块组第一块也是可以分配出去的,这时候就需要合并了
同理可得回收也要加层,感觉有点b+树那味了:
文件基本操作
创建
删除
打开
关闭
读写
read、write系统调用
文件共享与保护
共享
硬链接与软链接
硬链接
这也就是inode了
软链接
xv6就实现过,具体在open中switch-case
保护
口令
加密
访问控制
文件系统
层次结构
用户接口:文件基本操作
文件目录:文件目录
存取控制:文件保护
逻辑文件与缓冲区:逻辑结构
物理文件系统:物理结构
辅助分配:空间管理
设备管理:磁盘管理
全局结构
物理格式化
逻辑格式化
内存结构
虚拟文件系统
很帅很帅的VFS
挂载与装载
咱在fuse也做了这件事。文件系统除了这些之外还得对自己内部结构进行初始化
目录结构
物理结构
连续存储
链式存储
索引存储
逻辑结构
树状目录
目录实现
内容
路径解析
文件系统的实现
分区
特性
提高性能
权限控制
容错
EXT2文件系统
磁盘组织
超级块
块组描述符
位图
索引
Windows FAT
日志
基本交互
故障恢复
Redo
应用文件系统
EXT4
LFS
概述
感觉这些存储领域的东西很多还是共通的。可以思考下与deduplication system的相关性。