SocketIOCP
项目地址 : https://github.com/kelin-xycs/SocketIOCP
SocketIOCP
一个 用 C# Socket 实现 的 IOCP
这是一个 用 C# Socket 实现 的 IOCP 。
采用 Listener + Dispatch + Worker 的 设计, Listener 是一个线程, Dispatch 是一个线程, Worker 是 一组线程 。 一个 Socket 对应 一个 Worker , 一个 Worker 对应一个线程 。
Listener 负责监听 Accept() , 将 Socket 放到 SocketQueue 中, Dispatch 负责 从 SocketQueue 中 取出 Socket , 为 Socket 创建一个 Worker, 并 启动 Worker 。
测试结果, 可以 达到 每秒 15000 个请求, 和 常规写法 ReceiveAsync() 是 一个水平 。 两者 的 CPU 占用率 也 差不多 : Server 进程 20% 左右, System 进程 20% 左右 , 测试工具 12% 左右 。
但是, 效率 最好的, 是 常规写法 Receive(), 就是 1 线程监听 Accept(), n 线程 Receive() ,
每秒请求 也是 15000 的 水平 , 但是 短时间内 可以 上升 到 2 万 或者 23000 。
而且,有一点 重要 的 是, CPU 占用率 更低 。 Server 进程 10% 以下, 很多时候 5% 左右 , 有时候 5% 以下 。
System 进程 30% - 40% , 有时候 超过 40% 。 测试工具 10% 左右 。
从这里 可以 看出来, 常规写法 Receive() 的 loading 主要 是 在 System 进程 上 。 我想 Socket 的 工作线程 就在 System 进程 里。
System 进程 是 系统进程 。 操作系统 的 内核工作 应该 就是在 这个 System 进程 里 。 包括 Socket 虚拟内存 等 。
从这里可以 看出来, 并发测试 的时候, System 进程 正在做 跟我们 一样 的事, SocketIOCP 相当于 在 外面 又 把 Socket 做的 事 又 做了一遍 。 ^^ 这就好像 在 裤子外面 又 套了一条裤子 , 当然 会 显得 笨重 和 更加占用 CPU 资源。
但是 反过来, 如果 从 这个角度 来看的话, SocketIOCP 能做到 现在这样, 也是 不错 了 。 ^^
SocketIOCP 的 设计, 如果用来 处理 底层 数据 的 输入输出, 也会 表现的 很出色 的 。
最终 的 这个 版本, 实际上 和 常规写法 Receive() 一样, 为 每个 Socket 分配 一个 线程 。 这和我最初 的 “用 最小数量 的 线程 来 完成 数据处理 工作” 的 想法 不太一样 。
因为 , 对于 分时 多任务 , 线程 是 最自然 的 做法 。 另一方面 , 为了 保持 实时 响应性 , 也 只能 这样 做 。
所以, 如果 我们 要写 Socket 网络应用 , 那么 可能 常规写法 Receive() 还是 最好 的 写法 。 常规写法 Receive() 参考 这篇文章 : https://blog.csdn.net/andrew_wx/article/details/6629721/
SocketIOCP的更多相关文章
随机推荐
- 浅谈Linux
Linux系统最初由芬兰赫尔辛基大学的Andrew S.Tanenbaum写的MINIX操作系统演变而来,这是一个小型操作系统,主要用于教学,1991年1月,Tanenbaum的学生Linus Tor ...
- python-day33--Process类中的方法及属性
p.daemon = True -->守护进程,守护进程不可以再有子进程,并且主进程死守护进程就死,要写在p.start()之前 p.join() ---> 主进程等子进程执行完 之后再结 ...
- php date时间的获取
1.得到当前时间:date('Y-m-d H:i:s',time()); 2.得到这个月有多少天:echo $getDay = date('t',date('Y-m-d', time())); 3.得 ...
- nyoj1272表达式求值(递归法)
递归写的,类似于之前的一道,但要更难一点,因为加入了'+','*'以及括号运算符,所以要考录周全: 这道题给了我很大启示,在第一道德基础上: 1!寻找括号的优先级,先找有没有不被任何括号夹住的加号,如 ...
- iOS UI-集合视图(UICollectionView)
BowenCollectionViewCell.xib #import <UIKit/UIKit.h> @interface BowenCollectionViewCell : UICol ...
- dubbo管理控制台搭建
1. 从网上下载dubbo管理控制台:dubbo-admin-2.5.4.war 2. 下载tomcat7,解压缩 3. 将tomcat7 webapps/ROOT的文件全部删除,然后把dubbo-a ...
- 【VUE】@click加上v-bind绑定切换类名及动画事件
好长的名字... 效果是 点击元素,通过改变类名的方式让其改变颜色+移动动画效果,这里用的是v-bind和@click 废话不说 show me the code! <div id=" ...
- 简话Angular 03 Angular内置表达式大全
一句话: 大多数html标签属性和事件都有一个对应的ng指令 说明:这些指令和原生html最大的区别就是可以动态更新.比如一个div的样式用ng-class后,我们就可以随意应用css class. ...
- 简话Angular 02 Angular控制器-作用域嵌套
一句话: 就是孩子可以啃老,老子不能动孩子一根毛! * 子控制器有父控制器里变量的所有权限,可以读取,也可以修改. * 父控制器不能读,也不能修改孩子的变量 1. html代码 <div ng- ...
- Xshell5 Xftp安装图解
1Xshell5 Xftp_5安装图解 2.1Xshell5安装 2.2Xftp安装