本讲内容:
1.进程的并发执行
2.进程互斥
3.进程同步
4.信号量及PV操作
5.经典的IPC问题
1.进程的并发执行
并发→所有问题产生的基础
并发→操作系统设计的基础
进程的特征所带来的问题:
并发→进程的执行是间断性的;进程的相对执行速度不可预测
共享→进程/线程之间的制约性
不确定性→进程执行的结果与其执行的相对速度有关,是不确定的
这些问题会导致正常的运行顺序被打乱,从而导致结果的不正确
2.进程互斥
竞争条件(RACE CONDITION)
竞争条件:两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序
竞争条件所带来的错误结果↓↓↓↓↓↓
进程互斥(MUTUAL EXCLUSIVE)
各进程之间 竞争使用这些资源,而这些资源具有排他性——这一关系成为进程互斥
临界资源:critical resource
资源——一次只允许一个进程使用——临界资源/互斥资源/共享变量
临界区(互斥区):critical section(region)
各个进程中的某一段代码都对某一个共享资源进行操作,那么各个进程中的这段代码互为临界区/互斥区
3.进程互斥的软件解决方案
DEKKER算法
美[ˈdɛkər]
1965年,第一个解决临界区保护问题的算法
PETERSON算法
美[ˈpitərsən]
假设1和0都想进入临界区,0先把1赋值给turn
假如进程0先想进入临界区→turn=process=0;紧接着进程1也想进入临界区turn=process=1。这时turn1,之前turn=0被覆盖掉了。在进程0里,while(turnprocess==0)与目前的turn值不相等,所以跳出循环进入临界区。
4.进程互斥的硬件解决方案
硬件解法1——中断屏蔽方法
“开关中断”指令
优点:简单,高效
缺点:代价高,限制CPU并发能力(临界区大的进程);只针对单个处理器,不适用于多处理器;适用于操作系统本身,不适用于用户进程。
硬件解法2——“测试并加锁”指令
TSL指令:TEST AND SET LOCK
硬件解法3——"交换"指令
XCHG指令:EXCHANGE
小结
软件方法
带来一定的开销
对编程技巧要求高
硬件方法
开关中断指令、“”测试并加锁“指令、”交换“指令
忙等待(busy waiting)
进程在得到临界区访问权之前,持续测试而不做其他事情
在单处理器系统中不适用
但是到了多处理器时,为了减少切换带来的开销,就让一个进程某一个cpu上一直测试(自旋),就形成一众锁——自旋锁 Spin lock(多处理器√)
优先级反转(倒置)
基于优先级的抢占调度
5.进程同步
进程同步:synchronization
指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务
具体地说,一个进程运行到某一点时,要求另一伙伴进程为它提供消息,在未获得消息之前,该进程进入阻塞态,获得消息后被唤醒进入就绪态
生产者消费者问题
避免忙等待——用 睡眠 与 唤醒 操作
用 睡眠 与 唤醒 操作来避免忙等待,没有完全解决生产者消费者问题
在判断if(count==0)还没有调用sleep()之前,消费者被切换下cpu,生产者做wakeup(consumer),而生产者本来就在唤醒状态。当生产者被切换下cpu,消费者上cpu首先做sleep(),刚才生产者wakeup()已经完成了,所以消费者不会被唤醒
6.信号量及PV操作
——一种经典的进程同步机制
同步机制——我们通常把进程的互斥看成是一种特殊的同步
信号量是一个特殊变量
用于进程间传递信息的一个整数值
对信号量可以实施的操作:初始化、P和V
P、V操作定义
P操作:给信号量-1,判断信号量是否<0,若<0则将该进程设置为阻塞态,并将其插入到响应的等待队列末尾;若不<0,则继续执行该进程。
V操作:给信号量+1,判断信号量是否<=0,若是则证明原来的信号量上有进程在等,唤醒相应等待队列中等待的一个进程,改变其状态为就绪态,并将其插入就绪队列
7.生产者消费者问题
同步:对同一个信号量的P操作和V操作是分散在两个不同进程里头。
8.读者写者问题
用信号量解决读者/写者问题
解决读写不能同时进行的问题👇
解决多个读者同时读的问题👇