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

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

一、信号量

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管程方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址

今天发现Qmail邮件系统的maillog里面有大量的“user not found”信息&#xff0c;通过下面的日志不难发现&#xff0c;是来自同一IP的很多不同的用户连接Qmail邮件系统认证失败的信息。黑客试图通过这种方式来破解Qmail邮件系统的用户名和密码&#xff0c;从而来发送大量的垃圾…

安装Postman

在web和移动端开发时&#xff0c;常常会调用服务器端的restful接口进行数据请求&#xff0c;为了调试&#xff0c;一般会先用工具进行测试&#xff0c;通过测试后才开始在开发中使用。 这里介绍一下如何在chrome浏览器利用postman应用进行restful api接口请求测试。 因为&#…

清华大学《操作系统》(二十):死锁和进程通信

一、死锁 死锁&#xff1a;一组阻塞的进程&#xff08;两个或多个&#xff09;&#xff0c;持有一种资源&#xff0c;等待获取另一个进程所占有的资源&#xff0c;而导致谁都无法执行。 可重复使用的资源&#xff1a; 在一个时间只能一个进程使用&#xff0c;且不能被删除。…

清华大学《操作系统》(二十二):文件系统

文件系统和文件&#xff1a; 文件系统是操作系统中管理持久性数据的子系统&#xff0c;提供数据存储和访问功能&#xff0c;组织、检索、读写访问数据。文件是具有符号名&#xff0c;由字节序列构成的数据项集合&#xff0c;是文件系统的基本数据单位&#xff0c;文件名是文件…

卡巴绿杀6 By Moshow魔手

卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【这是卡巴斯基绿色移动版本推荐用于u盘】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

清华大学《操作系统》(二十三):I/O子系统

常见设备接口类型&#xff1a; 1、字符设备&#xff1a;键盘鼠标、串口 a.以字节为单位顺序访问 b.I/O命令通常使用文件访问接口和语义 2、块设备&#xff1a;磁盘、磁带、光驱 a.均匀的数据块访问 b.I/O命令通常使用文件系统接口&#xff0c;也可以使用内存映射访问 3、网络…

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK&#xff1f; 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口&#xff0c;您能够通过该套接口实现主要的地图功能&#xff0c;而且能够定制地图样式&#xff0c;实现个性化地图。 该接口提供下面功能&#xff…

mysql读写分离_MySQL基于amoeba读写分离实验

主从复制只是一个同步数据的方式读写分离&#xff1a;只在主的上面写&#xff0c;只在从的上面读读写分离方案&#xff1a;【1】基于程序代码内部 (生产环境中应用最广泛&#xff0c;性能最好&#xff0c;需要开发人员来实现)【2】基于中间代理层的实现amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所谓Django models模型&#xff0c;是指的对数据库的抽象模型&#xff0c;models在英文中的意思是模型&#xff0c;模板的意思&#xff0c;在这里的意思是通过models&#xff0c;将数据库的借口抽象成python自己的一个类。然后在python Django框架其他代…

Python内存管理以及垃圾回收机制

垃圾回收&#xff1a;用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表&#xff0c;这个链表就比较厉害了&#xff0c;因为Python程序中一旦创建对象都会把这个对象添加到refchain这个链表中。也就是说他…

【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net

Ext.NET是基于跨浏览器的ExtJS库和.NET Framework的一套支持ASP.NET AJAX的开源Web控件&#xff0c;包含有丰富的Ajax运用&#xff0c;其前身是Coolite。 下载地址&#xff1a;http://www.ext.net/download/ 示例地址&#xff1a;http://examples.ext.net/ 1.首先下载Ext.Net,地…

面试之操作系统

基本特征 1. 并发 并发是指宏观上在一段时间内能同时运行多个程序&#xff0c;而并行则指同一时刻能运行多个指令。并行需要硬件支持&#xff0c;如多流水线、多核处理器或者分布式计算系统。操作系统通过引入进程和线程&#xff0c;使得程序能够并发运行。 2. 共享 共享是指…

mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

在上一期图解 图解MySQL | MySQL DDL为什么成本高&#xff1f;中&#xff0c;我们介绍了&#xff1a;传统情况下&#xff0c;为表添加列需要对表进行重建腾讯团队为 MySQL 引入了 Instant Add Column 的方案(以下称为 "立刻加列" 功能)可以快速完成 为表添加列 的任务…

GCC for Win32开发环境介绍

GCC for Win32开发环境介绍(1) 第一章 在视窗操作系统下的GCC 第一节GCC家族概览 GCC是一个原本用于Unix-like系统下编程的编译器。不过&#xff0c;现在GCC也有了许多Win32下的移植版本。所以&#xff0c;也许对于许多Windows开发者来说&#xff0c;GCC还是一个比较陌生的东西…

reg型变量怎么赋值_UiPath变量介绍和使用

1 变量变量主要用于存储数据&#xff0c;它在RPA中扮演重要的数据传递角色&#xff0c;是RPA编程不可或缺的一部分。它包括变量名称和变量的值&#xff0c;变量的值支持多种数据类型&#xff0c;包括从通用值&#xff0c;文本&#xff0c;数字&#xff0c;数据表&#xff0c;时…

深度学习之概述

深度学习的应用场景 1、图像应用&#xff1a; 1.1 大规模(大数据量)图片识别(聚类/分类)&#xff0c;如人脸识别&#xff0c;车牌识别&#xff0c;OCR等。人脸识别算法&#xff1a;① faceID ② faceNet 1.2 以图搜图&#xff0c;图像分割 1.3 目标检测&#xff0…

如何根据对象获取到对应的表名_Excel VBA 常用对象二

下面继续讲解上一节中未讲完的内容&#xff1a;Excel VBA编程中常常使用的那些对象到底是什么&#xff0c;如何在代码中表示它们。Worksheet对象Worksheet对象代表工作表。工作簿中的每个工作表都是一个Worksheet对象&#xff0c;所有Worksheet对象构成了Worksheets集合。我们使…

深度学习之 BP 算法

神经网络的一种求解W的算法&#xff0c;分为信号“正向传播(FP)”求损失&#xff0c;“反向传播(BP)”回传误差&#xff1b;根据误差值修改每层的权重&#xff0c;继续迭代。 BP算法也叫做δ算法。以三层的感知器为例&#xff08;假定现在隐层和输出层均存在相同类型的激活函数…

深度学习之 RBF神经网络

RBF神经网络通常只有三层&#xff0c;即输入层、中间层和输出层。其中中间层主要计算输入x和样本矢量c&#xff08;记忆样本&#xff09;之间的欧式距离的Radial Basis Function (RBF)的值&#xff0c;输出层对其做一个线性的组合。 径向基函数&#xff1a; RBF神经网络的训练…

redis 队列_Redis与Rabbitmq消息队列的区别

将redis发布订阅模式用做消息队列和rabbitmq的区别&#xff1a;可靠性 redis &#xff1a;没有相应的机制保证消息的可靠消费&#xff0c;如果发布者发布一条消息&#xff0c;而没有对应的订阅者的话&#xff0c;这条消息将丢失&#xff0c;不会存在内存中&#xff1b;rabbit…