且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

实现一个资源分配模块的感想

更新时间:2022-10-01 13:24:04

最近在写一个资源分配模块,主要的要求是这样的:

  1. 上层有很多种用户,不同类型的用户要求申请不同的分配策略;
  2. 不同类用户之间允许同时申请资源,而且同一类型的多个用户可能同时申请资源;
  3. 实现提前预分配,以便减小关键路径上的等待、保证在任何用户申请资源的时候已经为它准备好
  4. 需求根据每种用户申请的资源使用的不同程度,还会触发限速、预分配等多种事件。

那么,该如何正确、高效地实现这个模块呢?

俗话说得好,磨刀不误砍柴工,同样我们首先得把模块的主要架子“这把刀”磨好,这就要求先确定好实现这个功能的主要框架或者模型。下面是我反复思考后的设计:

  1. 申请模块和预备分配模块本身适用于生产者和消费者模型;
  2. 两者可以通过触发的事件进行协作,这一点可以通过一个带锁的事件队列去实现;
    3.当前正在使用的资源buffer和预分配的资源buffer, 可以通过Ping Pang buffer去实现;
  3. 考虑到允许同一类型和不同类型的用户同时申请资源,这就要求是实现这两个层面的锁的互斥操作;
  4. 为了避免事件队列的不停循环查询,可以通过多线程的同步cond 信号去实现。

当然,上面只是一些主要的分析,后面设计的过程中还要更具体才行。但是,从上面的例子不难看到,把具体的业务首先落实到模型,最后对应到多种数据结构,同时考虑内在的同步互斥等关系,这样我们就能把画出这个模块的大框架,后面就可以对框图里面的子模块逐一细化、提炼了。而且,实现这些功能的模型和数据结构,其实也是最常见的类型,基本都只是大学里数据结构和操作系统的很小一部分内容了。但是,反过来,如果我们没有首先进行建立模型和抽象的过程,就难免落入具体业务需求的冗繁当中,有时难免不见森林、顾此失彼。

因此,碰到具体的需求,利用抽象、分层的思想、结合已有的的模型去描述,能极大地方便我们表述问题、实现功能。往大点说,这也是一种通过方法论而非经验提高自己的有效途径。下面列出了一些建模过程常用的模型和数据结构,欢迎大家多多补充:

  • 模型:事件驱动,生产者消费者,状态机,面向对象

  • 数据结构:slist,squeue,tlist,tqueue, ping pang buffer, 红黑树














本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/2044863 ,如需转载请自行联系原作者