线程/进程同步操作的监视器:管程
我们通过信号量解决同步问题,而信号量存在程序编写困难或效率低下的问题。于是发明了管程,将信号量的这些组织工作交给一个专门的构造来管。管程(monitor)意为监视器,它监视的是进程或线程的同步操作。
管程就是一组子程序,变量和数据的组合,即你把需要同步的代码用一个管程的构造框起来。
注意:进程只能互斥的使用管程,即当一个进程使用管程时,另一个进程必须等待。当一个进程使用完管程后,它必须释放管程并唤醒等待管程的某一个进程。
管程的条件变量(c):
条件变量c实际是一个指针,它指向一个等待该条件的PCB队列。它只有在管程内才能被访问,它对管程内所有过程是全局的,只能通过wait(),signal()两个操作来访问。
如:notfull表示缓冲区不满,如果缓冲区满,那么将要在缓冲区写入数据的进程就要等待notfull,即wait(notfull);相应地,如果一个进程在缓冲区内读数据,当它读完一个数据后,要执行signal(notempty),表示已经释放了一个缓冲区单元。
wait(c):
挂起调用进程并释放管程,直至另一进程在条件变量上执行signal()。
wait(c)表示为进入管程的线程分配某种类型的资源,如果此时这种资源可用,那么进程使用,否则进程被阻塞,进入队列。
signal(c):
如果有其他进程因对条件变量执行wait()而被挂起,便释放之,如果没有进程等待,则信号被忽略。
signal(c)表示进入管程的进程使用的某种资源要释放,此时进程会唤醒由于等待此资源而进入队列中的第一个进程。
wait和signal是利用资源的内部语句,条件变量相当于要用的资源,如果已经被别的调用,就wait改变量,用好了别的资源会signal,然后这个程序再利用。
【应用实例】生产者消费者问题。生产者进程将产品放入某一缓冲区,消费者进程到此缓冲区中取产品。这个过程必须保证:
1. 当缓冲区有剩余空间时,生产者才能在其中放入产品;
2. 当缓冲区有数据时,消费者才能在其中取出产品。
解决方案:使用管程机制来实现生产者和消费者之间的同步互斥问题
1. 假设有一基本管程monitor,提供了enter、leave、signal、wait等操作;
2. 条件变量notfull表示缓冲区不满,条件变量notempty表示缓冲区不空;
3. 缓冲区buff[0...n-1]用来存放产品,最大可放n件产品;
4. 定义整型变量count表示缓冲区当前的产品数,指针in指向缓冲区当前第一个空的位置,指针out指向缓冲区当前第一个不空的位置;
5. 定义过程add(ItemType item)
add(ItemTypeitem) //生产者进程在缓冲区放入产品
{
if(count==n) wait(notfull); //如果此时缓冲区已满,那么进程必须等待notfull,这意味着进程已经被阻塞到紧急队列里
buff[in]=item; //否则在第一个空的位置放入产品
in=(in+1)%n; //指针循环加1
count++;
signal(notempty); //此时缓冲区已经多了一个产品,也就是说生产者进程去唤醒因取不到产品被阻塞的消费者进程
}
6. 定义过程ItemType remove()
ItemType remove() //消费者进程在缓冲区取出产品
{
if(count==0) wait(notempty); //如果缓冲区没有产品,那么消费者必须等待notempty,也就是被阻塞到紧急队列中去
item=buff[out]; //消费者从第一个不空的位置取出产品
out=(out+1)%n;
signal(notfull); //此时缓冲区多了一个空的单元,也就是消费者进程去唤醒因缓冲区已满而不能放入产品的生产者进程
return item;
}
7. 生产者进程代码段
while(true)
{
produce(&item); //生成出一件产品
monitor. enter(); //进入管程
monitor. add(); //调用add方法,放入产品
monitor. leave(); //离开管程
}
8. 消费者进程代码段
while(true)
{
monitor. enter();
item=monitor. remove(); //取出产品
monitor. leave();
consumer(&item); //进行消费
}
线程/进程同步操作的监视器:管程相关推荐
- 打开线程 | 进程 | 协程的大门
不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的. ...
- 协程与线程, 进程的区别
进程.线程.协程的区别 进程是资源分配的单位,真正执行代码的是线程,操作系统真正调度的是线程. 进程没有线程效率高,进程占用资源多,线程占用资源少,比线程更少的是协程. 协程依赖于线程.线程依赖于进程 ...
- python线程进程协程面试_Python学习经验之谈:关于协程的理解和其相关面试问题...
都知道Python非常适合初学者学习来入门编程,昨天有伙伴留言说面试了Python岗位,问及了一个关于协程的问题,想了想还是跟大家出一篇协程相关的文章和在Python面试中可能会问及的相关面试问题.都 ...
- python协程和线程_python之并发编程(线程\进程\协程)
一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...
- python apply_async死锁_python之并发编程(线程\进程\协程)
一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...
- python在主线程上下文执行_线程进程系列*(Python)
一 ,线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更 ...
- python_21_线程+进程+协程
python_线程_进程_协程 什么是线程? -- os能够进行运算调度的最小单位,被包含在进程之中,是一串指令的集合 -- 每个线程都是独立的,可以访问同一进程下所有的资源 什么是进程? -- 每个 ...
- 十四丶并发编程(线程 进程 协程)
Yuan先生 知识预览 操作系统 回到顶部 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系 ...
- jmeter进程和线程的区别_接口测试01- Jmeter-线程进程-环境变量
1.1 概念 JMeter 是 Apache 组织使用 Java 开发的一款测试工具 ,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动态资源,例如静态文件.Java ...
最新文章
- ubuntu 安装php-redis
- 连接数process与会话session
- 今天碰到一道比较有趣的面试题,大家来探讨一下。
- 系统设计知识:系统设计的基本原理介绍
- 大整数相加链表实现(Add Two Numbers)
- 规模化敏捷框架何从入手?这篇文章把SAFe讲透了!
- 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找
- BZOJ3324 : [Scoi2013]火柴棍数字
- 广州大学数据库实验报告_广州大学学生Access数据库实验1_表的创建和操作
- 微软:Mozilla,我劝你拥抱 Chromium!
- 大数据入门初学者需要学习的内容及学习路线详解
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Python3的scapy库的学习(暂无内容)
- acrobat 控件可以发布吗_自己能做小程序商城吗?可以发布使用吗
- 从Android发展看Meego
- php后台发送qq消息,WebQQ消息发送功能
- 树莓派价格暴涨买不起?他们自己做了一块价格还不到1/4的开发板平替树莓派,还火到海外去了
- HIVE性能调优总结
- 螃蟹保存方法保存时间_活面包蟹怎么保存?面包蟹能保存多久
- 《剑指offer》序——面试流程及面试须知