《操作系统之哲学原理》读书总结
全书的内容结构如下,分为基础原理,进程原理,线程原理,内存原理,文件原理,I/O原理,多核原理与操作系统设计篇。
1 操作系统的角色:魔术师跟管理者,本质是“人造机器”
程序到结果的过程如下:
操作系统的具体任务:CPU管理,内存管理,外存管理,I/O管理,批处理
CPU即进程管理,主要目的有3个,第一个是公平,第二个是非阻塞,第三个是优先级
内存管理主要是管理缓存主存磁盘磁带等储存介质所形成的内存架构,虚拟内存的概念,内存管理另一个目的是让多个程序共享一个物理内存。
外存管理也成为存储管理,即文件系统
I/O管理也成设备管理。目的有屏蔽不同设备的差异性和提供并发访问
右图是windows简化之后的结构
2 操作系统历史
状态机操作系统——单一操作员单一控制端操作系统——批处理操作系统——多道批处理操作系统——分时操作系统,实时操作系统——现代操作系统
分类:
3 操作系统基本概念
中断的基本原理:设备在完成自己的任务后向CPU发送中断,CPU判断优先级,然后确定是否响应,如果响应则执行中断服务程序,并在中断服务程序执行完成后继续执行原来的程序。还可以有软中断。
内核态与用户态
通过地址翻译来限制程序对资源的访问
操作系统的结构分为:单一体,层次化,wei内核
进程,内存和文件:概念(进程核,分段错误,核倒出)
系统调用:参数准备,参数调用识别,参数调用执行
shell即壳。
4 进程
多道编程可以提高CPU利用率和改善系统响应时间
子进程父进程进程树进程组
进程的三种状态(简化版)
进程空间即地址空间
进程管理: 进程表/进程控制块 保持在操作系统所在的内核空间里;进程创建过程
进程缺点:只能在一个时间做一件事,而且阻塞会影响后面。
5 进程调度
调度是操作系统实现进程模型的根本手段
对于实时系统来说,调度就是要在截止时间前完成所应该完成的任务和提供性能可预测性
FCFS:先来先服务 ; 时间片轮转算法;短任务优先算法;优先级调度算法;混合调度算法;其他调度算法;实时调度算法:必须提供时序可预测性的系统:经典的有动态优先调度与静态优先级调度。
调度异常之优先级倒挂:使用中断禁止;优先级上限;优先级继承
6 进程通信
管道;记名管道;虫洞:套接字;进程电报:信号;信号旗语:信号量;进程拥抱:共享内存;信件发送:消息队列;其他通信机制
7 线程
进程的分身术——线程
线程分共享与独享资源
线程有用户态实现与内核态实现,进程的实现只有操作系统内核进行
内核态
优点:编程简单;如果一个线程执行阻塞操作,操作系统可以从容调度另一个线程执行
缺点:效率低,占用内核稀缺的内存资源,需要修改操作系统
用户态
缺点:编程难,无法完全实现进程级多道编程
因此需要防堵塞
混合态,将需要执行阻塞操作的线程设为内核态线程,不会执行阻塞操作的线程设为用户态线程
8 线程同步
线程的同步对程序的正确运行至关重要
多线程程序的执行结果有可能是不确定的,因此需要线程同步
多线程访问或执行同一资源或程序:竞争
这个可能会造成竞争的共享代码段成为临界区
金鱼的例子:
不需要等待的方法:睡觉与叫醒 以售货机为例
系统死锁,把信号累计起来的操作的系统原语是信号量
简单地说,信号量就是一个计数器,其取值为当前累计的信号数量,支持两个操作:up和down(V,P)
二元信号量
管程:监视进程或者线程的同步操作
管程的中心思想:运行一个在管程里面睡觉的线程,但是在睡觉前需要把进入管程的锁或信号量释放
管程最大问题:对编译器的依赖,因为我们需要编译器将需要同步的原语加在管程的开始和结尾
消息传递 通过同步双方经过互相收发消息来实现的 send与receive
栅栏 对一组线程进行协调,所有线程都到一个地方汇合一起后再向前推进
9 死锁的应对
归根结底是因为对资源的竞争
定义:如果有一组线程,每个线程都在等待一个事件的发送,而这个事件只能由该组线程里面的另一线程发出,则称这组线程发生了死锁。
死锁的四个必要条件:
1 资源有限 2 持有等待 3 不能抢占 4 循环等待条件
哲学家就餐问题:每个哲学家都拿起左边筷子,而等待右边筷子,这时候死锁将发生
策略: 允许死锁发生(1 不予理睬 2 发生后予以解决) 不让死锁发生(1 通过生活中的仔细检点 2 将死锁的必要条件消除)
银行家算法:冒险的代价 动态避免死锁的算法,通过对资源的仔细分配以避免死锁
静态防止,动态避免,不予理睬,检测修复四种策略
死锁,活锁,饥饿(一直等不到所需要的资源),三者的关系:
10 锁的实现
以中断启用与禁止来实现锁
以测试与设置指令来实现锁
以非繁忙等待,中断启用与禁止来实现锁
以最少繁忙等待,测试与设置来实现锁
中断禁止,测试与设置
11 基本内存管理
核心思想:虚拟内存 机制:动态地址翻译
内存管理的目的:1 保证一个进程不能随便访问另一个进程的地址空间 2 程序发出的地址与具体机器的物理主存地址是独立的
虚拟内存:
操作系统在内存中的位置
第二种有个好处:内存映射的输入输出
单道编程的内存管理:
运行前将所有地址计算好——静态地址翻译
多道编程的内存管理:
动态地址翻译
两种策略:固定分区和非固定分区
固定:
物理地址 = 虚拟地址+程序所在区域的起始地址
两个端值:基址和极限 基址寄存器和极限寄存器
动态地址翻译的优点:
灵活,抵制保护,虚拟内存的实现
在动态地址翻译的环境下,一个虚拟地址仅在被访问的时候才需要放在内存里,其他时候并不需要占用内存
非固定:
除了操作系统空间,其他的内存是作为一个整体存在的
交换(SWAP)
将一个进程从内存倒到磁盘上,再将其从磁盘上加载到内存中的过程
重叠(overlay)
双基址
闲置空间管理
12 页式内存管理
到目前为止,已经有 固定加载地址的内存管理,固定分区的内存管理,非固定分区的内存管理和交换内存管理
后三种均是同一种实现机制:基址与极限
分页内存管理:将虚拟内存空间和物理内存空间皆划分为大小相同的页面
地址翻译
13 页面更换算法
公平算法: 随机算法,先来先出算法。第二次机会算法,时钟算法
非公平算法:最优算法,NRU算法,LRU算法,工作集算法
14 段式内存管理
15 磁盘操作
操作系统为磁盘提供的抽象就是:文件及文件系统
16 文件系统
文件命名 内容寻址
关系导向型:
非关系型:
文件格式
文件访问:顺序访问与随机访问
文件属性:
文件操作:
地址独立的实现机制:文件夹
相对路径与绝对路径
共享与链接
文件系统调用
内存映射的文件访问
17 文件系统实现
连续/非连续空间存放
FAT文件系统
18 文件系统性能
文件授权管理
主动控制:访问控制表
能力表(也保存在内核空间)
日志,事务,随影,文件系统和用户文件,文件系统一致性检查
文件缓存 虚拟内存和文件缓存 提前读取 减少磁臂移动
19 输入与输出
I/O口
20 多核结构与内存
多核,超线程
21 多核环境下进程的同步与调度
多核进程同步,多核原子操作,总线锁,旋锁
22 操作系统设计篇
层次架构
总结:内容太多了,回头针对高频问题单点突击。。