关于缓冲区/池设计中的三个队列
2014-01-02 22:30
183 查看
今天在看操作系统相关的书,看到一个例子:用三个队列来管理缓冲区池的使用情况,三个队列分别为:空闲缓冲队列em,输入缓冲队列in,输出缓冲队列out。
对缓冲不是很了解,只知道缓冲是用来平衡不同设备数据传输速度的差异的,对于其具体实现不是很了解。其实缓冲区用一个字节数组就可以实现,当然其中也设计到许多具体的设计问题。今天我想记录的和线程池类似的东西,那就是缓冲区池。为了减少缓冲区建立和删除的效率问题,采用缓冲池技术,当需要缓冲区的时候,直接从池中取出空闲的缓冲区使用,当使用结束的时候,清空缓冲区内容并放回池中。
而这三个队列有什么用呢?先说说缓冲池有哪些需要知道的方法吧。
第一个是add_buf ( type , numb ),用于把缓冲区numb插入type类型的队列中(比如输入缓冲区队列)。响应的,就有有take_buf ( type , numb),从type类型的队列中取出缓冲区numb。
使用这几个操作,缓冲池的工作过程可描述如下:
首先,输入进程调用take_buf (em,numb)过程从空白缓冲区队列中取出一个缓冲号为numb的空白缓冲区,将其作为收容输入缓冲区hin,当hin中装满了由输入设备输入的数据之后,系统调用过程add_buf (in,hin)将该缓冲区插入输入缓冲区队列in中
另外,当进程需要输出数据数据时,输出进程经过缓冲管理程序调用过程take_buf(em,numb)从空白缓冲区队列中取出一个空白缓冲区numb作为收容输出缓冲区hout,待hout中装满输出数据之后,系统再调用过程add_buf(out,hout)将该缓冲区插入输出缓冲区队列out.
对缓冲区的输入数据和输出数据的提取也是由过程add_buf和take_buf实现的。take_buf(out,numb)从输出缓冲队列中取出装满输出数据的缓冲区number,将其作为sout。当sout中数据输出完毕时,系统调用过程add_buf(em,sout)将该缓冲区插入空白缓冲队列。而take_buf(in,number)则从输入缓冲队列中取出一个装满输入数据的缓冲区numb作为输入缓冲区sin,当CPU从中提取完所需数据之后,系统调用过程add_buf(em,sin)将该缓冲区释放和插入空白缓冲队列em中。
另外,关于缓冲池,还涉及到一个多线程/进程互斥操作的问题。我们可以用信号量来实现多线程/进程对任一队列的互斥操作
这里采用进程IPC的P、V原语,用信号量s代表任一队列的可用缓冲区个数,假定上面三个队列的初值分别为n1,n2,n3,同时引入一个互斥使用任一队列的信号量mutex,初始值为1.
然后我们实现get_buf(type , numb)和put_buf(type,numb),他们调用了上面用到的take_buf方法和add_buf方法,伪代码实现如下:
对缓冲不是很了解,只知道缓冲是用来平衡不同设备数据传输速度的差异的,对于其具体实现不是很了解。其实缓冲区用一个字节数组就可以实现,当然其中也设计到许多具体的设计问题。今天我想记录的和线程池类似的东西,那就是缓冲区池。为了减少缓冲区建立和删除的效率问题,采用缓冲池技术,当需要缓冲区的时候,直接从池中取出空闲的缓冲区使用,当使用结束的时候,清空缓冲区内容并放回池中。
而这三个队列有什么用呢?先说说缓冲池有哪些需要知道的方法吧。
第一个是add_buf ( type , numb ),用于把缓冲区numb插入type类型的队列中(比如输入缓冲区队列)。响应的,就有有take_buf ( type , numb),从type类型的队列中取出缓冲区numb。
使用这几个操作,缓冲池的工作过程可描述如下:
首先,输入进程调用take_buf (em,numb)过程从空白缓冲区队列中取出一个缓冲号为numb的空白缓冲区,将其作为收容输入缓冲区hin,当hin中装满了由输入设备输入的数据之后,系统调用过程add_buf (in,hin)将该缓冲区插入输入缓冲区队列in中
另外,当进程需要输出数据数据时,输出进程经过缓冲管理程序调用过程take_buf(em,numb)从空白缓冲区队列中取出一个空白缓冲区numb作为收容输出缓冲区hout,待hout中装满输出数据之后,系统再调用过程add_buf(out,hout)将该缓冲区插入输出缓冲区队列out.
对缓冲区的输入数据和输出数据的提取也是由过程add_buf和take_buf实现的。take_buf(out,numb)从输出缓冲队列中取出装满输出数据的缓冲区number,将其作为sout。当sout中数据输出完毕时,系统调用过程add_buf(em,sout)将该缓冲区插入空白缓冲队列。而take_buf(in,number)则从输入缓冲队列中取出一个装满输入数据的缓冲区numb作为输入缓冲区sin,当CPU从中提取完所需数据之后,系统调用过程add_buf(em,sin)将该缓冲区释放和插入空白缓冲队列em中。
另外,关于缓冲池,还涉及到一个多线程/进程互斥操作的问题。我们可以用信号量来实现多线程/进程对任一队列的互斥操作
这里采用进程IPC的P、V原语,用信号量s代表任一队列的可用缓冲区个数,假定上面三个队列的初值分别为n1,n2,n3,同时引入一个互斥使用任一队列的信号量mutex,初始值为1.
然后我们实现get_buf(type , numb)和put_buf(type,numb),他们调用了上面用到的take_buf方法和add_buf方法,伪代码实现如下:
get_buf(type,numb) begin P(s) P(mutex) numb = take_buf(type,numb) V(mutex) end
put_buf(type,numb) begin P(mutex) add_buf(type,numb) V(mutex) V(s) end
相关文章推荐
- 缓冲区设计--环形队列
- [架构设计]关于消息队列的使用
- 优化设计-任务间通信-用队列而不用缓冲区
- 架构设计:生产者/消费者模式 第3页:队列缓冲区
- (转)关于后台加载队列的设计
- 架构设计:生产者/消费者模式[2]:队列缓冲区
- 架构设计:生产者/消费者模式[2]:队列缓冲区
- 关于ConcurrentQueue--一个队列缓存的设计
- 缓冲区设计--环形队列
- 关于响应式设计的三个理念
- 环形缓冲区的设计及其在生产者消费者模式下的使用(并发有锁环形队列)
- 架构设计:生产者/消费者模式 第3页:队列缓冲区
- 架构设计:生产者/消费者模式 第3页:队列缓冲区
- 架构设计:生产者/消费者模式 第3页:队列缓冲区
- 关于消息队列这种设计模式的利弊
- 环形缓冲区的设计及其在生产者消费者模式下的使用(并发有锁环形队列)
- 关于数组实现队列的一些设计
- 关于数据库设计的三个范式
- 关于响应式设计的三个理念
- 【C/C++】缓冲区设计--环形队列