ICOP的一些结论 -- 仅是我的实践结论
来源:互联网 发布:vb,action属性值 编辑:程序博客网 时间:2024/04/26 05:48
对同一个连接连续调用多次WSASend是安全的,不需要等到前一个WSASend的操作完成,数据将按调用WSASend的调用顺序发送(当然,前提是没有人笨到用多线程对一个同一个连接连续调用多次WSASend).
但对同一个连接连续调用多次WSASend是一种不稳定的方案,因为可能出现WSAENOBUFS错误(实现总是如此丑陋),对于服务器而言,可能出现就是必然爆发. 由于没有机制可以量化多少个WSASend之后才会出现该错误,所以只能等出现了错误,再做错误处理,这样的逻辑很危险.
实践证明,多个WSASend不会提高发送速率,但会提高CPU占用率和WSAENOBUFS出现的几率,因为每个WSASend都要有一个完成处理流程,得不断地查问那么多的WSASend完成了没有,并作出处理.
对一个连接保持同时只有一个WSASend在运作,发送速率不会慢. 因为服务器不是服务于一个socket,而是服务于上千个socket,不要把IOCP下单个socket的得失看得太重.
一个连接保持同时只有一个WSASend是没错的,当然,也不要像我一样笨到每次WSASend只发送十几个字节数据,然后去责怪单次WSASend的低能,要知道WSASend接收的是一个缓冲区数组. 可以但不能浪费,不要走极端.
当SO_SNDBUF不为0, WSASend的数据被拷贝到底层缓冲区(AFD.sys)等待发送,出现WSAENOBUFS表示缓冲区不足.
当SO_SNDBUF为0, WSASend的数据被内核直接锁定,不可交换页面,这种资源是稀缺的,出现WSAENOBUFS表示物理页面数不足.
线程是个好东西,但越少越好.IOCP已经开了CPU*2个线程.
理论很完美,实现却要面对丑陋的现实.以上结论仅供参考.
- ICOP的一些结论 -- 仅是我的实践结论
- 一些显而易见的结论
- Time.TimeScale的一些结论
- 有关DAG的一些结论
- 矩阵的一些常用结论
- Catalan数的一些结论
- 看到的一些好的结论
- 有关“结对编程”的一些结论
- 一些比较经典的题目和结论
- 收集的一些题or结论
- 收集的一些题or结论2
- 从下载记录得出的一些结论
- 关于跨域的一些实验结论
- 一些数论的模板及相关结论
- 对SPFA算法的一些补充结论
- 一些关于数学的小结论(updating)
- 两个深刻的结论
- 树上的一个结论
- hibernate
- 类的静态成员函数和静态成员变量的使用
- Windows系统编程之异步I/O和完成端口
- 常用接口组件基础小TIPS
- http
- ICOP的一些结论 -- 仅是我的实践结论
- poj 2503 Babelfish
- [Unity 3D] Unity 3D 性能优化 (一)
- bugzilla 真是个不错的bug跟踪工具
- Nodejs 项目开发
- 内表操作
- Linux Shell常用技巧(一)
- 编译原理(自动机)软考考点总结
- c#面向接口编程