操作系统总结
第一章 操作系统概述
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
OS模型
OS作为接口的示意图
-
操作系统基本特性:并发,共享,虚拟,异步
并发与并行:并发是多个事件在同一时间段内发生,并行是同一时刻,操作系统的并发性是指同时存在多个进程
共享:即多个并发进程同时使用系统资源,有互斥共享和同时共享(同时往往是宏观的)
并发与共享互为存在,失去并发无谓共享,失去共享无法并发
虚拟:指将一个物理实体抽象为多个逻辑实体,有时分复用和空分复用,没有并发无需虚拟
异步:指多个程序并发执行,由于资源有限,进程的执行不是一贯到底而是走走停停,以不可预知的顺序向前推进 -
运行机制和体系结构:
两种状态:用户态和内核态(由程序状态寄存器PSW中某标志位来表示处理器当前所处状态),
两种指令:特权指令(运行在内核态),非特权指令(运行在用户态)
两种程序:用户程序和内核程序
体系结构:大内核(高性能但内核代码庞大难以维护,包括进程管理、存储器管理、设备管理等和微内核)和微内核(包括时钟管理、中断处理、原语)。原语是一种特殊程序,如设备驱动,CPU切换等,具有原子性 -
中断
目的:是为了实现程序并发执行,因为中断是用户态→核心态的唯一途径
分类:外中断(外设请求,人工干预)和内中断(也叫异常,有陷入,故障,终止)
第二章 进程和线程
1. 进程
定义:也叫进程实体,运行中的程序,是系统进行资源分配和调度的独立单位(各进程的内存地址相互独立)
组成:由程序段,数据段,PCB组成,其中PCB包括进程描述(PID,UID),进程控制和管理(当前状态和优先级),资源分配清单,处理机信息等
组织方式:索引和链接
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210413212321440.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNjM4MTI0,size_16,color_FFFFFF,t_70)链接组织
索引组织
特点:动态性,并发性,独立性,异步性
进程状态图和进程控制
进程状态图
补充:七状态模型另外加上就绪挂起和阻塞挂起,挂起是调到外存,阻塞在内存
进程控制:通过原语控制(进程的创建、终止、阻塞、唤醒、切换等),如图
原语是通过关中断和开中断指令实现其原子性(即不可被中断),要做到的有三类事:1.更新PCB信息,包括修改进程状态标志位、保存和恢复运行环境 ;2.将PCB插入合适队列;3.分配/回收资源
引起进程创建的事件:用户登录,作业调度,提供服务,应用请求等
引起进程终止的事件:正常结束,异常结束,外界干预
引起进程阻塞的事件:等待资源或合作进程完成工作
引起进程唤醒的事件:等待事件的发生(与阻塞原语成对使用)
引起进程切换的事件:时间片到,更高优先级进程到达,主动阻塞,终止
**进程通信三种方式**
1. 共享存储:通过共享空间进行通信,分基于数据结构(共享空间为指定数据结构)和基于存储区两种
2. 信息传递:以格式化的消息进行数据交换,设置消息缓冲队列,由操作系统提供发送/接收消息两个原语实现,分直接通信和间接通信(通过信箱)
3. 管道通信:其实就是在内存中开辟一个固定大小缓冲区
一个进程不能直接访问另一个进程的地址空间
2. 线程
定义:是一个基本的CPU执行单位也是程序执行的最小单位
属性:提高系统并发度,使得一个进程内也可以并发处理各个任务,引入线程,进程只作为系统资源的分配单位,线程是调度单位,如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210413223556371.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNjM4MTI0,size_16,color_FFFFFF,t_70#pic_center)
实现方式:用户级线程(对操作系统透明,多对一),内核级线程(一个用户级线程对应一个内核级线程,一对一),两者组合(多对多),内核级线程才是处理机分配的单位
3. 处理机调度
三个层次:注意在中断和原子操作中以及在内核程序临界区中不能进行进程调度
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210413224755748.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNjM4MTI0,size_16,color_FFFFFF,t_70#pic_center)
进程调度两种方式:抢占式和非抢占式
调度算法
4. 进程同步和互斥
同步: 也叫直接制约关系,协调多个进程的执行顺序
互斥:也叫间接制约关系,指的是对临界资源的访问必须互斥,即一次只能一个进程访问临界资源,对临界资源的互斥访问在逻辑上分为进入区,临界区,退出区,剩余区四部分,如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210414102022230.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNjM4MTI0,size_16,color_FFFFFF,t_70#pic_center)
进程互斥四个原则
1.空闲让进
当临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
2.忙则等待
当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
3.有限等待
对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)。
4.让权等待
当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
进程互斥实现方法:软件,硬件,信号量机制
软件:单标志法,双标志先检查,双标志后检查,peterson
硬件:中断屏蔽方法(开关中断指令),TS指令,swap指令
信号量机制:
信号量其实就是一个变量,可以用来表示系统中某资源的数量,使用一对原语wait(S)和signal(S)对信号量进行操作(解决了软件方法进入区的各种操作无法一气呵成的问题),wait和signal原语简称P,V操作,原语可以理解为函数,信号量S就是参数,对信号量的操作只有初始化,P操作和V操作,执行P操作S减一,执行V操作S加一。
信号量分类:整数型和记录型(成员有剩余资源数和等待队列,解决整数型存在的忙等问题)
信号量机制实现同步,互斥,前驱:
5.管程
引入目的:
为了解决信号量机制存在的问题:编写程序困难,易出错,如P操作的顺序弄反等
**定义:**可视为一种高级同步机制,是封装好的类,由4部分组成:1.局部于管程的共享数据结构说明;2.对该数据结构的一系列操作函数;3.对共享数据初始化;4.管程名
**特点:**管程数据只能由管程函数访问,每次只允许一个进程在管程内执行某个函数
**工作原理:**由编译器负责实现各进程互斥的进入管程中的过程(即每次只开放一个函数入口),在管程中设置条件变量和等待/唤醒操作以解决同步问题。
以管程解决生产者和消费者问题:
monitor ProducerConsumer
condition full,empty;//条件变量实现同步(排队)
int count=0;//缓冲区的产品数
void insert(Item item){ //把产品放入缓冲区,item表示一个产品
if (count==N)
wait(full);//等待原语
count++;
insert_item(item);//将产品放入缓冲区
if(count==1) //检查该产品是否是第一个放入缓冲区
signal(empty);//唤醒原语
}
Item remove(){ //从缓冲区取出产品
if(count==0)
wait(empty);
count--;
if (count==N-1)
signal(full);
return remove_item();
}
end monitor
这里定义的共享数据结构是缓冲区,生产者进程只需调用ProducerConsumer.insert(item)即可往缓冲区放入一个产品,同理,消费者进程调用ProducerConsumer.remove(item)即可取出一个产品。
第三章 死锁
**定义:**各个进程互相等待对方占用的资源,导致各个进程都阻塞的现象,饥饿是指某个进程长期得不到资源而无法推进。
四个必要条件:
1.互斥条件:对互斥资源的争抢
2.不剥夺条件:进程资源不可被剥夺
3.请求和保持条件:进程至少保持了一个资源并提出了新的资源请求,即使被请求资源已被占用也对自己资源保持不放
4.循环等待条件:存在进程资源的循环等待链
**发生时机:**对不可剥夺资源的不合理分配可能导致死锁
处理策略:
1.预防:破坏四个必要条件中的一个或多个
a.互斥条件:将互斥资源改造为共享使用,如spooling技术(另外设置一个输出进程对互斥资源进行管理,则请求资源的进程只需将请求交付输出进程即可,由输出进程负责管理这些请求依次使用互斥资源),缺点是很多时候无法对互斥资源进行改造
b.不剥夺条件:强行剥夺或主动释放。缺点是实现复杂,只适用于易保存和易恢复状态的资源(如CPU),反复申请和释放资源会增加系统开销,可能导致进程饥饿。
c.请求和保持条件:采用静态分配法(即一次性分配进程需要的所有资源),缺点是资源利用率低,可能有饥饿现象
d.循环等待条件:采用顺序资源分配法(即给所有资源编号,每个进程只能按编号递增的顺序请求资源,编号相同资源一次申请完,此时持有大编号资源的进程不会逆向申请小编号资源,故不会循环等待),缺点是编号麻烦,不利于扩展
2.避免死锁:防止系统进入不安全状态,银行家算法
安全序列:指的是系统按此序列分配资源,则每个进程都能顺利完成。只要能找到一个安全序列,系统就是安全状态,一定不会死锁。
银行家算法:核心思想是在资源分配前预先判断此次分配是否会导致系统进入不安全状态再决定是否答应资源分配请求。
安全性算法:检查当前可用资源是否能满足某个进程的最大需求,如果可以,就把进程加入安全序列并把该进程资源回收,一直重复,看最终是否所有进程都能加入安全序列。
3.死锁的检测和解除
死锁检查:
死锁解除:1.资源剥夺法。剥夺某些死锁进程资源,将其暂时挂起;2.终止死锁进程;3.让死锁进程回退到可以避免死锁的地步,即设置还原点;