文档章节

【整理】服务器编程模型

摩云飞
 摩云飞
发布于 2013/04/03 16:56
字数 864
阅读 265
收藏 2
点赞 0
评论 1

最近在研究服务器编程相关内容,故将看到的有用内容进行记录。


====================================

从线程的角度,可以将服务器编程分为两类:单线程和多线程。

【单线程模型】

       一个进程中只有一个线程,由于只有一个线程,所以要实现高性能,必须与 “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 。







本文转载自:http://www.cnblogs.com/hustcat/archive/2012/01/11/2319249.html

共有 人打赏支持
摩云飞
粉丝 364
博文 352
码字总数 952690
作品 0
徐汇
程序员
加载中

评论(1)

强子哥哥
强子哥哥
redis及live555都是单进程模式。
epoll相关资料整理

http://www.cppblog.com/converse/archive/2008/10/13/63928.html epoll相关资料整理 学习epoll有一段时间了,最近终于有一个服务器采用了epoll模型,从中积累了一些epoll的资料.个人感觉目前可...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

高性能服务器资料汇总

1. The C10K Problem : 传统的UNIX多进程模型在客户超过10K(即1万)的时候会遇到什么问题,以及解决方案。 (http://www.kegel.com/c10k.html) 2. 搜狗实验室关于C10K的介绍(http://www.so...

nothingfinal ⋅ 2012/04/18 ⋅ 0

事务的编程模型

在上一篇文章里面写了关于事务的一些特性,这里在谈谈事务的编程模型。什么叫做事务的编程模型,这个问题比较难以回答,其实简单的一句话,就是我们如何去使用和控制事务。在java平台里面,有...

真爱2015 ⋅ 2016/05/19 ⋅ 0

收藏的博客 -- 高性能Linux服务器

http://zhuanlan.51cto.com/columnlist/shenj/ --- 58沈剑 http://blog.csdn.net/analogouslove --- 范蠡&张小方 http://blog.csdn.net/column/details/15700.html --- teamtalk https://gi......

libaineu2004 ⋅ 2017/08/08 ⋅ 0

WebMIS v1.0.0 发布,灵活快速的自建 HMVC 框架

时隔2年的调整,WebMIS的PHP框架再次突破局限创新,整理的大量计算机编程基础知识,吸取大量php框架核心部分,自主研发了一套简洁、灵活、快速的PHP框架,提供了快速开发后台初步解决多用户、...

WebMIS ⋅ 05/22 ⋅ 0

《深入浅出Nodejs》—— 读后总结

这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完。 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs   Nodejs有几个特性:异步IO,事件...

青夜之衫 ⋅ 2017/12/04 ⋅ 0

CN Erlounge IV tweets

前言 本文整理了Erlounge IV Erlang杭州开发者大会现场的记录的Tweets列表,建议先到 http://ecug.org/agenda/ 下载演讲文档,以便理解上下文。 Twitter的优势是小之美,整理成一篇大文章比较...

TimYangNet ⋅ 2009/11/14 ⋅ 0

对话 Jessica Hamrick:和 Django 的情缘是我前行的动力

本文出自 Your Django Story 系列,该系列主要突出那些贡献 Django 的女性。点击查看更多,本文系 OneAPM 工程师编译整理。 Jess Hamrick 是加州大学伯克利分校心理学系研究生,其研究包括通...

OneAPM蓝海讯通 ⋅ 2015/12/18 ⋅ 0

Linux多线程并发服务器编程(线程池,FTP服务器)

分享网盘下载:https://pan.baidu.com/s/1gfNCcXt 密码: irfk 内容简介 本课程从最基础的进程、线程概念讲起逐步深入,通过理论与实践结合的方式,使学员快说掌握linux多线程网络编程技术,并...

人气王子333 ⋅ 2017/11/13 ⋅ 0

【掘金小报】 第十五期 用 slack 和 hubot 搭建你自己的运维机器人

掘金小报主打分享优质深度技术内容,技术内容分:前端、后端、Android、iOS、产品设计、工具资源和一些有趣的东西。 与标题相关文章为最后一篇文章。 前端 【译】带你入门 CSS Grid 布局 三月...

膜法小编 ⋅ 2017/05/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 18分钟前 ⋅ 0

Java学习路径及练手项目合集

Java学习路径及练手项目合集

颖伙虫 ⋅ 34分钟前 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 59分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部