这里提到的两个设计模式都是用于高并发系统(例如一个高性能的网络服务器)的。这里我只是简单地提一下:   
1. 半同步/半异步(half-sync/half-async ):

三、
半同步-半异步模型
http://www.cppblog.com/liangairan/articles/62917.html?opt=admin
1. 话说一个地方有一群有组织无纪律的人从事山贼这个很有前途的职业。
2. 他们有一个山贼头头,他专门负责望风,其他的喽罗待命。
3. 假如发现有落单的过往客商,山贼头头会到路口拦路,让客商双手抱头蹲在地上,然后让一个小喽罗为这个倒霉鬼"服务"。
4. 假如客商很多,山贼头头会让客商在地上蹲成一排(严肃点,排队啦,打劫啦)。 一群小喽罗挨个为大家"服务"。
5. 头头的工作很重要,对于每个客商他都不会花费太多时间,拦路以后,他会让客商排队等待打劫。
6. 过往客商太多而山贼数量不够,客商的排队可能需要等待较长的时间。

在网 上一份资料 中引用了一本貌似很经典的书 里的比喻: 
”  
许多餐厅使用 半同步/半异步 模式的变体。例如,餐厅常常雇佣一个领班负责迎接顾客,并在餐厅繁忙时留意给顾客安排桌位, 
为等待就餐的顾客按序排队是必要的。领班由所有顾客“共享”,不能被任何特定顾客占用太多时间。当顾客在一张桌子入坐后, 
有一个侍应生专门为这张桌子服务。  
“   
按照另一份似乎比较权威的文档的描述,要实现半同步/半异步模式,需要实现三层:异步层、同步层、队列层。因为很多操作 
采用异步方式会比较有效率(例如高效率的网络模型似乎都采用异步IO),但是异步操作的复杂度比较高,不利于编程。而同步 
操作相对之下编程要简单点。为了结合两者的优点,就提出了这个模式。而为了让异步层和同步层互相通信(模块间的通信),系 
统需要加入一个通信队列。异步层将操作结果放入队列,同步层从队列里获取操作结果。   
回过头来看看我之前写的那个select网络模型代码,个人认为基本上算是一个半同步半异步模式的简单例子:Buffer相当于通信 
队列,网络底层将数据写入Buffer,上层再同步地从该队列里获取出数据。这样看来似乎也没什么难度。 = =   
关于例子代码,直接引用iunknown给的:   
//这就是一个典型的循环队列的定义,iget 是队列头,iput 是队列尾</STRONG>    
int clifd[MAXNCLI], iget, iput;     
int main( int argc, char * argv[] )    
{    
  ......    
  int listenfd = Tcp_listen( NULL, argv[ 1 ], &addrlen );    
  ......    
  iget = iput = 0;    
  for( int i = 0; i < nthreads; i++ ) {    
    pthread_create( &tptr.thread_tid, NULL, &thread_main, (void*)i );    
  for( ; ; ) {    
    connfd = accept( listenfd, cliaddr,, &clilen );    
    clifd[ iput ] = connfd;     // 接受到的连接句柄放入队列</STRONG>    
    if( ++iput == MAXNCLI ) iput = 0;      
  }    
}    
void * thread_main( void * arg )    
{    
  for( ; ; ) {    
    while( iget == iput ) pthread_cond_wait( ...... );    
    connfd = clifd[ iget ];     // 从队列中获得连接句柄</STRONG>    
    if( ++iget == MAXNCLI ) iget = 0;    
    ......    
    web_child( connfd );    
    close( connfd );    
  }    
}   


http://blog.csdn.net/cjfeii/article/details/17267487

1.动机:

众所周知,同步模式编程简单,但是I/O的利用利率低;而异步模式编程复杂,但是I/O利用率高。
综合同步异步的有优点,就有了半同步半异步的设计模式。

这个模式中,高层使用同步I/O模型,简化编程。低层使用异步I/O模型,高效执行。

half sync/half async可以很好的使得"变成复杂度"和"执行效率"之间达到一种平衡.

2.应用场景:

半同步半异步模式在下面的场景中使用:

2.1 一个系统中的进程有下面的特征:

系统必须响应和处理外部异步发生的事件,
如果为每一个外部资源的事件分派一个独立的线程同步处理I/O,效率很低。
如果上层的任务以同步方式处理I/O,实现起来简单。

2.2 一个或多个任务必须在单独的控制线程中执行,其它任务可以在多线程中执行:

上层的任务(如:数据库查询,文件传输)使用同步I/O模型,简化了编写并行程序的难度。
而底层的任务(如网络控制器的中断处理)使用异步I/O模型,提供了执行效率。

一般情况下,上层的任务要比下层的任务多,使用一个简单的层次实现异步处理的复杂性,可以对外隐藏异步处理的细节。另外,同步层次和异步层次任务间的通信使用一个队列来协调。

3.实现方案:

可以分为三层:同步任务层,队列层,异步任务层。

3.1 同步任务层(用户级的进程):

本层的任务完成上层的I/O操作,使用同步I/O模型,通过队列层的队列中传输数据。和异步层不同,同步层的任务使用活动对象执行,这些活动对象有自己运行栈和寄存器状态。当执行同步I/O的时候,他们会被阻塞/睡眠。

3.2 队列层:

这个层在同步任务层和异步任务层之间,提供了同步控制和缓存的功能。异步任务的I/O 事件被缓存到消息队列中,同步任务层在队列中提取这些事件(相反方向亦然)

3.3 异步任务层:

处理低层的事件,这些事件由多个外部的事件源产生(例如网卡,终端)。和异步任务不同,此层的实体是被动对象,没有自己的运行栈,要求不能被阻塞。

4.优缺点:

4.1 半同步半异步模式有下面的优点:

上层的任务被简化
不同层可以使用不同的同步策略
层间的通信被限制在单独的一点,因为所有的交互使用队列层协调。
在多处理器环境中提高了性能。

4.2 半同步半异步模式有下面的缺点:

跨边界导致的性能消耗,这是因为同步控制,数据拷贝和上下文切换会过度地消耗资源。

上层任务缺少异步I/O的实现。



2 .领导者/追随者(Leader/Followers):     


领导者-追随者模型
http://www.cppblog.com/liangairan/articles/62917.html?opt=admin

打比方:
1. 话说一个地方有一群有组织无纪律的人从事山贼这个很有前途的职业。
2. 一般就是有一个山贼在山路口察看,其他人在林子里面睡觉。
3. 假如发现有落单的过往客商,望风的山贼就会弄醒一个睡觉的山贼,然后自己去打劫。
4. 醒来的山贼接替作望风的事情。
5. 打劫的山贼搞定以后,就会去睡觉,直到被其他望风的山贼叫醒来望风为止。
6. 有时候过往客商太多,而山贼数量不够,有些客商就能侥幸平安通过山岭(所有山贼都去打劫其他客商了)。

计算机版本
1. 有若干个线程(一般组成线程池)用来处理大量的事件
2. 有一个线程作为领导者,等待事件的发生;其他的线程作为追随者,仅仅是睡眠。
3. 假如有事件需要处理,领导者会从追随者中指定一个新的领导者,自己去处理事件。
4. 唤醒的追随者作为新的领导者等待事件的发生。
5. 处理事件的线程处理完毕以后,就会成为追随者的一员,直到被唤醒成为领导者。
6. 假如需要处理的事件太多,而线程数量不够(能够动态创建线程处理另当别论),则有的事件可能会得不到处理。
同样,给出别人引用的比喻:  
”  
在日常生活 中,领导者/追随者模式用于管理 许多飞机场出租车候车台。在该用例中,出租车扮演“线程”角色,排在第一辆的出  
租车成为领导者,剩下的出租车成为追随者。同样,到达出租车候车台的乘客构成了必须被多路分解给出租车的事件,一般以先进  
先出排序。一般来说,如果任何出租车可以为任何顾客服务,该场景就主要相当于非绑定句柄/线程关联。然而,如果仅仅是某些  
出租车可以为某些乘客服务,该场景就相当于绑定句柄/线程关联。  
“    
其实这个更简单,我记得<unix网络编程>中似乎提到过这个。总之有一种网络模型(connection-per-thread?)里,一个线程用于  
accept连接。当接收到一个新的连接时,这个线程就转为connection thread,而这个线程后面的线程则上升为accept线程。这里,  
accept线程就相当于领导者线程,而其他线程则属于追随者线程。    
iunknown 的例子代码:    
int listenfd;    
int main( int argc, char * argv[] )    
{    
  ......    
  listenfd = Tcp_listen( NULL, argv[ 1 ], &addrlen );    
  ......    
  for( int i = 0; i < nthreads; i++ ){    
    pthread_create( &tptr
.thread_tid, NULL, &thread_main, (void*)i );    
  }    
  ......    
}    
void * thread_main( void * arg )    
{    
  for( ; ; ){    
    ......    
    // 多个线程同时阻塞在这个 accept 调用上,依靠操作系统的队列</STRONG>    
    connfd = accept( listenfd, cliaddr, &clilen );    
    ......    
    web_child( connfd );    
    close( connfd );    
    ......    
  }    
}

半同步半异步模式以及Leader_Follwer模式相关推荐

  1. Linux网络编程 | 并发模式:半同步/半异步模式、领导者/追随者模式

    文章目录 同步与异步 半同步/半异步模式 变体:半同步/半反应堆模式 改进:更高效的半同步/半异步模式 领导者/追随者模式 组件 :句柄集.线程集.事件处理器 并发模式是指I/O处理单元和多个逻辑单元 ...

  2. Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者

    文章目录 两种服务器模型及三个模块 C/S模型 P2P模型 I/O处理单元.逻辑单元.存储单元 并发 同步与异步 半同步/半异步模式 变体:半同步/半反应堆模式 改进:高效的半同步/半异步模式 领导者 ...

  3. 高效的半同步/半异步模式的实现

    先介绍一下半同步/半异步模式: 首先半同步/半异步模式中的同步和异步和前面的IO模型中的同步和异步是完全不用的概念.在IO模型中,同步和异步区分的是内核向应用程序通知的是何种IO事件(是就绪事件还是完 ...

  4. 半同步半异步模式 -------一个架构模式,清晰的结构,高效并发的I/O

    译者: cuichaox@gmail.com 英文原文: http://www.cs.wustl.edu/~schmidt/PDF/HS-HA.pdf http://www.cs.wustl.edu/ ...

  5. 两种并发模式:半同步半异步 领导者追随者

    介绍 半同步半异步     介绍     变体        半同步半反应堆        高效的半同步半反应堆  领导者追随者     介绍     实现       组成       过程   优 ...

  6. 半同步/半异步模式和领导者/追随者模式

    这两种都是高效的并发模式. 半同步半异步模式: 出现原因: 异步线程执行效率高,但是编写复杂,同步线程效率低,但是逻辑简单.服务器要求好的实时性和同时处理多用户的请求,英雌采用两者结合的形式. 具体情 ...

  7. 两种高效的并发模式:半同步/半异步模式、领导者/追随者模式

    文章目录 半同步/半异步模式(half-sync/half-async) 半同步/半反应堆(half-sync/half-reactive)模式 相对高效的半同步/半异步模式 领导者/追随者模式(Le ...

  8. 两种高效的并发模式:半同步/半异步和领导者/追随者

    这不仅仅两个山贼的故事! 先介绍下关系: 下面开始讲故事: 1.领导者/追随者模型: 故事: 话说一个地方有一群有组织无纪律的人从事山贼这个很有前途的职业. 一般就是有一个山贼在山路口察看,其他人在林 ...

  9. 领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型

    领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型都是常用的客户-服务器编程模型.这几天翻了些文章,发现对领导者/追随者模型说的比较 ...

最新文章

  1. BCH(比特币现金)的货币流通速度是BTC的6倍
  2. 基于 Spring Boot 的车牌识别系统(附项目地址)
  3. Graph Search就是语义搜索
  4. scala 的39个关键字
  5. 基于java实现农产品_基于微信小程序的个人商铺(农产品)设计与实现毕业论文+开题报告+前后台源码(JavaSSM+Mysql)+文献资料...
  6. numpy使用MKL库提升计算性能
  7. display:inline-block的深入理解
  8. Java 9代码工具:使用Java微型基准测试工具的实践会话
  9. 30分钟,让你成为一个更好的程序员
  10. Object_clone
  11. php如何安装源码包,php源码包安装步骤是什么
  12. docker下配置linux7.2
  13. 【Excel】根据空格拆分单元格
  14. 他只靠写代码,登上了胡润富豪榜!
  15. Win10企业版系统安装 NET Framework 4.8的时候提示错误信息
  16. 一分钟带你了解全链路测试
  17. TCP/IP、 IXP/SPX、 NetBEUI、 AppleTalk协议
  18. input单选框 复选框 点选不上 选不中
  19. python 如何爬虫wind api数据_Python网络爬虫实战之十:利用API进行数据采集
  20. mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)

热门文章

  1. 有机能量棒行业调研报告 - 市场现状分析与发展前景预测
  2. python读xml文件生成.h头文件_PYTHON读写xml文件的方法
  3. 极域工具包 1.1正式发布!窗口化极域,解键盘锁,适配学生机房管理助手7.4-7.5!
  4. TCP与UDP的原理
  5. 【c#】继承和多态的一点知识点
  6. 数据结构约瑟夫环实验报告
  7. C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码
  8. 分享一个云端电脑(让你的电脑少装几十款软件)
  9. Unity Pro 2018 for Mac(游戏开发工具)
  10. 180°和360°伺服电机速度控制,转向控制Arduino代码与库(亲测可用)