首页 > 其他 > 详细

信号量与管程

时间:2020-01-18 17:24:34      阅读:87      评论:0      收藏:0      [点我收藏+]

一、信号量

1. 信号量是操作系统提供的一种协调共享资源访问的方法,用信号量表示系统资源的数量。

信号量是一种抽象数据类型,由一个整形(sem)变量和两个原子操作组成。

2. 这两个原子操作分别是

  • P()(Prllaag:荷兰语,尝试减少)
  1. sem减一
  2. 若sem<0,进入等待,否则继续
  • V()(Verhoog:荷兰语,增加)
  1. sem加一
  2. 若sem≤0,唤醒一个等待进程

3. 信号量的特性

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

4. 信号量的实现

技术分享图片

 

二、信号量的使用

1. 信号量分类,可分为两种信号量

  • 二进制信号量:资源数目为0或1
  • 资源信号量:资源数目为任何非负值

两者等价,基于一个可以实现另一个。

2.用信号量实现临界区的互斥访问

每个临界区设置一个信号量,其初值为1。

技术分享图片

 必须成对使用P()操作和V()操作

  • P()操作保证互斥访问临界资源
  • V()操作在使用后释放临界资源
  • PV操作不能次序错误,重复或遗漏

 3.用信号量实现条件同步

技术分享图片

 

 同步:合作的并发进程需要按先后次序执行。例如:一个进程的执行依赖于合作进程的消息或信号。当一个进程没有得到来自合作进程的消息或信号时需阻塞等待,直到消息或信号到达才唤醒。

4. 消费者-生产者问题

技术分享图片

 

 有界缓冲区的生产者-消费者问题描述

  • 一个或多个生产者在生成数据后放在一个缓冲区里
  • 单个消费者从缓冲区取出数据处理
  • 任何时刻只能有一个生产者或者消费者可访问缓冲区

5. 用信号量解决生产者-消费者问题

问题分析:

  • 任何时候时刻只能有一个线程操作缓冲区(互斥访问)
  • 缓冲区空时,消费者必须等待生产者(条件同步)
  • 缓冲区满时,生产者必须等待消费者(条件同步)

用信号量描述每个约束:

  • 二进制信号量mutex
  • 资源信号量fullBuffers
  • 资源信号量emptyBuffers

技术分享图片

实现过程:

信号量与管程

原文:https://www.cnblogs.com/cjsword/p/12209302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!