多核分布式队列的实现:"偷"与"自私"的运用

在讨论本文的正题前,不得不先说一些闲话,嫌哆嗦者可以跳过"前言"部分不读。
  • 1. 前言
在发表了"老子是伟大的多核计算科学家" (链接:[url]http://blog.csdn.net/drzhouweiming/archive/2008/11/07/3246254.aspx[/url],为叙述方便,后面将这篇文章简称为"老子")一文后,褒扬者有许多,但是也引来了许多板砖。当然大部分板砖都只是泛泛的批评,没有任何内容。不过有些人觉得似乎有些牵强附会,倒是引起了我的注意,确实这类文章可能确实容易给人牵强附会的感觉。
需要说明的是,本人并没有觉得它是牵强附会的。首先申明一下,我并不是研究哲学的,也没有详细研究过老子的《道德经》,但是我在设计多核算法时,确实受到了《道德经》中的思想启发。举两个例子如下:
第一个例子是在设计多核查找算法(链接:[url]http://blog.csdn.net/drzhouweiming/archive/2008/10/27/3159501.aspx[/url]) 时,最初我是用AVL树作为多级查找结构的子查找结构的,当时觉得AVL树肯定会比数组更好,因为对稍微大一点的数组进行插入删除的效率非常低,只能用在 很少数据的表上,不能对大量数据的表进行管理。记得有一天看电视时,凑巧看到在讲老子的小国寡民思想,谈到了结绳而治的问题,受此启发,对AVL树比数组 更好的想法产生了怀疑,于是试着将查找子结构改为用最原始的数组来实现,结果发现即使对上百万个规模的数据的表进行处理,综合性能也比用AVL树更好。
第二个例子是在设计多核分布式内存管理算法时,采用了"抢"的方法,使得分配和释放内存不需要使用锁。这也是受《道德经》中的"无为"及"大道自 然"的思想影响,因为之前已经发现"贪心"、"自私"、"偷"这几种人性的本能在算法中得到广泛使用,既然连"偷"都在多核算法中得到使用,那么它的孪生 兄弟"抢"应该也可以在多核算法中得到使用,本着此思想,后来终于发现可以将"抢"的思想用在多核分布式内存管理算法中,大大提高共享内存分配和释放的效 率。
对老子《道德经》的解释,历来有各种不同的解释。既然有些人只是在理论层面都可以进行解释,我现在把它的部分思想用到了具体的多核算法中,变成了在计算机里可以实际运行的程序,对它解释一下就变成了牵强附会的话,那么这种牵强附会我想越多越好。
闲话少叙,言归正传,下面就来谈一个使用"偷"与"自私"的方法实现的多核分布式队列的详细实例,以看看如何将看似泛泛而谈的思想变成可以运行的程序的。
  • 2. 分布式队列的基本概念
在"多核编程中的条件同步模式"(链接: [url]http://softwareblogs-zho.intel.com/2009/01/14/845/[/url])这篇文章中,讲到了如何减少共享队列中的锁的使用次数的具体方法,在它的基础上,可以构造出一个高效的队列池。
如果采用线程分组竞争模式(参见"多核编程中的线程分组竞争模式,链接:[url]http://blog.csdn.net/drzhouweiming/archive/2007/07/10/1684753.aspx[/url])来实现队列池,那么每组线程对应于队列池中的一个子队列,当某个线程在操作自己所属的子队列时,如果子队列为空却进行出队操作,那么此时可以从其他组线程所属的子队列中进行出队操作,这也就是"老子"一文中所说的"偷"的方法的使用。
有没有更好的方法进一步减少同步或者锁的使用呢?答案是有的。偷别人的东西总不如掏自己口袋里的东西来得方便,之所以需要"偷",乃是因为自己口袋里空空。如果大家都富裕了,口袋都鼓鼓的了,自然不需要去"偷"别人的了。
当然在计算机中,"富裕"的办法就是给每个线程赋予一个私有队列,这样每个线程可以大部分时间都操作自己私有队列,不需要同步操作,大大提高效率,这也就是"老子"一文中所说的"自私"方法的使用。
基于"偷"和"自私"两种方法,就可以设计出一个适应多核环境的分布式队列。在分布式队列中,每个操作队列的线程都有一个私有队列,另外为了解决私有队列间的负载均衡问题,还需要一个队列池来维护数据的负载均衡。
分布式队列的数据结构示意图如下:
图1:分布式队列数据结构示意图
有了上面的数据结构图,具体来实现就可以分为两个步骤:
  • 1、 实现一个队列池
  • 2、 给每个线程赋予一个私有队列
队列池的实现可以采用前面讲过方法实现,这里就不详述了,下面主要谈谈如何给每个线程赋予一个私有队列(也称作本地化队列)的详细实现方法。

转载于:https://blog.51cto.com/intelisn/130443

多核分布式队列的实现:“偷”与“自私”的运用(1)相关推荐

  1. 多核分布式队列的实现:“偷”与“自私”的运用(4)

    6. CDistributedQueue源代码 在设计CDistributeQueue类时,通常有两种方案值得考虑: 1. 本地队列预先创建好,当有线程访问时就可以直接根据线程编号去访问对应的本地队列 ...

  2. 分布式队列编程:模型、实战

    介绍 作为一种基础的抽象数据结构,队列被广泛应用在各类编程中.大数据时代对跨进程.跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在.但是,这种常见的基础性的事物往往容易被忽 ...

  3. 分布式队列编程优化篇

    "分布式队列编程"是一个系列文,之前我们已经发布了<分布式队列编程模型.实战>,主要剖析了分布式队列编程模型的需求来源.定义.结构以及其变化多样性:根据作者在新美大实际 ...

  4. 【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式队列

    前言 上文[从入门到放弃-ZooKeeper]ZooKeeper入门中,我们学习了ZooKeeper的简单安装和cli使用. 接下来我们开始基于java API的实战编程.本文先来写一个分布式队列的代 ...

  5. 使用Zookeeper共享锁和排它锁和分布式队列的原理和实现(ZkClient)

    简介 当我们分布式系统中多个节点需要访问同一共享数据,就需要加一把分布式锁,因为如果是同一进程的线程的话,完全可以采用Java的同步锁实现,但是这是多进程间的锁,所以就需要一个协调者来协调进程间的通信 ...

  6. 使用ZooKeeper实现分布式队列、分布式锁和选举详解

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/qq_40378034/ article/details/117014648 ZooKeeper源码的zookeeper-rec ...

  7. zookeeper教程,docker 安装,命令,python操作zookeeper,分布式队列,分布式锁

    docker安装zookeeper服务端 首先安装单节点的服务端,如果安装多节点的服务端,需要为每个节点配置其他节点的地址. docker run --privileged=true -d --nam ...

  8. 微信开源PhxQueue:高可用、高可靠、高性能的分布式队列**

    消息队列概述 消息队列作为成熟的异步通信模式,对比常用的同步通信模式,有如下优势: 解耦:防止引入过多的 API 给系统的稳定性带来风险:调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低 ...

  9. 浅谈 Celery 分布式队列

    Q1: Django开发Web项目时遇到一个问题,如何解决大量用户在同一时间注册,短信发送延迟的问题? A1: ① 封装一个发送短信的函数 ② 创建进程.线程.协程调用发送短信的函数 Q2: 创建的进 ...

最新文章

  1. 一文了解迁移学习经典算法
  2. Traincascade Error: Bad argument (Can not get new positive sample. The most possible reason is insuf
  3. 尝鲜党:Nexus5、6刷安卓M教程
  4. [导入]ASP.NET断点续传和多线程下载
  5. 模拟登录123026网站
  6. JUC锁-框架与基本概念(一)
  7. 2021-08-20JSP内置对象及作用域
  8. ● firewalld.service Loaded: not-found (Reason: No such file or directory)
  9. 【转载】AssetBundle资源打包加载管理
  10. vue中echarts迁徙图
  11. 三星全新贴片机SM421(S)参数性能!
  12. “学习金字塔理论”--了解,认知与实践
  13. 计算机类外文翻译论文,计算机专业毕业论文 外文翻译.doc
  14. 计算机应用基础输入法教案,计算机应用基础教案第二讲:五笔字型输入法(中职教育).doc...
  15. 公众号创建菜单报错40001及菜单出现在先前公众号上的问题
  16. MySQL安装教程包含所有平台(图解),MySQL下载步骤详解(带安装教程)
  17. 【EasyX图形库】c语言贪吃蛇-音乐-图片-界面比较美观
  18. SQLServer将日期转换成字符串格式
  19. 拍摄UFP 单一职责原则
  20. 第6期丨一周电商零售News10条(2.15-2.21)淘宝在微信“开店”/人民网评茶颜悦色被指侮辱女性/最高检重点监督直播带货

热门文章

  1. 中添加复选框_Word/excel中在方框中打钩/叉的符号,简单方便快捷
  2. c语言设计四路彩灯显示系统,四路彩灯控制器设计方案.doc
  3. oracle 的跨天查询,考勤跨天如何统计 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...
  4. linux将日期和日历信息追加到文件中_Linux常用指令
  5. mysql工作表格制作教程_Access制作复杂报表
  6. mysql dos 下切换连接_如何在dos下连接进入mysql对数据库进行操作
  7. ubuntu18 防火墙关闭_Ubuntu 18.04 关闭及开启防火墙
  8. jpa mysql存储过程_Jpa调用存储过程及参数
  9. codeforces D. Design Tutorial: Inverse the Problem
  10. 计算机组装维护文献,组装计算机论文,关于《计算机组装维护》课程教学相关参考文献资料-免费论文范文...