博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【整理】服务器编程模型
阅读量:5876 次
发布时间:2019-06-19

本文共 1370 字,大约阅读时间需要 4 分钟。

hot3.png

最近在研究服务器编程相关内容,故将看到的有用内容进行记录。
====================================
从线程的角度,可以将服务器编程分为两类:单线程和多线程。
【单线程模型】
       一个进程中只有一个线程,由于只有一个线程,所以要实现高性能,必须与 “non-blocking I/O + I/O multiplexing” 相结合,另外 libevent 本身也是单线程的。相对于多线程,单线程 server 没有线程切换以及加锁的开销,劣势是不能充分利用 CPU 的多核优势,不过,这可以通过多个进程来解决。
另外,这种模型编程也很简单,因为简单,所以是编写高性能 server 的首选。
【多线程模型】
       一个进程中有多个线程,一般来说,可以将这些线程分成两类:I/O线程和工作线程。由此又可以将多线程模型大体分成两类:单一 I/O 线程 + 多个工作线程、多个 I/O 线程(工作线程)。另外,不论是单线程,还是多线程,non-blocking I/O + I/O multiplexing 都是必选的。
(1) 单一 I/O 线程 + 多个工作线程
       这种模型下,I/O 线程负责 event loop 和 I/O 两部分,工作线程负责实际的业务逻辑处理,I/O 线程与工作线程可以通过队列/共享内存等方式进行数据交换,队列/共享内存的访问需要加锁。
实际上,这种模型本质上与上述单线程模型是类似的,只不过这里的业务逻辑交由单独的工作线程进行处理。该模型的另外一个名字是:半同步/半异步模型(HS/HA)。
 半同步-半异步(Half Sync-Half Async)
       一个侦听线程负责接收请求,并在某个队列中缓存他们。另外一组工作者线程负责处理请求。因此接收请求的线程并不是处理请求的线程。
 
(2) 多个 I/O 线程(工作线程)
       这种模型下,每个 I/O 线程都有一个 event loop ,此时工作线程可有可无,而且通常是没有,即 I/O 线程既处理 I/O ,又进行业务逻辑处理。大家熟悉的 leader/follower(L/F) 以及 muti-reactor(M-R) 模型都属于这类。其中,memcached 使用的 M-R ,ICE 使用的 L/F 。
领导者-跟随者(Leader-Follower)
       有一个线程是领导者,其余线程是这个线程的跟随者。当请求到达时,领导者首先获取请求,并在跟随者中选取一个作为新的领导者,然后继续处理请求。因此接受请求的线程就是处理请求的线程。
【小结】
个人认为:
  1. 单线程模型实现简单,如果业务逻辑不复杂,是实现高性能 server 的首选,比如 proxy 之类的 server 。
  2. HS/HA 很清晰,如果业务逻辑很复杂,比如 database ,可以考虑这种模型。
  3. 如果你想充分利用多 CPU ,当然可以考虑 L/F 或者 M-R 。但是值得一提的是,L/F 中会有锁的开销,而 M-R 中没有锁的开销,但 M-R 的线程切换的开销要高于 L/F 。根据同事的一些测试,对于短连接 L/F 的结果好于 M-R ,而对于长连接,M-R 要好于 L/F 。

转载于:https://my.oschina.net/moooofly/blog/119631

你可能感兴趣的文章
Android 好看的搜索界面,大赞Animation
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
[转]动态加载javascript
查看>>
【协议】5、gossip 协议
查看>>
基于配置文件的redis的主从复制
查看>>
hasura graphql 角色访问控制
查看>>
springmvc中controller内方法跳转forward?redirect?
查看>>
C#委托,事件理解入门 (译稿)转载
查看>>
容器的end()方法
查看>>
[转] Agile Software Development 敏捷软件开发
查看>>
HDU 1007 Quoit Design (最小点对,模板题)
查看>>
Windows Phone 7 自定义事件
查看>>
Objective-c 网址中带中文解决方法
查看>>
向函数传递数组的问题
查看>>
上班族的坐姿
查看>>
ubuntu 12.04 下面安装vmware workstation 8.0.4
查看>>
[原创]FineUI秘密花园(二十三) — 树控件概述
查看>>
【Java学习笔记】如何写一个简单的Web Service
查看>>
如何解决This system is not registered with RHN.
查看>>
Cocos2d-x学习笔记(两)Cocos2d-x总体框架
查看>>