多进程读写一个缓冲区的机制

来源:互联网 发布:淘宝u站平台 编辑:程序博客网 时间:2024/05/16 05:50

http://blog.csdn.net/bat603/article/details/1433932

多进程读写一个缓冲区的机制

今天主管给安排了一个工作,实现多进程对一个缓冲区的对操作,做流媒体的,需要高效率的机制。经过一天的思考,确定了一个比较好的机制。

       把缓冲区设置成1、2两区,读进程(多个)去读1区,同时写进程(多个)要向2区写,这样可以提高一倍的吞吐量。现在问题是当读进程发现1区没有了内容,怎么通知写进程切换到1区写,以方便读进程去2区读。

       解决办法:设置一个flag标志为,1代表读进程在1区读操作,2表示读进程在2区。设置四个信号灯,0、1分别指示读进程在1、2区的个数(当然也可以用一个来表示,因为读进程在同一个时间只能在一个区操作),2、3代表写进程在1、2区的个数。

       具体描述:假设一开始flag = 2.读进程在2区,写进程在1区(当缓冲区满了,把老数据覆盖),当有读进程进入2区时,都要进行V(0)操作,来表示现在有多少个进程在读操作(当然读的时候,要对对应的临界区互斥,即索引值,稍微多说一下,由于每次操作都是很大的数据,所以需要一定时间,但是修改索引值的时间很短,所以可以多个进程在读写操作,可以看一下生产者-消费者),当读进程操作完成后,进行P(0)操作。大家相安无事。

       当又来一个读操作,发现2区已经没有数据可读,立即把flag=4(若一开始flag=1,则把flag =3),然后去查看1区是否有写进程,若有,则阻塞。直到1区没有写进程。第一个进入1区的进程把flag置为1。

       当来了一个写进程,查看flag=4,知道读进程原来在2区操作,而现在2区已经没有数据可读,所以它要去2区写数据,当然要先查看2区是否还有读进程在操作,有则阻塞。直到2区没有读进程。

       上面的机制建立在进程不能出现异常,也就是说操作一定完成的前提下,假设有读进程在2区出现问题,一直不进行V(0)操作,则写进程是无法进入的。  by rainfish

原创粉丝点击