网络编程资源

高性能 Socket 组件 HP-Socket v3.2.1-RC1 发布

http://bbs.csdn.net/topics/390763397

 

 

The C10K problem  高性能服务器设计

http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html

http://blog.sina.com.cn/s/blog_4aec22920100itkf.html

 

这周看了Dan Kegel那篇"The C10K problem",以下和大家分享一下。

故名思义,这文章是分析如果编写一个服务器程序来支持上万的客户端连接的。
其关注的重点是io效率,目前大规模网络程序的关键瓶颈。

作者认为需要权衡利弊的要点有以下

1.单线/进程处理多个I/O的做法: 其可选的方案有
 

a. 不这样做。 也就是对单线程使用阻塞同步的IO(意为依靠多线/进程来处理多个IO)。
    b. 使用非阻塞IO。 即以非阻塞方式启动IO,并等待IO就绪通知(select / poll等,通常对网络IO有效,但不能提高磁盘IO的效率)
    c. 使用异步IO。 调用 aio_write启动IO,并等待IO的完成通知。

2.如果管理client连接
    a. 一个进程处理一个client (经典unix方式)
    b. 一个OS-level线程处理多个client, 对应每个client使用一个user-level线程(即线程库,虚拟机提供的线程,协同等方式)
    c. 一个OS-level线程处理一个client (java的内置线程等)
    d. 一个OS-level线程处理一个活跃的client

3. 是否使用标准OS服务,还是把依靠具体OS内核

以上的选择互相组合,产生一些常见解决方案.

1. 单线程处理多client,使用非阻塞IO 和水平触发的就绪通知

**水平触发(level-trigger)与边界触发(edge-trigger)对应,简要说水平触发意为根据状态
也判断是否触发某事件, 而边界触发根据变化来判断是否触发某事件。

也就是传统的io多路复用,这是目前大部分网络程序的解决方式,它可以方便的在一个线程里管理多个
io。不需要考虑多线/程等问题, 代码的逻辑不需要加入额外的复杂性。

但这里所指的非阻塞,是指在某个fd未就绪时的read或write操作, 程序不等待它的就绪而已。
这边存在上面说对于磁盘IO并没有提高效率的问题。
在大规模地对磁盘读写操作时, read 或write还是会导致整个程序长时间阻塞。

如果要避免这种情况,必须引入异步IO。 对于部分缺乏AIO的系统,就只能建立子线/进程来完成该操作。
另外一种对磁盘IO的优化方式是使用 内存映像IO。

这种方式的关键是判断一组非阻塞的socket何时处于就绪状态。
实现它们的方法有 select, poll, dev/poll 等。


2. 单线程处理多client,使用非阻塞IO 和就绪变化通知

意为使用边界触发的就绪通知。其实这种方案只是1的加速方式, 即只在fd状况发生变化时
才去检查fd是否变为就绪。这种实现必须去处理假事件,因为有些实现方式是fd接到任何包的时候都假定其变为就绪了。

实现它们的有 kqueue, epoll(指定ET模式)等。

一些通用的库如libevent ACE等,把这些底层不同实现封装起来,并提供不同IO策略的选择。 按照
libevent作者Niels的测试数据 kqueue在所有之中性能最高。

3. 多个线程处理多个client, 使用异步IO


这是对于网络IO和磁盘IO都很高效的方式。通常当异步IO发起后, 它使用边界触发的方式来提供IO的完成通知。
然后把完成的通知放到消息队列里,等待程序的后续相应。

但这需要os提供AIO的支持,并且需要以异步的方式来设计程序,有一定复杂性。

4. 多个线程处理client

这是最简单方式,就是让但进/线程 的read 和 write 直接阻塞。
这个方法的最大缺点是, 需要支付每个进/线程的栈空间,并引入额外的上下文切换的开销。
如果需要上万个client, 建立上万的进/线程目前是不太可能的。

5. 把服务器整合到os内核里
    部分系统有这样的尝试,例如Liunx下的 khttpd 就是把web服务器整合到
系统内核里。 但这对我们的游戏参考价值不大。

 

转载于:https://www.cnblogs.com/jingzhishen/p/3674230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机试题dddd,数据库系统概论试题及答案dddd_Image_Marked.pdf

数据库系统概论试题及答案dddd_Image_Marked数据库系统概论复习资料:第一章:一选择题:1.在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。在这几个阶段中,数据独立性最高的…

Android之AudioManager(音频管理器)详解

AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制。使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这个类的一个实例。 公有方法: Public Methods int abandonAudioFocus(AudioManager.OnAudioFo…

Asp.NetCore3.1开源项目升级为.Net6.0

概述自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net6.0。本质上来说我个人不太喜欢.Net6.0去掉…

ios开发备忘录三

为什么80%的码农都做不了架构师&#xff1f;>>> 在配置第三方库EGORefreshTableHeaderView的时候&#xff08;其实就只是一个头文件和一个源文件&#xff0c;还算不上库&#xff09;&#xff0c;可以从头文件发现 #import <QuartzCore/QuartzCore.h> 所以必…

Android之Eclipse下面如何看Android源代码

在看代码的时候,会经常用到 ctrl鼠标左键 去看自己写的类,有时候点到java的类或者android的类就无法打开,显示no class found之类的东西, 1.拿Button举例,ctrl加鼠标左键,然后显示了no class found之后,这时候会发现整个页面只有一个按钮可以点击,就是change attach source,如果…

项目管理 计算机仿真,分析计算机仿真技术在工程项目施工管理中的运用.pdf

第 33 卷 第 1 期(上) 赤 峰 学 院 学 报( 自 然 科 学 版 ) Vol. 33 No.12017 年 1 月 Journal of Chifeng University (Natural Science Edition) Jan. 2017分析计算机仿真技术在工程项目施工管理中的运用林振文(厦 门软件职业技 术学院 &#xff0c; 福 建 厦 门 361024 )摘…

C# 企业微信消息推送对接,实现天气预报推送

准备工作需要获取的东西1. 企业Id,2.应用secret 和 应用ID获取企业id注册完成后&#xff0c;在我的企业》企业信息》最下面企业id获取应用secret 和 应用ID发送微信消息class WeCom{public static string weComCId "ww2b b0bf8";//企业Id①public static string we…

通信协议——HTTP、TCP、UDP

TCP HTTP UDP:都是通信协议&#xff0c;也就是通信时所遵守的规则&#xff0c;只有双方按照这个规则“说话”&#xff0c;对方才能理解或为之服务。TCP HTTP UDP三者的关系:TCP/IP是个协议组&#xff0c;可分为四个层次&#xff1a;网络接口层、网络层、传输层和应用层…

++i 与 i++

i 与 i都能实现自增,它们的区别在哪? i:先自增,然后返回引用. i:先进行一个本地备份(可以理解为定义一个临时变量),自增,然后返回临时变量的引用. 理论上来讲,i操作会快于i,但由于现代编译器做了优化.所以,i与i在性能上的并无差别.转载于:https://www.cnblogs.com/heavenyes/p…

Visual Studio 远程调试正在运行的进程

使用场景当项目在测试环境上有bug&#xff0c;需要运行代码调试一下&#xff0c;这时就需要在测试环境上安装一个调试工具&#xff0c;然后在本地运行代码&#xff0c;远程链接到测试环境服务器来调试代码&#xff1b;&#xff08;假期鸽了这末长的时间&#xff09;方式一&…

直男约会能有多奇葩​?

1 六根烟来了七位领导怎么办&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 和36号鞋垫一样大的毛肚&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 直男约会能有多奇葩&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 高情商v…

Android之如何解决adb server is out of date,killing...ADB server didn't ACK

今天&#xff0c;久未出现的著名的“adb server is out of date. killing”又发生了&#xff0c;在此&#xff0c;将解决方法记下&#xff0c;以便日后查看。 1. 错误信息&#xff1a; C:\Users\lizy>adb devices adb devicesadb server is out of date. killing... ADB …

计算机如何实现共享接入,局域网内电脑实现共享设置方法

不同局域网内电脑怎么实现互访实现文件或打印机共享设置?下面由学习啦小编给你做出详细的实现共享设置方法介绍!希望对你有帮助!局域网内电脑实现共享设置方法&#xff1a;一、使用一条网线将两个路由器连接&#xff0c;网线插在路由器的LAN口上;二、两个路由器要设置两个不同…

python的内建函数详解

python内建函数最近一直在学习python&#xff0c;在网上看到和学习了关于python内建函数的一些分类和个内建函数的作用&#xff0c;下面是一些关于python内建函数的罗列&#xff0c;初学者的了解&#xff0c;分类可能不准确&#xff0c;一起交流。一、数学运算类abs(x)求绝对值…

【另类见解】一致性哈希就能解决分库分表问题了?

“开局一问&#xff1a;分库分表行为中&#xff0c;一致性哈希到底用处大不大&#xff1f;装B脑图现在是大数据的时代&#xff0c;其中一个体现就是数据量非常庞大。当然大数据的概念绝非是数据量就可以定义的&#xff0c;我自己给大数据下的定义是&#xff1a;无处不在的大量数…

DNS resolving 占用大量日志

公司内部DNS配置好后&#xff0c;测试解析正常&#xff0c;只是几乎每秒都有无法解析的日志产生。但分析日志时发现&#xff0c;每天的日志都有2G左右。日志中几乎全是类似network unreachable resolving www.baidu.com/A/IN:2001:5023:c27::2:30#53network unreachable resolv…

SQL Server 2008之DMF

陈述式管理架构&#xff0c;一个用于SQL Server数据库引擎的新的基于策略的管理框架 DMF是一个基于政策的用于管理一个或多个SQL Server 2008实例的系统。要使用DMF&#xff0c;SQL Server政策管理员使用SQL Server 管理套件创建政策&#xff0c;这些政策管理服务器上的实体&am…

Android之ActivityManage长用方法总结

Android 如何判断一个应用在运行 在一个应用中&#xff0c;或一个Service 、Receiver中判断一个应用是否正在运行&#xff0c;以便进行一些相关的处理。这个时候我们需要得到一个ActivityManager&#xff0c;这个Manager顾名思意就是管理Activity的&#xff0c;它有一个方法叫g…