网络编程模型综述 之 多线程模型

每个连接对应一个线程

         一个网络socket对应一个处理线程,socket采用阻塞I/O模型;

         这种模型是小程序和java常用的策略,对于交互式的长连接应用也是常见的选择(比如BBS),也常用来做内部服务器交互的模型。这种策略很难满足高性能程序的需求,好处是实现极其简单,容易嵌入复杂的交互逻辑。Apacheftpd等都是这种工作模式。

线程池

线程池一般有两种模式:Half-Sync/Half-Async模式和Leader/Followers模式

半同步、半异步模式(Half-Sync/Half-Async

         这种模式有三部分组成:异步事件接收层、事件同步队列、同步事件处理层;

         其中,异步事件接收层为一个线程,同步事件处理层可以有多个线程;

         它的工作流程很清晰:

1.       异步线程负责检查网络的异步事件;

2.       发生网络事件时,异步线程把网络事件放入事件队列;

3.       同步线程从队列中获取网络事件,并执行同步的读或写操作;

2009年5月29日 - 彭卫 - Tech-Oriented

这个过程需要注意的是,不要引起两个同步线程同时接收或发送一个socket的情况。

领导者、追随者模式(Leader/Followers

         这种模式与Half-Sync/Half-Async完全不同,没有事件队列,没有固定的事件接收者,每个线程都是事件接收者,也是处理者;

         Leader/Followers的流程:

1.       准备若干个线程用来处理大量的事件;

2.       有一个线程作为Leader,等待事件的发生;其他的线程作为Follower,仅仅是睡眠;

3.       有事件需要处理时,如果Leader能很快处理掉,Leader会再次进入等待状态;

4.       如果Leader不能马上处理完,Leader则从Followers中指定一个新的Leader,自己去处理事件,不再当Leader;

5.       被唤醒的Follower作为新的Leader等待事件的发生;

6.       处理事件的线程处理完毕以后,就会成为Follower的一员,直到被唤醒成为Leader;

IOCP就是典型的L/F的工作模式,当线程1GetQueuedCompletionStatus这里返回后,如果线程1的处理过程没有超过某个时间段,而是很快就返回,之后继续GetQueuedCompletionStatus,那OS会让新到的数据从线程1GetQueuedCompletionStatus获取,这样就减少了线程的CONTEXT切换代码;反之,如果线程1处理时间比较长,那么新到的数据将会由线程2GetQueuedCompletionStatus获得;

多进程模型

         一个客户端对应一个进程来处理,也是一种历史悠久的网络模型,linux的典型例子就是inetd服务。这种方式用来处理间断性内部数据处理时,比其常驻内存的stand-alone模式更节省系统资源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值