目录
原因:在解决进程的同步与互斥问题时,信号量机制存在编写困难和易出错的问题
能不能设计一种机制,让程序员写程序时不再需要关注复杂的PV操作,让写代码更轻松呢
?”管程“:一种更高级同步机制
管程是一种特殊的软件模块,由以下部分组成:
?管程的基本特征:
empty和full是标志信号量用于解决同步问题?
N为缓冲区的大小
情况一:两个生产者并发执行,依次调用了insert过程
????????当生产者一调用insert进程时,生产者二想要调用insert进程时会被编译器阻塞(即管程解决生产者消费者问题时,是利用编译器实现各进程互斥地进入管程中地过程)
情况二:?两个消费者进程先执行,生产者后执行
????????由于缓冲区中产品初始值为0,所以两个消费者进程在并发执行remove函数时都会在wait(empty)处阻塞,然后被挂在等待队列中,此时生产者进程将自己生产的产品放入缓冲区(insert_item(item))中(缓冲区中还能放下新生产的产品)然后判断此时新产品是否是缓冲区中的唯一一个产品(如果是则说明可能会有消费者在等待新产品的生产,此时唤醒排在empty等待队列队头的消费者进程)然后count--,在消费者进程拿走产品前会判断缓冲区在自己拿走产品之前是否已经满了(如果已经满了,证明此时需要唤醒生产者进程去生产因拿走产品导致的缓冲区出现的空位)最后消费者进程拿走产品(最后肯定能拿走,但是拿走之前你得让之前那些因为缓冲区满了而停工的生产者继续生产)
引入管程的目的就是要更方便地实现进程互斥和同步:
????????程序员可以用某种特殊地语法定义一个管程,之后其他程序员就可以使用这个管程提供地特定“入口”很方便地实现了进程地同步和互斥了(封装思想)
~over~