操作系统第二章(进程、线程、调度和死锁)

进程的组成

程序段、数据段和PCB

PCB(和管理有关)

本质:和进程管理有关的都存放在PCB中,程序本身运行所需数据在程序段和数据段中
操作系统第二章(进程、线程、调度和死锁)_第1张图片

进程的特征(与程序的区别)

操作系统第二章(进程、线程、调度和死锁)_第2张图片

小结(进程的定义、组成、组织方式、特征)

操作系统第二章(进程、线程、调度和死锁)_第3张图片

进程的状态与转换(五状态模型)

三种基本状态:运行态、就绪态(万事俱备、只欠CPU)、阻塞态
创建态(新建态)、终止态(结束态)
操作系统第二章(进程、线程、调度和死锁)_第4张图片
操作系统第二章(进程、线程、调度和死锁)_第5张图片
操作系统第二章(进程、线程、调度和死锁)_第6张图片

进程状态小结

操作系统第二章(进程、线程、调度和死锁)_第7张图片

进程控制(实现进程状态的转换)(原语)

进程控制示意图

操作系统第二章(进程、线程、调度和死锁)_第8张图片

进程控制相关原语(创建,终止,阻塞及唤醒原语)

操作系统第二章(进程、线程、调度和死锁)_第9张图片
操作系统第二章(进程、线程、调度和死锁)_第10张图片
操作系统第二章(进程、线程、调度和死锁)_第11张图片

进程通信

操作系统第二章(进程、线程、调度和死锁)_第12张图片

共享存储

操作系统第二章(进程、线程、调度和死锁)_第13张图片

消息传递

操作系统第二章(进程、线程、调度和死锁)_第14张图片

管道通信

没写满不允许读,没读空不允许写
操作系统第二章(进程、线程、调度和死锁)_第15张图片

操作系统第二章(进程、线程、调度和死锁)_第16张图片

线程

同一个进程被分为多个线程,增加并发度。
程序执行流的最小单位,轻量级进程

操作系统第二章(进程、线程、调度和死锁)_第17张图片
操作系统第二章(进程、线程、调度和死锁)_第18张图片
操作系统第二章(进程、线程、调度和死锁)_第19张图片

线程的属性

同一进程内的线程切换,不会引起进程切换
不同进程中的线程切换,会引起进程切换
操作系统第二章(进程、线程、调度和死锁)_第20张图片

线程的实现方式(用户级线程、内核级线程)

用户级线程:从用户角度可以看到的线程,对操作系统来说用户级线程是透明的
(同理内核级线程)

重点:操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位
操作系统第二章(进程、线程、调度和死锁)_第21张图片
操作系统第二章(进程、线程、调度和死锁)_第22张图片
重点:操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位
操作系统第二章(进程、线程、调度和死锁)_第23张图片

多线程模型

多对一:多个用户级线程映射到一个内核级线程(开销小)(易阻塞)
一对一:一个用户级线程映射到一个内核级线程(并发能力强)(线程管理成本高开销大)
多对多:n映射到m(n大于等于m)(克服上述二者缺点)
操作系统第二章(进程、线程、调度和死锁)_第24张图片
操作系统第二章(进程、线程、调度和死锁)_第25张图片
操作系统第二章(进程、线程、调度和死锁)_第26张图片

线程概念和多线程小结

操作系统第二章(进程、线程、调度和死锁)_第27张图片

调度

同时有很多事情要处理,需要确定某种规则决定处理任务的顺序
处理机调度:进程数量大于处理机数量,那么从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行,以实现进程的并发执行

高中低级调度

高级调度(作业调度)

高级调度(作业调度):按照一定的原则从外存上处于后备队列的作业中挑选(一个或多个)作业,为其分配内存资源并建立相应进程(建立PCB)
操作系统第二章(进程、线程、调度和死锁)_第28张图片

中级调度(内存调度)

中级调度(内存调度):决定将哪个处于刮起状态的进程重新调入内存。(引入了虚拟存储技术后,可将暂时不能运行的进程调至外存等待,即调出的进程处于挂起状态
操作系统第二章(进程、线程、调度和死锁)_第29张图片

低级调度(进程调度

操作系统第二章(进程、线程、调度和死锁)_第30张图片

三层调度的联系对比总结

操作系统第二章(进程、线程、调度和死锁)_第31张图片

进程的七状态模型(包含两种挂起态)

挂起和阻塞的区别

挂起态是进程映像调到外存,阻塞态是进程映像还在内存中
操作系统第二章(进程、线程、调度和死锁)_第32张图片

(处理机)调度的回顾总结

操作系统第二章(进程、线程、调度和死锁)_第33张图片

进程调度的时机

操作系统第二章(进程、线程、调度和死锁)_第34张图片

进程调度的方式

操作系统第二章(进程、线程、调度和死锁)_第35张图片

进程的切换与过程

注意区分广义和狭义上的进程调度

进程切换是有代价的,物极必反,不是越频繁越好,效率降低

操作系统第二章(进程、线程、调度和死锁)_第36张图片

进程调度,切换与过程、方式的小结

操作系统第二章(进程、线程、调度和死锁)_第37张图片

调度算法评价指标

操作系统第二章(进程、线程、调度和死锁)_第38张图片
CPU利用率
操作系统第二章(进程、线程、调度和死锁)_第39张图片
系统吞吐量
操作系统第二章(进程、线程、调度和死锁)_第40张图片
周转时间,带权周转时间(必然大于等于1),越小越好
等待时间
操作系统第二章(进程、线程、调度和死锁)_第41张图片

调度算法(一)

操作系统第二章(进程、线程、调度和死锁)_第42张图片

先来先服务(FCFS,First Come First Serve)

即按照到达的先后顺序调度,事实上等待时间越久的越优先得到服务

对于短进程来说体验不好,如奶茶店买奶茶,你买一杯,前面的人买20杯
操作系统第二章(进程、线程、调度和死锁)_第43张图片

短作业优先(SJF)

分为非抢占式短作业优先和抢占式短作业优先
即每次调度时选择当前已到达运行时间最短的作业/进程
操作系统第二章(进程、线程、调度和死锁)_第44张图片
操作系统第二章(进程、线程、调度和死锁)_第45张图片

FCFS和SJF两种算法对比

操作系统第二章(进程、线程、调度和死锁)_第46张图片

高响应比优先(HRRN)

同时考虑了进程的等待时间和要求服务时间
HRRN是非抢占式,只有进程主动放弃CPU时,才需要进行调度
操作系统第二章(进程、线程、调度和死锁)_第47张图片
操作系统第二章(进程、线程、调度和死锁)_第48张图片

三种调度算法总结

操作系统第二章(进程、线程、调度和死锁)_第49张图片

调度算法(二)(适用于交互式系统)

操作系统第二章(进程、线程、调度和死锁)_第50张图片

时间片轮转(RR,Round Robin)

注意:
1.时间片不能太大:如果时间片太大,该算法退化为先来先服务算法,并且会增大进程响应时间
2.时间片太小,进程切换过于频繁,效率低(一般来说,设计时间片要让切换进程的开销占比不超过1%)

对于那些时间片到达但是还没执行完的进程,会进入就绪队列依次排队等待继续执行
当进程执行完但时间片还没用完时,该进程会主动放弃处理机,发生调度
操作系统第二章(进程、线程、调度和死锁)_第51张图片
例题:时间片大小为2
操作系统第二章(进程、线程、调度和死锁)_第52张图片

优先级调度算法

分为抢占式优先级调度算法和非抢占式优先级调度算法
就绪队列可能不唯一;优先级可分为静态(创建进程时确定,之后不变)和动态(有初始值,并后来不断调整)
操作系统第二章(进程、线程、调度和死锁)_第53张图片

非抢占式优先级调度算法

操作系统第二章(进程、线程、调度和死锁)_第54张图片

抢占式优先级调度算法

操作系统第二章(进程、线程、调度和死锁)_第55张图片

优先级调度算法补充

操作系统第二章(进程、线程、调度和死锁)_第56张图片

多级反馈队列调度算法(对所有算法的折中权衡)

操作系统第二章(进程、线程、调度和死锁)_第57张图片
例题:
操作系统第二章(进程、线程、调度和死锁)_第58张图片

调度算法(二)三种算法总结

操作系统第二章(进程、线程、调度和死锁)_第59张图片

进程同步与进程互斥

进程同步(直接制约关系)

进程同步:要让各并发进程按要求有序地推进(因为进程的异步性导致两个进程交替推进的次序是不确定的)
个人理解:为了解决进程并发运行带来的异步问题,为了实现某些应用需求,必须协调某些进程的工作次序
举例:
要实现女一号和女二号想法的需求,则必须有指令先后顺序的需求,才能实现想法
操作系统第二章(进程、线程、调度和死锁)_第60张图片

进程互斥(访问临界资源,间接制约关系)

第二个想访问临界资源的进程必须等第一个访问临界资源的进程结束并释放该资源后,第二个进程才可以访问
操作系统第二章(进程、线程、调度和死锁)_第61张图片
进入(上锁),访问,退出(解锁),其他操作
操作系统第二章(进程、线程、调度和死锁)_第62张图片

进程同步与互斥小结

操作系统第二章(进程、线程、调度和死锁)_第63张图片

进程互斥的软硬件实现方法(结合代码)(没看)

操作系统第二章(进程、线程、调度和死锁)_第64张图片
操作系统第二章(进程、线程、调度和死锁)_第65张图片

信号量机制

解决进程互斥,进程同步的问题
分为整型信号量和记录型信号量
信号量:一个变量,表示系统中某种资源的数量
原语:此处的wait(s)申请资源可记为P(s) 和 signal(s)可记为V(s)释放资源原语用于操作信号量
wait(s) signal(s)相当于两个函数,s相当于参数,通过s加一或减一的结果,记录系统中某个可用资源(如打印机的数量),如果没有可用的则进程进入等待队列
操作系统第二章(进程、线程、调度和死锁)_第66张图片

整型信号量

操作系统第二章(进程、线程、调度和死锁)_第67张图片

记录型信号量

操作系统第二章(进程、线程、调度和死锁)_第68张图片
操作系统第二章(进程、线程、调度和死锁)_第69张图片

整型信号量和记录型信号量小结(PV操作)

操作系统第二章(进程、线程、调度和死锁)_第70张图片

信号量实现进程互斥、同步和前驱关系

mutex, mutex1, mutex2相当于自己设的3个信号量(变量),如记录打印机,摄像头等资源

进程互斥的信号量可以设初值为1(即临界资源只可同时给1个进程使用)
操作系统第二章(进程、线程、调度和死锁)_第71张图片

信号量实现进程同步(信号量初始值设为0)
下图中右侧文字的两种情况都可以实现预期功能(即代码4一定在代码2后执行)
操作系统第二章(进程、线程、调度和死锁)_第72张图片
信号量机制实现前驱关系(复杂的同步关系)
操作系统第二章(进程、线程、调度和死锁)_第73张图片

信号量实现进程同步、互斥前驱关系的小结

操作系统第二章(进程、线程、调度和死锁)_第74张图片

经典进程同步互斥问题

生产者-消费者问题

生产者消费者问题代码实现

操作系统第二章(进程、线程、调度和死锁)_第75张图片
操作系统第二章(进程、线程、调度和死锁)_第76张图片
操作系统第二章(进程、线程、调度和死锁)_第77张图片

多生产者-多消费者问题(多指多类)

多类生产者生产的产品和消费者消费的产品,而不是多个

例子:
儿子或女儿会触发一个事件(使盘子为空),才允许父亲或母亲向盘子里放水果

实现:
操作系统第二章(进程、线程、调度和死锁)_第78张图片

操作系统第二章(进程、线程、调度和死锁)_第79张图片

吸烟者问题

操作系统第二章(进程、线程、调度和死锁)_第80张图片
操作系统第二章(进程、线程、调度和死锁)_第81张图片

读者写者问题

写进程和任何其他进程(包括读进程和写进程)都互斥两个读进程可以
读写一起:可能读进程读到的并不是自己想读的进程(而是写进程新写的进程)
两个写:数据覆盖
操作系统第二章(进程、线程、调度和死锁)_第82张图片
rw:read 和 write

多个读进程读的时候,第一个读进程要进行加锁操作(防止写进程干扰),之后的读进程则直接读即可(不用再加锁),读工作结束后最后一个读进程要执行解锁操作

存在的问题:
操作系统第二章(进程、线程、调度和死锁)_第83张图片
操作系统第二章(进程、线程、调度和死锁)_第84张图片
操作系统第二章(进程、线程、调度和死锁)_第85张图片
操作系统第二章(进程、线程、调度和死锁)_第86张图片

哲学家就餐问题(解决进程死锁)

每个哲学家进程需要同时持有两个临界资源(左右两边的筷子),才能开始吃饭

管程(类似于 类,封装的思想)

是用来实现进程的互斥和同步的
为了避免因为使用信号量机制编写程序困难易出错的问题(不用再关注复杂的PV操作),而引入了管程——一种高级同步机制
操作系统第二章(进程、线程、调度和死锁)_第87张图片
编译器负责互斥的进入管程中的过程(即相当于调用类中的各个操作缓冲区产品的函数)如下图中的insert和remove函数
操作系统第二章(进程、线程、调度和死锁)_第88张图片
操作系统第二章(进程、线程、调度和死锁)_第89张图片

操作系统第二章(进程、线程、调度和死锁)_第90张图片

管程小结

操作系统第二章(进程、线程、调度和死锁)_第91张图片

死锁

死锁、饥饿、死循环的区别

死锁产生的必要条件

什么时候会发生死锁

总之,对不可剥夺资源的不合理分配,可能导致死锁
操作系统第二章(进程、线程、调度和死锁)_第92张图片

死锁小结

循环等待未必死锁,死锁一定有循环等待
操作系统第二章(进程、线程、调度和死锁)_第93张图片

死锁的处理策略(预防、避免和检测解除)

操作系统第二章(进程、线程、调度和死锁)_第94张图片

死锁的处理策略——预防死锁

1.破坏互斥条件(很多时候无法使用此方法)(SPOOLING技术)
2.
3.
4.破坏循环等待条件
操作系统第二章(进程、线程、调度和死锁)_第95张图片

死锁的处理策略——避免死锁(安全序列,不安全状态)

安全序列

操作系统第二章(进程、线程、调度和死锁)_第96张图片

银行家算法

最大需求,已分配,最多还需要
(可以逐个进程分配资源,只要不死锁即可)

操作系统第二章(进程、线程、调度和死锁)_第97张图片
操作系统第二章(进程、线程、调度和死锁)_第98张图片

银行家算法代码实现


操作系统第二章(进程、线程、调度和死锁)_第99张图片

死锁的处理策略——检测和解除(资源分配图)

死锁检测算法:依次消除与不阻塞进程相连的边,直到无边可消
绿色边表示之前已经分配出去的,此时再看剩下的资源还是否满足蓝色边的申请。
如果某一个进程P1或P2已经执行完,则可以将与该节点相连的所有边都划掉
操作系统第二章(进程、线程、调度和死锁)_第100张图片
操作系统第二章(进程、线程、调度和死锁)_第101张图片
操作系统第二章(进程、线程、调度和死锁)_第102张图片
操作系统第二章(进程、线程、调度和死锁)_第103张图片

你可能感兴趣的:(OS)