Linux C++服务器程序设计范式
《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++服务器程序设计范式的更多相关文章
- Linux客户/服务器程序设计范式1——并发服务器(多进程)
引言 本文会写一个并发服务器(concurrent server)程序,它为每个客户请求fork出一个子进程. 注意 1. 信号处理问题 对于相同信号,按信号的先后顺序依次处理.可能会产生的问题是,正 ...
- Linux客户/服务器程序设计范式2——并发服务器(进程池)
引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求.子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无 ...
- UNP学习笔记(第三十章 客户/服务器程序设计范式)
TCP测试用客户程序 #include "unp.h" #define MAXN 16384 /* max # bytes to request from server */ in ...
- UNP服务器设计范式总结
一:客户端 本章总结的服务器程序设计范式,使用同一个客户端程序进行测试.个连接.使用的命令如下: client 206.62.226.36 8888 5 500 4000 二:结论 上图测量 ...
- linux并发服务器设计
linux 并发服务器: http://blog.csdn.net/ygl840455828ygl/article/details/52438167 http://www.2cto.com/os/20 ...
- Windows上管理远程Linux VPS/服务器文件工具 - winscp
Linux上经常会经常需要编辑文件,特别是Linux VPS/服务器安装好系统之后配置环境会需要修改很多的配置文件等,对于常用Linux的基本上都能够熟练使用vi或者nano等SSH下面的文件编辑工具 ...
- Linux生产服务器Shell脚本分享
Linux生产服务器Shell脚本分享 2012-6-6 86市场网 linux 作为一名Linux/unix系统管理员,我经常遇到人问这个问题:shell能做什么?PHP这么强大,为什么不用PHP来 ...
- Linux邮件服务器架构
// 上面的过程只是实现了简单的本地用户的文件发送功能,只需要安装mailutil,不需要安装配置sendmail,看鸟哥的Linux私房菜中写的应该是本地用户发送邮件不需要sendmail.只有当非 ...
- Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw
负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesa ...
随机推荐
- sadfa
2015/03/16 星期一 在Android平台下编写客户端程序,界面只有开关若干个. 代码更新与3.17号 mainActivity.java: package com.fan.m ...
- Codeforces 264B 数论+DP
题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...
- 【转】谁说Vim不是IDE?(一)
谁说Vim不是IDE?(一) 话说操作系统.编程语言和编辑器似乎是程序员永恒的吐槽话题,技术发展了几十年,大家讨论起这几个“之争”还是充满愤怒.津津乐道.有人描述过Emacs和VI程序员,大家沿着 ...
- 35个jquery技巧[转]
人人都会的35个Jquery小技巧 2015-10-28 WEB开发者 收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(fun ...
- tomcat+spring+https
由于开发的接口需要ios调用,而ios即将只支持https,所以最近研究了一下,将成果放在这里记录一下: .配置tomcat的https: 原文链接:http://jingyan.baidu.com/ ...
- JMeter入门(2):一个简单实例
场景描述: 自己建立一个服务器端,接受参数:name和age,并将这些数据保存到数据库中: http://localhost:8080/Server/SaveServlet?name=xxx& ...
- sql优化-hint的作用
目前,oracle采用的是CBR优化器,所以在有些时候,机器会按照自己的意愿去执行sql,当然oracle是根据本身的一些信息来做决定的,比如:统计信息.但有些时候,机器并不一定会按照我们预想的那样去 ...
- [Oracle] - 性能优化工具(5) - AWRSQL
在AWR中定位到问题SQL语句后想要了解该SQL statement的详细运行计划,于是就用AWR报告中得到的SQL ID去V$SQL等几个动态性能视图中查询,但发现V$SQL或V$SQL_PLAN视 ...
- C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏
参考链接:http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html 学过C++的人都知道在类Base中加了Virtual关键字的函 ...
- C# winform线程的使用 制作提醒休息小程序(长时间计算机工作者必备)
最近发现日常的工作中,经常因为敲代码而忘记了休息,晚上眼睛特别的累. 并且经常长时间看着显示器,对眼睛一定是不好的,所以今天开发了一个小程序,用于提醒休息. 下面先看看运行效果: 1.程序启动后,后台 ...