信号量与管程也是进程间通信的方式。信号量是与锁在同一层级实现的,是操作系统提供的一种协调共享资源访问的方法。信号量由操作系统管理,操作系统作为管理者地位是高于进程的。

一、信号量

1、信号量(semaphore):是操作系统提供的一种协调共享资源访问的方法

①信号是一种抽象数据结构

  • 一个整型int(sem),可进行两个原子操作
  • P(): sem–,如果sem<0,等待,否则继续,类似lock_acquire
  • V(): sem++,如果sem<=0,说明当前有等着的,唤醒挂在信号量上的进程,可以是一个,可以是多个

②信号量的特性

  • 信号量是被保护的整数变量。初始化完成后,只能通过P()V()操作修改;由操作系统保证,PV操作时原子操作。
  • P()可能阻塞,V()不会阻塞
  • 通常假定信号量是公平的,线程不会无线阻塞在P操作,可以假定信号量等待时按照先进先出排队的。而自旋锁是无法实现先进先出的,因为它需要占用CPU资源不停查询锁是否空闲,无法指定进入临界区的顺序。

2、信号量的实现

二、信号量使用

1、信号量分两种类型:

  • 二进制信号量:约等于锁,取值0 or 1
  • 资源信号量:资源数目任何非负值
  • 两者其实是等价的,可以基于一个构造出另一个

信号量的使用有两种情况:

  • 互斥访问比如临界区的互斥访问控制、
  • 条件同步比如线程间的条件等待。互斥访问如下图

3、生产者—消费者问题

生产者——>缓冲区——>消费者

①问题描述

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

②问题分析:

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

③信号量描述各个约束

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

如下图是利用信号量实现的生产者消费者模型。生产者消费者模型的要求是同一时刻只能有一个生产者或消费者访问缓冲区,生产者只能在缓冲区有空间时才能往里塞数据,消费者只有缓冲区有数据时才能从里面消费数据。


三、管程

管程是一种用于多线程互斥访问共享资源的程序结构,采用面向对象的方法,简化线程间的同步控制,保证任意时刻最多只有一个线程执行管程代码,管程与临界区的区别是在管程中的线程可临时放弃管程的互斥访问,等待事件出现时恢复,而临界区只有线程退出临界区才能放弃互斥访问。

管程与临界区结构上差别在于多了共享数据,共享数据作为条件变量,如果条件变量的数量为0则跟临界区完全一样。进入管程的线程因资源被占用而进入等待状态,每个条件变量表示一种等待原因,对应着一个等待队列。管程最重要的两个操作:wait()和Signal(),wait将自身阻塞在等待队列中,唤醒一个等待者或释放管程的互斥访问,Signal操作将等待队列中的一个线程唤醒,如果等待队列为空,则等同空操作。

条件变量(condition variab)

  1. 条件变量是管程内的等待机制:进入管程的线程因资源被占用而进入等待状态;每个条件变量表示一种等待原因,对应一个等待队列;
  2. wait() 操作:将自己阻塞在等待队列中,唤醒一个等待者或释放管程的互斥访问;
  3. signal()操作:将自己队列中的一个线程唤醒;如果等待队列为空,则等同空操作;

调用管程解决消费者生产者问题

count记录了当前BUFFER的数据个数

先在前后加锁,因为要保证只有一个线程在临界区 lock在等待/睡眠的时候通过;lock->Acquire()管程进入和lock->Release()管程释放;notfull.wait(&lock)释放锁。唤醒后获得锁。

2、管程条件变量的释放处理方式

管程条件变量释放处理方式有两种如下图。可以看到Hoare的管程方式是更符合实际使用效果的,但是Hansen管程实现方式少了一次进程上下文切换,因此真实OS中一般使用Hansen管程方式。

清华大学《操作系统》(十八):管程于信号量相关推荐

  1. ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能

    ROS探索总结(十六)--HRMRP机器人的设计 1. HRMRP简介         HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台 ...

  2. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    原文:学习ASP.NET Core Razor 编程系列十八--并发解决方案 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP. ...

  3. 林子大了,什么鸟都有----.NET运用String的十八层境界

    林子大了,什么鸟都有----.NET运用String的十八层境界 在上一文中,提到了一句相当常见但十分荒谬的代码:Request.QueryString["id"].ToStrin ...

  4. 罗永浩:我今年四十八岁,还可以承受无数次的失败;iOS14 或将推出系统级「小程序」功能;​ PyCharm新版发布| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自视觉中国 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦, ...

  5. Go入门系列(十八) 反射、包和测试工具

    本系列文章目录 展开/收起 Go入门系列(一) 初识Go语言 Go入门系列(二) 变量.指针.数据类型简介和作用域 Go入门系列(三) 基础类型--整型.浮点型.布尔类型和字符串 Go入门系列(四) ...

  6. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  7. 计算机操作系统(八)——并发程序设计

    并发程序设计 顺序程序设计 进程的并发执行 处理器利用率计算 并发程序设计 把一个具体问题求解设计成若干个可同时执行的程序模块的方法 特性: 无关与交往的并发进程 与时间有关的错误 进程互斥与进程同步 ...

  8. 读书笔记:汇编语言 第三版 王爽 清华出版社 章十六 章十七 章十八

    第十六章 直接定址表16.1 描述了单位长度的标号地址标号,表征了位置的偏移地址label:数据标号,表征了一段内存空间的物理地址和长度,增强型地址标号段地址,数据标号所在段的关联段寄存器,assum ...

  9. 燕十八PHP高性能架构班教学视频教程

    彻底拿下Linux集群+Nginx高并发+lvs负载均衡+MySQL优化+NoSQL! 2000W万条真实网站数据,拒绝纸上谈兵! Linux资深运维 + 燕十八老师亲自授课! Linux优化篇1.m ...

  10. Windows 8的十八项特点

    一.支持ARM架构 在年初的CES 2011上,微软正式宣布,Windows 8将支持ARM芯片架构.即来自Intel.AMD.NVIDIA.高通和德州仪器等芯片厂商的ARM系统都将一并提供支持.微软 ...

最新文章

  1. jQuery Callbacks
  2. Mybatis 3 返回布尔值,需要注意的地方
  3. ssms没有弹出服务器验证_Nginx服务器负载均衡及生成ssl密钥对、Nginx配置ssl操作示例...
  4. 游戏维护关闭服务器,游戏服务器正在维护中
  5. 创业必看:中国八大草根富豪发家史
  6. MS-SQL分页not in 方法改进之使用row_number
  7. html图片postmultipart,sendmail-MIMEText-MIMEImage-MIMEMultipart.py——发送带图片的HTML格式报表...
  8. python:else与循环语句联合用法
  9. IOS开发基础之英雄展示完整版
  10. 页表长度和页表大小_在请求调页系统中,若逻辑地址中的页号超过页表控制寄存器中的页表长度,则会引起( ) 。_学小易找答案...
  11. RHEL5中mdadm配置raid5磁盘阵列
  12. 反射 数据类型_Java基础:反射机制详解
  13. 如何在 Mac 上控制对摄像头的访问?
  14. Mybatis学习笔记(九) —— Mybatis逆向工程
  15. Django项目部署到腾讯云服务器
  16. python朋友圈点赞统计_微信公众号所有历史文章的标题/点赞数/阅读数统计
  17. 电商网站一般用什么技术开发
  18. 仿Windows画板喷漆笔刷效果
  19. 腾讯企业邮箱 java_java发送腾讯企业邮件-可用于发送邮箱验证码
  20. 文献管理软件Mendeley优缺点分析

热门文章

  1. Idea中搭建Wildfly(JBoss)运行环境(Mac)
  2. Android设计模式之——访问者模式
  3. 设计公共API的六个注意事项
  4. postgres大版本升级
  5. 使用SpringBoot yml配置文件
  6. 漫谈微服务架构:什么是Spring Cloud,为何要选择Spring Cloud
  7. 在 Confluence 6 中禁用 workbox 应用通知
  8. Java从入门到精通——数据库篇Mongo DB GridFS文件系统
  9. DreamWeaver使用技巧学习心得
  10. 4001.基于双向链表的双向冒泡排序法