全部博文(1293)
分类:
2012-11-07 14:43:22
用生产者—消费者问题实现数据同步通信数据同步通信过程实际上等同于生产者—消费者问题( Producer-Consumer Problem) .
生产者—消费者问题是一个著名的进程同步问题,它描述的是:
用一群生产者进程生产消息,并用此消息提供给消费者进程消费. 为使生产者进程和消费者进程能并发执行,在它们之间设置一个具有N 个缓冲区的缓冲池,生产者进程可将它所生产的消息投入一个缓冲区中,消费者进程可从一个缓冲区中取得一个消息消费. 尽管所有的生产者进程和消费者进程都是以异步方式进行,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区中去取消息,也不允许生产者进程到一个已装有消息但该消息未被取走的缓冲区中投放新消息.
采用共享数据的方法简化了数据交换,但在多进程数据通信过程中却可能发生错误,使数据内容被破坏. 为解决问题,可利用信号量的互斥性加以同步保护,获得对缓冲区(数据) 的独占访问,见图4.
图4
图4 中,假设缓冲池包含10 个缓冲区,一个任务通过调用BufReq ( ) 可以从缓冲区管理器中获得一个缓冲区,用BufRel ( ) 释放该缓冲区到缓冲区管理器中. 缓冲区管理器共有10 个信号量,当所有的信号量都被使用时,再申请缓冲区的任务将被挂起,直到有信号量可以使用为止. 当一个带有缓冲区的任务完成后,它将调用BufRel ( ) 把缓冲区还给缓冲区管理器.
本文采用计数器信号量来管理缓冲区,与其它信号量相比,计数器信号量的特点在于,它可以保持对信号量释放次数的追踪. 信号量每次释放,计数器加1 ,每次获取,计数器减1. 当计数器为0 时,试图获取该信号量的任务被阻塞. 在中断服务程序中,可以将数据写入缓冲区,然后再释放信号量. 由于它保持对信号量释放次数的追踪功能,如果任务暂时无法读取数据,数据也不会被丢弃.
从上面原理,可以这样信号量的数值,其意义是共享资源的数目。