共享资源并发争用的解决方案(一)

  在进行一个系统的设计时,有这样的需求,我们面对几个稀有的资源,却有大量的并发请求,它们毫无疑问将会是我们将来系统中的瓶颈所在,在实际系统设计中,怎么样去解决这些资源的获取、分配、释放、以及争用解决?本文是我在即将过去的今天(还有不到一个小时)躺在床上抱着本本用比较放松的心态,本着交流和探讨的目的,进行的一些经验分享。

  我不想去涉及具体哪门技术,仅仅只是以方法而论。假设,我们有10个并发请求,但是却只有三个资源(比如网卡、USB接口等设备)存在,我们要最大限度地利用好这三个资源。最本能的思路是:先想办法把这3歌资源编到一个列表中去,来一个请求,开启一个线程,去列表中查看是否有可用的资源,如果存在,锁定该资源,进行运算,并在运算结束的时候将该设备解锁,放回到原来的列表中。而在列表中没有获取到资源的请求线程则挂起一段时间片,循环获取,设定一个循环超时时间,超时则意味了获取资源失败,结束进程。 基本上没有人不能理解这种模式,这是一种公平争用模式,易于理解和实现。但是需要提醒大家注意的是,当我们的原子操作对资源调用是独立的时候,这是一种值得推荐的方式,但是当一个线程中的原子操作需要涉及到两级甚至以上的资源调用时候,不要忘记解决好死锁的问题。

  事实上这种公平竞争的模式是不能符合大多数需求的,于是就有了优先级的出现。跟我们处理线程一样,在上述分配的基础上给我们的请求加上优先级机制,即每一个请求对象都附属一个优先级属性,我们通过一定规则去设定每个请求对象的优先级,有空闲资源的时候,优先给优先级高的请求调用。怎么去设定优先级由您的需求而定,您甚至可以打开一个独立的线程,不断去check请求列表,并根据您的需要设定优先级。优先级就像是一种特别通行证,在公平竞争机制基础上添加了一种特殊属性设定接口。这种设计在我所遇到的项目中应用还是比较广的。

  还有一种处理方式,和上述两种方法有本质的区别。我们这次不去管理资源,而去管理请求。比如,我们依然还是10个并发请求,、3个故乡资源设 备。和上述不同的是,这次我们不对资源进行列表,每次请求对象过来,我们将他们入队,并用相应独立的线程去检测请求是否超期,或者修改对象的优先级。每当一个资源设备空闲的时候,我们定义一个事件,这个事件触发线程去请求列表中获取一个请求,并响应该请求。这样做的好处是类似于ArrayList对于Array的优点一样,你不必在程序运行之前就知道资源的数目,并在元算的过程中对设备列表进行维护,甚至一些缺乏经验的设计会使得系统运行一段时间之后因为个别设备发生异常,却无法直接反馈给线程中的列表,导致没有意义的异常。而以资源为主动的方式,不需要预先知道到底多少中终端资源,是可以根据实际资源的请求信号进行绑定。

  老婆睡了,偶也老打错字,不行了,明天继续!

转载于:https://www.cnblogs.com/bobolink/archive/2010/07/30/1789095.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值