关于缓冲区/池设计中的三个队列

今天在看操作系统相关的书,看到一个例子:用三个队列来管理缓冲区池的使用情况,三个队列分别为:空闲缓冲队列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方法,伪代码实现如下:

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


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值