操作系统的演进
无操作系统->批处理系统->分时系统
早期的操作系统一次只能处理一个任务
多道程序设计使得批处理系统一次就可以处理多个任务
那么什么是多道程序设计呢?
多道程序设计是指在计算机内存中存放多个程序
多道程序在计算机的管理下相互穿插运行
简而言之,多道程序设计在计算机管理下处于关键地位,是计算机系统中的重要功能。
操作系统的五大功能?
文件管理,进程管理,设备管理,存储管理,作业管理
为什么要操作系统?
我们不能直接操作硬件,
设备复杂多样,需要统一界面
操作系统的简易性让人们更容易的去操作计算机。
操作系统的基本功能是什么?
处理器的资源,IO设备资源,存储器资源,文件资源
操作系统的基本功能
图像窗口形式,命令形式,系统调用形式
并发性
并行性和并发性
并行的意思是两个进程同事运载,比如说,我眼睛看着屏幕的同时我在敲键盘,这就是并行
并发的意思是我在喝水,突然停止喝水这个动作我要去解手
并发通常是指在一个线程下进行的操作
并行是两个事件在同一时刻进行发生
并发是指两个或多个事件在同一时间间隔下发生、
共享性
互斥共享形态
当A占用资源时,其他进程想使用就必须等待,只有当A结束运行时,其他进程才能够抢占资源 。
同时访问形式
某种资源在一段时间内被多个程序访问。
这种同时是“”宏观的“”,宏观的去看该资源可以被同时访问。
虚拟性
虚拟性表现为物理实体转变为若干个逻辑实体
物理实体是真实存在的,逻辑实体是虚拟的
虚拟技术分为时分复用和空分复用
进程与线程的比较
比较类型 | 进程 | 线程 |
---|---|---|
资源 | 资源分配的基本单位 | 不拥有资源 |
调度 | 独立调度的基本单位 | 独立调度的最小单位 |
系统开销 | 系统开销大 | 系统开销小 |
通信 | 进程IPC | 读写统一进程数据通信 |
进程的三态
就绪,执行,阻塞
就绪状态
- 当进程被分配到除cpu所有必要的资源之后
- 只要在获得cpu使用权限就可以立刻运行 其他资源已经准备好
- 就差cpu资源的状态为就绪状态
通俗来讲,就绪状态就相当于吃饭,饭做好了,菜炒出来了,但是一发现,筷子还没拿呢,筷子被别人占着了,你就得等。
执行状态
- 当进程获得cpu资源之后,其程序正在执行称为执行状态
- 在单处理机中,某个程序正在执行称为执行状态
执行状态就相当于你的筷子拿到手了,你就可以吃饭了
阻塞状态
- 进程因某种原因如其他设备就绪无法继续执行,从而放弃cpu状态称为阻塞状态
你吃饭慢啊,这顿吃一半呢,结果突然服务器来了一大波流量,吃不消了,宕机了,一看是某某明星结婚了,你就得放下饭碗去修服务器,这饭给谁吃呢,谁愿意吃谁吃呗.
进程的五态
进程除了就绪,执行,阻塞还有两态,分别是创建态和终止态,一头一尾
创建状态
创建进程拥有PCB但其他资源尚未就绪的状态称为创建态
创建态相当于你饭都没做呢,菜也没炒,你没法吃,你得用火去做。
终止状态
系统清理,PCB归还
你吃完饭得把东西收拾了,结算一下,比如你朝老王家借了俩鸡蛋,你得还人家俩鸡蛋,归还
进程的同步
进程同步有四个规则
名称 | 解释 |
---|---|
空闲让进 | 资源无占用,允许使用 |
忙则等待 | 资源有占用,请求进程等待 |
有限等待 | 保证有限等待时间能够使用资源 |
让权等待 | 等待时,进程需要让出cpu |
- 比如说,六个人吃饭,但是只有五个碗筷,但是其余五个人要么洗澡,要么看电视,要么玩游戏,就你吃饭,你就可以上桌了(空闲让进)
- 最后打游戏的人来了,发现人坐满了他就得等(忙则等待)
- 还有个人吃饭数着米粒吃的,一粒一粒的吃,这闹着玩呢?占着资源不好好利用,这时候就得有个机制去制止他,不行,他不能从中午饭吃到晚饭在这坐着一直耗下去(有限等待)
- 你退席的时候不能把碗筷都拿走吧,因为第六个人吃饭得用碗筷(让权等待)
进程同步的方式
- 消息队列
- 共享存储
- 信号量
死锁
死锁(DeadLock),就是资源分配不当导致的相互对峙(资源竞争)货币价值在于流通,但是我没有商品或者物品给我流通,我只好就这样等着。
打印机 | 传真机 |
---|---|
进程1 | 进程2 |
再举个例子,比如进程1控制传真机,进程2控制打印机,进程1说我要打印机资源,但是进程二说我要传真机资源,这样形成了僵持,从而造成了死锁。(等待请求的资源被释放,自身占有的资源不释放)
解决的方法可以是先让进程1获取打印机资源,然后获取传真机资源,释放资源,进程2获取资源,接着执行,这样解决了死锁问题。
内存的回收与分配
动态分区分配
- 首次适应算法
- 分配内存时从开始顺序查找适合内存区
- 若没有合适内存区,则该次分配失败
- 每次都从头部开始,使得头部地址空间不断被划分
- 最佳适应算法
-
最佳适应算法按照要求空闲区链表按照容量大小排序
-
遍历空闲区链表找到最佳合适空闲区
内存回收
内存回收有四个讨论点
这种就是回收区和空闲区合并,新空闲区使用新空闲区的地址
回收区和空闲区合并,新地址用回收区地址
回收区和空闲区合并,形成新的空闲区,新的空闲区使用空闲区1的地址
创建新的空闲链表节点,将节点插入该链表中。
通俗的来讲就是谁在上面,谁就吞谁。
段页式存储管理
页式存储管理
我们先看下空闲节点的示意图
- 页面大小应该适中,过大难以分配,过小碎片过多
- 页面大小通常是512B-8K
我们用上面的图可以整理出下面的表
页码 | 字块 |
---|---|
1 | 2 |
2 | 4 |
3 | 5 |
4 | 7 |
5 | 8 |
6 | 9 |
7 | 11 |
8 | 12 |
9 | 13 |
这个很像数据结构映射关系对不对?就像一个map一样,一个key保存的是页码,value保存的是字块所处的位置,一一对应。
段式存储
段式存储就是一段段的去存储,如图所示
段式存储的表里面有段号,基址,段长表示。
段号就是段的编号
基址就是一开始那个地址
段长就是这一段的长度
段式和页式存储管理的共同点
- 段式和页式都离散地管理了进程的逻辑空间
页 VS 段
页 | 段 |
---|---|
物理单位 | 逻辑单位 |
合理利用空间 | 满足用户需求 |
页大小固定 | 段长可以变化 |
页表的信息是一维的(页号) | 段表的信息是二维的(基址,段长) |
段页式存储管理
段页式存储管理就是内层页面存储,分成几段几段,外部用段进行存储。
虚拟内存
局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
虚拟内存的置换算法
下图展示的是高速缓存的替换时机
下图展示的是主存页面的替换时机
Linux系统下的存储管理
Buddy内存管理算法
- 页内碎片
内部碎片是已经被分配出去的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片 - 页外碎片
外部碎片是指还没有分配出去,但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。
Buddy算法的例子:
比如我要100K内存,buddy每一个空闲的块都是2的幂次方
我有1M,过程如下
- 先分512K进去,有空余,剩下的512K分配出去
- 剩下512K再进行划分,256k+256k
- 取256k,剩余的256k分配出去
- 256k再划分,128k+128k
- 取128k下来,剩下的128k划分出去
那回收呢? - 128k有伙伴吗?有!变成了256k
- 256k有伙伴吗?有!变成了512k
- 512k有伙伴吗?有!变成了1M
这样,刚刚分配的内存就回收回来了。
伙伴算法在内存管理方面还是比较重要的,主要解决了内存外碎片的问题。
虚拟内存与Swap空间的比较
Swap空间 | 虚拟内存 |
---|---|
Swap空间存在于磁盘 | 虚拟内存存在于磁盘 |
swap空间与主存发生置换 | 虚拟内存与主存发生置换 |
swap空间是操作系统概念 | 虚拟内存是进程概念 |
swap空间解决系统物理内存不足的问题 | 虚拟内存解决进程物理内存不足的问题 |
辅存存储空间分配
链接分配
从上图来看
- 隐式存储的下一个访问块地址存储到当前访问块中
- 隐式访问适合顺序访问,随机访问的效率相当低
- 隐式访问的容错率相当的低,中间有一个节点发生故障,存储的文件就要出错
链式分配可以形成一个表,每个字块对应下一个访问块的地址,这个就是FAT(File Allocation Table)格式
索引分配
索引分配就相当于,每个块中有个索引记录那些块一起访问,比如2这个块记录了N个块,1,3,4,5,6,7,8.。。。