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

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

一、信号量

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接口请求测试。 因为&#…

python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区

6 词频统计完成分词以后&#xff0c;词频统计就非常简单了。我们只需要根据分词结果把片段切分开&#xff0c;去掉长度为一的片段(也就是单字)&#xff0c;然后数一下每一种片段的个数就可以了。这是出现次数排名前 20 的单词&#xff1a;(括号内为频数)可以跟之前只统计出现次…

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

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

python操作redis实例_Java,php,Python连接并操作redis实例

1、Java连接并操作redis在Eclipse里新建一个java project&#xff0c;导入jedis-*.jar包。示例代码&#xff0c;其他对应的操作类型见&#xff1a;http://my.oschina.net/u/2391658/blog/705069import redis.clients.jedis.Jedis;//示例代码public class RedisTest {public sta…

java: cannot execute binary file 如果遇到这个错,一般是操作系统位数出问题了。

[roottestserver usr]# java/jdk1.6.0_12/bin/java-bash: java/jdk1.6.0_12/bin/java: cannot execute binary file后来检验&#xff0c;检查了一段时间&#xff0c;没有问题&#xff0c;最后有高人提示经验证&#xff0c;是64位版本移到32位上。本文转自 jxwpx 51CTO博客&…

div 自适应高度

自适应高度 &#xff0c;设置最小高度&#xff1b;通常情况下&#xff0c;没有设置高度&#xff0c;div默认自适应高度且无最低高度 1 div{ 2 _height:200px; /* css 注解&#xff1a; 仅IE6设别此属性&#xff0c;假定最低高度是200px &#xff0c;设置高度200px&#xff0c…

GCC使用详情

1.前言 GCC编译器的手册(GCC MANUAL)的英文版已经非常全面&#xff0c;并且结构也非常完善了&#xff0c;只是一直都没有中文的版本&#xff0c;我这次阅读了GCC编译器的主要内容&#xff0c;对手册的内容进行了结构性的了解&#xff0c;认为有必要对这次阅读的内容进行整理&am…

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

文件系统和文件&#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...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

python将字符串写入csv_用Python将字符串值写入CSV文件

我有一个很大的数据集&#xff0c;在第二列有句子和他们的情绪状态。我开发了代码来将它们读作numpy数组。我需要的是&#xff0c;如果一个句子的情感是中性的&#xff0c;那么返回为真&#xff0c;否则返回假。if-else条件返回的每个结果都应写入CSV文件。但是这里它只在CSV文…

加载静态文件,父模板的继承和扩展

用url_for加载静态文件<script src"{{ url_for(static,filenamejs/login.js) }}"></script>flask 从static文件夹开始寻找可用于加载css, js, image文件继承和扩展把一些公共的代码放在父模板中&#xff0c;避免每个模板写同样的内容。base.html子模板继…

清华大学《操作系统》(二十三):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框架其他代…

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中&#xff0c;引入了MasterPage的机制&#xff0c;在当前页使用MasterPage的情况下&#xff0c;放在 ContentPlaceholder1这样的内容页的控件无法用Page.FindControl来查找&#xff0c;原因何在&#xff1f;MSDN对FindControl的解释&#xff1a;在当前的命名容器…

ATT汇编语言与GCC内嵌汇编简介

AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 GCC内嵌汇编 2.1简介 2.2内嵌汇编举例 2.3语法 2.3.1汇编语句模板 2.3.2输出部分 2.3.3输入部分 2.3.4限制字符 2.3.5破…

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

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

pythonfillcolor_openpyxl 填充颜色(单元格)

如果需要填充某个单元格的颜色需要3步&#xff1a;# 1-加载库文件from openpyxl import Workbookfrom openpyxl.styles import PatternFill#2-新建一个工作簿wb Workbook()ws wb.active#随便赋个值d4 ws[D4]d4 43d4.value#3-设置样式&#xff0c;并且加载到对应单元格fill …