1685.top贵阳网站建设,中小企业上市公司名单,微股东微网站制作平台,建设建设银行甘肃分行网站目录
为什么要引入管程
管程的定义和基本特征
用管程解决生产者消费者问题
结论
本节思维导图 为什么要引入管程
原因#xff1a;在解决进程的同步与互斥问题时#xff0c;信号量机制存在编写困难和易出错的问题
能不能设计一种机制#xff0c;让程序员写程序时不再需…目录
为什么要引入管程
管程的定义和基本特征
用管程解决生产者消费者问题
结论
本节思维导图 为什么要引入管程
原因在解决进程的同步与互斥问题时信号量机制存在编写困难和易出错的问题
能不能设计一种机制让程序员写程序时不再需要关注复杂的PV操作让写代码更轻松呢 ”管程“一种更高级同步机制 管程的定义和基本特征
管程是一种特殊的软件模块由以下部分组成
局部于管程的共享数据结构说明对该数据结构进行操作的一组过程”过程“即”函数“对局部于管程的共享数据设置初始值的语句管程有一个名字 管程的基本特征
局部于管程的数据只能被局部于管程的过程所访问一个进程只能通过调用管程内的某个过程才能进入管程访问共享数据每次仅允许一个进程在管程内执行某个内部过程
用管程解决生产者消费者问题 empty和full是标志信号量用于解决同步问题
N为缓冲区的大小
情况一两个生产者并发执行依次调用了insert过程 当生产者一调用insert进程时生产者二想要调用insert进程时会被编译器阻塞即管程解决生产者消费者问题时是利用编译器实现各进程互斥地进入管程中地过程 情况二 两个消费者进程先执行生产者后执行 由于缓冲区中产品初始值为0所以两个消费者进程在并发执行remove函数时都会在wait(empty)处阻塞然后被挂在等待队列中此时生产者进程将自己生产的产品放入缓冲区insert_item(item)中缓冲区中还能放下新生产的产品然后判断此时新产品是否是缓冲区中的唯一一个产品如果是则说明可能会有消费者在等待新产品的生产此时唤醒排在empty等待队列队头的消费者进程然后count--在消费者进程拿走产品前会判断缓冲区在自己拿走产品之前是否已经满了如果已经满了证明此时需要唤醒生产者进程去生产因拿走产品导致的缓冲区出现的空位最后消费者进程拿走产品最后肯定能拿走但是拿走之前你得让之前那些因为缓冲区满了而停工的生产者继续生产 结论
引入管程的目的就是要更方便地实现进程互斥和同步
需要在管程中定义共享数据生产者消费者问题中的缓冲区需要在管程中定义用于访问这些共享数据的”入口”即函数生产者消费者问题中可以定义一个函数用于将产品放入缓冲区再定义一个函数用于从缓冲区取出产品只有通过这些特定的“入口”才能访问共享数据管程中有很多“入口”但是每一次只能开放其中一个“入口”并且只能让一个进程或线程进入生产者消费者问题中各进程需要互斥地访问共享缓冲区管程地这种特性即可保证一个时间段内最多只会有一个进程在访问缓冲区这种互斥特性是由编译器负责实现地程序员不需要关心可在管程中设置条件变量及与之相关的等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量上等待此时该进程应先释放管程地使用权也就是让出“入口”可以通过唤醒操作将等待在条件变量上地进程或线程唤醒 程序员可以用某种特殊地语法定义一个管程之后其他程序员就可以使用这个管程提供地特定“入口”很方便地实现了进程地同步和互斥了封装思想
本节思维导图 ~over~