《Unix网络编程》30章详细介绍了几种服务器设计范式。总结了其中的几种,记录一下;

  多进程的做法:

  1.每次创建一个新的请求,fork一个子进程,处理该连接的数据传输。

  2.预先派生一定数量的子进程,每个子进程都调用accept接收连接请求。当一个请求到来之后会触发所有进程的accept,但是只有最先的子进程会处理该请求。这就是所说的“惊群”。

  3.为了解决“惊群”,在各个子进程的accept前后都用线程的互斥锁来做同步保护。一般来说互斥锁用于线程之间的同步,但是也可用作多个进程之间同步,具体用法参考链接。http://blog.csdn.net/dlutbrucezhang/article/details/8834387

  和多进程的做法相对应,只是线程更轻,理论上开销更小。

  1.每次创建一个新的请求,fork一个子线程,处理该连接的数据传输。

  2.预先派生一定数量的子线程,每个子进程都调用accept接收连接请求。当一个请求到来之后会触发所有线程的accept,但是只有最先的子线程会处理该请求。这就是所说的“惊群”。

  3.为了解决“惊群”,在各个子线程的accept前后都用线程的互斥锁来做同步保护。

  一般来说,第一种方法可以对付一般的连接请求量,比如我研究生科研做的每次就我一个人访问的,或者我和老师同时访问的一个小型服务器,这样的足够了。第三种就比较好了,响应非常迅速,时间上差不多比第一种快了十倍以上,而且第三种编码也比较简单。

  这本书上还提供了对文件加锁,主线程accept传递给子线程等等办法,编码都比较麻烦,效果也一般。

  另外之前我的博客http://www.cnblogs.com/shenshenlei/p/5535853.html 中提到epoll 的问题。其实那个源代码中派生几个线程,每个线程都是epoll_wait,这个编码和在多线程中accept非常相似,但是也没有用到互斥量做线程安全。参考链接https://rocfang.gitbooks.io/dev-notes/content/acceptyu_epoll_liang_qun.html给出了关于该问题的一些描述,“accept 已经不存在惊群问题,但 epoll 上还是存在惊群问题。即,如果多个进程/线程阻塞在监听同一个 listening socket fd 的 epoll_wait 上,当有一个新的连接到来时,所有的进程都会被唤醒。”如作者所说,关于此问题nginx给出的解决方案也是加一个互斥锁。

  (2016-6-2 15:21:01再次更新)

  在Linux2.6内核中已经解决了accept导致的惊群问题。   

  在Linux3.9内核中提出了要解决epoll_wait惊群问题,而且在内核4.5中,正式得到解决。在这个版本中添加了一个EPOLLEXCLUSIVE 标记。内核代码根据此标记为会有选择性的唤醒一个阻塞在epoll_wait上的进程(线程)。但显然这个版本距离大规模的使用还有很遥远的距离。参考链接:https://github.com/torvalds/linux/commit/df0108c5da561c66c333bb46bfe3c1fc65905898

参考链接:

  http://blog.csdn.net/dlutbrucezhang/article/details/8834387

  http://www.cnblogs.com/shenshenlei/p/5535853.html

  https://rocfang.gitbooks.io/dev-notes/content/acceptyu_epoll_liang_qun.html

  

  

Linux C++服务器程序设计范式的更多相关文章

  1. Linux客户/服务器程序设计范式1——并发服务器(多进程)

    引言 本文会写一个并发服务器(concurrent server)程序,它为每个客户请求fork出一个子进程. 注意 1. 信号处理问题 对于相同信号,按信号的先后顺序依次处理.可能会产生的问题是,正 ...

  2. Linux客户/服务器程序设计范式2——并发服务器(进程池)

    引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求.子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无 ...

  3. UNP学习笔记(第三十章 客户/服务器程序设计范式)

    TCP测试用客户程序 #include "unp.h" #define MAXN 16384 /* max # bytes to request from server */ in ...

  4. UNP服务器设计范式总结

    一:客户端 本章总结的服务器程序设计范式,使用同一个客户端程序进行测试.个连接.使用的命令如下: client  206.62.226.36  8888  5  500  4000 二:结论 上图测量 ...

  5. linux并发服务器设计

    linux 并发服务器: http://blog.csdn.net/ygl840455828ygl/article/details/52438167 http://www.2cto.com/os/20 ...

  6. Windows上管理远程Linux VPS/服务器文件工具 - winscp

    Linux上经常会经常需要编辑文件,特别是Linux VPS/服务器安装好系统之后配置环境会需要修改很多的配置文件等,对于常用Linux的基本上都能够熟练使用vi或者nano等SSH下面的文件编辑工具 ...

  7. Linux生产服务器Shell脚本分享

    Linux生产服务器Shell脚本分享 2012-6-6 86市场网 linux 作为一名Linux/unix系统管理员,我经常遇到人问这个问题:shell能做什么?PHP这么强大,为什么不用PHP来 ...

  8. Linux邮件服务器架构

    // 上面的过程只是实现了简单的本地用户的文件发送功能,只需要安装mailutil,不需要安装配置sendmail,看鸟哥的Linux私房菜中写的应该是本地用户发送邮件不需要sendmail.只有当非 ...

  9. Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

    负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesa ...

随机推荐

  1. Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd

    题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★   输入文件:butter.in   输出文件 ...

  2. MySQL DBA修炼秘籍

    0.导读 本文主要写给那些立志成为MySQL DBA,以及正在学习MySQL的同行们,结合个人及业内其他同行的职业发展经历给大家一些参考,如何成为合格的MySQL DBA. 1.什么是MySQL DB ...

  3. RGB同步信号 DCLK/HS/VS/DE信号介绍

    来源:  http://www.cnblogs.com/general001/articles/3721683.html 只要是数字信号处理电路,就必须有时钟信号.在液晶面板中,像素时钟是一个非常重要 ...

  4. poj 2553 The Bottom of a Graph【强连通分量求汇点个数】

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9641   Accepted:  ...

  5. DrawerLayout和toolbar的使用

    onPostCreate()是Activity完全启动后的调用:在完全启动后的回调设置toolbar 然后在使用 AppCompatActivity 时style要设置为何appCompat相关的样式 ...

  6. SecureCRT 无法删除字符

    1. 2.

  7. eclipse中使用tomcat图解

    配置步骤: 1. tomcat7是绿色软件,解压后即可使用,请大家先将tomcat解压到合适的位置(建议整个路径都是英文路径), 2. 打开eclipse,菜单栏下,File--New--Other. ...

  8. myeclipse building workspace如何禁止及提高myeclipse速度

    大家一定对building workspace时那缓慢的速度给困扰到了吧~ 其实只要把project选项里的 building automatically前的勾去掉,就可以快很多了.. 另外大家一定对 ...

  9. WPF passwordbox 圆角制作

    将以下节点复制到app.xaml的<Application.Resources>节点下 <Style TargetType="PasswordBox">   ...

  10. 距离矢量路由协议举例——RIP

    1. 工作原理 •RIP 是一种分布式的基于距离矢量的路由选择协议. •RIP 协议要求网络中的每个路由器都要维护从它自己到其它每个目的网络的距离记录. •RIP 协议中的"距离" ...