信号量与管程

基本同步方法:
在这里插入图片描述

信号量和管程是操作系统提供的两种同步方法
多线程并发导致了资源竞争这样的并发问题,这时候需要协调多线程对共享数据的访问,要求任何时刻只能有一个线程执行临界区代码,也就是同步。确保同步正确的方法有底层硬件上的实现和高层次的编程抽象,信号量和管程就是其中两个高层次的编程方法。

信号量(semaphore):(由Dijkstra提出)
信号量是操作系统提供的一种协调共享资源访问的方法
软件同步是平等线程间的一种同步协商机制
OS是管理者,地位高于进程,由OS来进行资源的协调分配
用信号量表示系统资源的数量

信号是一种抽象数据类型
1.由一个整形(sem)变量和两个原子操作组成
—P()(P操作(Prolaag)(荷兰语尝试减少))
sem减1
如果sem<0,进入等待,否则继续
—V()(V操作(Verhoog)(荷兰语增加))
sem加1
如果sem<=0,唤醒一个等待进程

信号量的特性:
1.信号量是被保护的整数变量
初始化完成后,只能通过P()和V()操作修改该整数变量
由操作系统保证,PV操作是原子操作
2.P()可能阻塞,V()不会阻塞
3.通常假定信号量是“公平的”
线程不会被无限期阻塞在P()操作
假定信号量等待按先进先出排队

信号量的实现:
在这里插入图片描述

信号量的使用:
信号量可以分为两类:
1.二进制信号量:资源数目为0或1
2.资源信号量:资源数目为任何非负数
信号量的使用也可以分为两种:
1.互斥访问(临界区的互斥访问控制)
每类资源设置一个信号量,其初值为1
mutex = new Semaphore(1);
mutex->P();
Critical Section;
Mutex->V();
注意:必须成对使用PV操作,次序不能颠倒
2.条件同步(线程间的事件等待)
条件同步设置一个信号量,其初值为0
condition = new Semaphore(0);
假设A完成执行需要以B的执行结果为条件 ,那么
在线程A中进行P操作,线程B中进行V操作
当线程B执行完成后,A才能拿到资源进行执行,若B未进行V操作,线程A因为拿不到资源,条件不满足,所以无法完成执行。

生产者消费者问题:
在这里插入图片描述
问题分析:
任何时刻只有一个线程操作缓冲区(互斥访问)
缓冲区空时,消费者必须等待生产者(条件同步)
缓冲区满时,生产者必须等待消费者(条件同步)
用信号量描述每个约束
二进制信号量mutex
资源信号量fullBuffers
资源信号量emptyBuffers
在这里插入图片描述

管程:
改进信号量处理临界区时的麻烦,PV操作配对比较麻烦,把配对的PV操作集中到一起,就出现了管程。
一种并发程序的编程方法。
管程(Monitor)是一种用于多线程互斥访问共享资源的程序结构。采用面向对象的方法,简化了线程间的同步控制,任何一个时刻最多只有一个线程执行管程代码,正在管程中的线程可临时放弃管程的互斥访问,等待事件出现时再恢复(和临界区的区别)
管程的使用:再对象/模块中,收集相关共享数据;定义访问共享数据的方法

管程的组成:
一个锁:控制管程代码的互斥访问
0个或多个条件变量:管理共享数据的并发访问
在这里插入图片描述
条件变量(Condition Variable):
条件变量是管程内的等待机制。进入管程内因资源被占用而进入等待状态,就等待在这个条件变量上;每个条件变量表示一种等待原因,对应一个等待队列
Wait()操作:将自己阻塞在等待队列中,唤醒一个等待者或释放管程的互斥访问
signal()操作:将等待队列中的一个线程唤醒;如果等待队列为空,则等同于空操作
条件变量实现:
在这里插入图片描述

哲学家就餐问题:
在这里插入图片描述
问题描述:5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作有思考和就餐,就餐时同时拿起左右两边的筷子,思考时将两支筷子放回原处。
如何让保证哲学家们的动作有序进行?
用信号量来解决,方法如下:
在这里插入图片描述

读写者问题:
问题描述:共享数据的两类使用者;读者:只修改数据,不修改;写者:读取和修改数据
同一时刻允许多个读者同时读
没有写者时才能读,没有读者时才能写
同一时刻不允许多个写着同时写
(读读允许,读写互斥,写写互斥)

用信号量解决读写者问题:
用信号量描述每个约束:
信号量WriteMutex:控制读写操作的互斥;初始化为1
读者计数Rcount:正在读的读者个数,初始化为0
信号量:CountMutex:控制对Rcount的互斥修改,初始化为1
在这里插入图片描述
以上解决方法是读者优先的,只要有读者正在读,后来的读者都能直接进入。如果读者持续不断进入,则写着就处于饥饿状态。(当然也有写者优先)

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值