POSA2读书笔记(二)

呵呵,距离第一篇已经过了半年了……这本书其实翻完已经很久了,但是实践中没有使用到的东西总是一知半解,写出来会误导大众,所以还是不写的好。
今天在为Cindy 3.0a1中并发模型设计头痛的时候,翻了翻这本书中的相关模式,突然有种豁然开朗的感觉:)
Half-Sync/Half-Async:这个模式是从Cindy 1.x一直沿用下来的模式,我估计也是基于NIO的网络应用里面最常用的并发模型。简单的用伪码说:
while (select() > 0) {
    getReadyEvents();
    deactiveEvents();
    addEventsToQueue();
}
网络IO线程不停的select,并把发生的事件添加到某个队列;若干个工作线程并行的从该队列中取的相应的事件,并分发给应用。网络IO线程是串行化的,而工作线程是并行的,所以这个模式就叫半同步/半异步模式。
Leader/Followers:这是今天才豁然开朗的模式:) 在上面的半同步/半异步模式中,瓶颈主要有三处:
  • 动态内存分配。网络IO线程把事件添加到队列,工作线程从队列中取事件,不停的有添加删除操作,队列大小在不停的发生变化。
  • 多同步操作。在对队列进行添加和删除操作时需要对队列进行同步(或者是在队列内部进行同步),同时各个工作线程之间从队列中取相应事件时需要同步。
  • 线程切换:需要不停的在网络IO线程和各工作线程之间做语境切换。比如假设首先所有的工作线程都处于等待状态,这时来了某一个事件,工作线程A被唤醒,去处理该事件;然后又来一个事件,工作线程B被唤醒,去处理该事件;A工作完又回到等待状态,然后又被唤醒……

那么领导/追随模式是怎么样来避免上面的这三个瓶颈呢?

首先领导线程在通过select得到了许多的响应事件,然后领导线程把其中一个从selector上移除,并把一个追随线程提升为领导线程,然后自己就变成了工作线程处理该事件,等到事件处理完成后再变成追随线程或领导线程(如果结束时已经没有可用的领导线程的话)。

这个模式不需要进行动态内存分配,同步操作也比上一个模式少很多,由于领导线程直接变成工作线程处理事件,最大程度的减少了线程切换,所以上面那三 个瓶颈都能够得到很好的解决。但是这个模式也有相应的缺点:实现复杂,不像半同步/半异步模式能非常简单的实现。所谓有得必有失呀:)

这里可以做一个简单的比喻为两种模式做一下总结。场景是把一堆书从A地经过B地搬到C地(我想不到其他好的例子)。

如果是半同步/半异步模型的话,就是有一个人负责把书从A地搬到B地,其余的人在B地等着,一旦B地书来了,就把书再搬到C地。

如果是领导/追随者模型的话,则是所有的人都在A地排队等待,每个人搬一本送到C地,然后回来排到队伍的最后面。(领导/追随者模型并没有规定次序,所以回来后不一定是排在队伍的最后面,反而是非常有可能排在队伍的第二个位置,这样可以提升系统性能)

cindy POSA2读书笔记(二)相关推荐

  1. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  2. 《How Tomcat Works》读书笔记(二)

    <How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对ser ...

  3. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  4. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  5. 《Introduction To Modern Cryptography》读书笔记二

    <Introduction To Modern Cryptography>读书笔记二 本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得 ...

  6. 《李元芳履职记》读书笔记二 IT技术管理的沟通与团队建设

    <李元芳履职记>读书笔记二 接一 https://blog.csdn.net/qq_45937199/article/details/103305223 IT技术人员从技术岗走向管理岗,所 ...

  7. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  8. 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过"一个好的东西往往是是说不清楚的",姑且不论这句话的对与错.但我真的很佩服<淘宝技术这十年>这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各 ...

  9. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

最新文章

  1. linux守护实例有什么用,linux中的信号及进程守护的应用实例分享
  2. 我作为开发者犯过的两次愚蠢的错误
  3. echarts中树图的label的点击_ECharts 堆积木(砖块)游戏
  4. DCMTK:演示状态查看器-打印服务器
  5. python模拟上传多张图片
  6. 【Level 08】U06 Good Feeling L4 The surprising event
  7. 原生DOM选择器querySelector和querySelectorAll
  8. html布局四个正方形,分享一个css小技巧,实现给正方形的四个角设置小方块的方法...
  9. es的分片数量和扩展性分析
  10. 【Rust学习笔记】Rust生命周期参数的详细阐述
  11. PS调出唯美紫蓝色天空背景女生照片
  12. ps:HSB色彩模式
  13. JAVA试练塔之试炼技能图
  14. 手把手教你R语言CIBERSORT计算免疫浸润+Rproject的使用
  15. CDN的加速域名、源站地址与回源host之间的关系
  16. 关于eclipse导入项目后架包找不到问题
  17. 《那些年啊,那些事——一个程序员的奋斗史》——47
  18. 送给孩子的10句人生箴言
  19. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)
  20. 打开桌面计算机投屏到扩展屏,win10电脑桌面投屏到电视教程_Win10电脑怎么投屏到电视...

热门文章

  1. 关于鼠标连续点击脚本的分享
  2. XenDesktop测试小结
  3. QML Repeater
  4. 前端基础 Web网页标准
  5. 剑指offer刷题(一刷)笔记 2019.12.15
  6. 科蒂斯控制器故障代码_科蒂斯控制器故障代码
  7. JavaScript中将对象按照某个属性排序
  8. LVS模式一:DR模式(ipvsadm)
  9. Rollup【ESM打包工具】
  10. 超级产品:用户只看不买的网红书店,为什么还没破产?