C10问题
2016-06-10 19:12
253 查看
C10K问题是指服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是C0K这个名字的由来)。由于硬件成本幅度降低和硬件版本的提高,如果服务器能够解决多客户端的问题,那么也就意味着将降低每一个客户端的成本。
解决IO的策略:
1>用一个线程来同时为多个客户端服务,非阻塞IO以及水平触发的方式的就绪通知。
所谓水平触发,是只要有数据就会触发,这种方式只需要将句柄设置成非阻塞的NO-BLOCK方式,通过selct/poll/epoll告诉应用层那个套接字需要进行处理,通过这种机制,内核告诉应用层那些文件句柄准备好了或者那些数据需要处理,如果是读操作表示缓冲区的数据一经准备好,不会发生阻塞状态,并且如果一次数据没有读取完成,内核就会不断的通知你来让应用层读取数据,如果是写操作,准备好了意味缓冲区一经准备好了,此时写操作也不会发生任何阻塞。
2>用一个线程来同时准备为多个客户端服务,非阻塞IO以及边缘触发的方式的就绪通知。
边缘触发不同于水平触发,只有在文件描述符发生变化的时候内核才会通知你。当内核通知某个读描述符准备就绪后,当该缓冲区的所有数据被读出来状态才会改变,否则状态不发生改变。并且需注意,当客户端一次读取没有将客户端的数据读取完全,还有一部分数据在缓冲区里,这时内核不会通知应用层程序去读取,只有当下一次读取时,才会将数据读取出来。并且边缘触发有一个常见的bug,在某种情况下,内核一旦收到新的数据包的就绪通知,不管你上一次就绪的数据是否被应用层处理,所以如果某一次就绪通知的数据没有被正常的完整的处理,就开始下一个通知,那么下一次的就绪通知就会覆盖掉前面的数据,并且数据不可恢复。
解决IO的策略:
1>用一个线程来同时为多个客户端服务,非阻塞IO以及水平触发的方式的就绪通知。
所谓水平触发,是只要有数据就会触发,这种方式只需要将句柄设置成非阻塞的NO-BLOCK方式,通过selct/poll/epoll告诉应用层那个套接字需要进行处理,通过这种机制,内核告诉应用层那些文件句柄准备好了或者那些数据需要处理,如果是读操作表示缓冲区的数据一经准备好,不会发生阻塞状态,并且如果一次数据没有读取完成,内核就会不断的通知你来让应用层读取数据,如果是写操作,准备好了意味缓冲区一经准备好了,此时写操作也不会发生任何阻塞。
2>用一个线程来同时准备为多个客户端服务,非阻塞IO以及边缘触发的方式的就绪通知。
边缘触发不同于水平触发,只有在文件描述符发生变化的时候内核才会通知你。当内核通知某个读描述符准备就绪后,当该缓冲区的所有数据被读出来状态才会改变,否则状态不发生改变。并且需注意,当客户端一次读取没有将客户端的数据读取完全,还有一部分数据在缓冲区里,这时内核不会通知应用层程序去读取,只有当下一次读取时,才会将数据读取出来。并且边缘触发有一个常见的bug,在某种情况下,内核一旦收到新的数据包的就绪通知,不管你上一次就绪的数据是否被应用层处理,所以如果某一次就绪通知的数据没有被正常的完整的处理,就开始下一个通知,那么下一次的就绪通知就会覆盖掉前面的数据,并且数据不可恢复。
相关文章推荐
- Qt中添加背景图片
- 运输问题(最小费用流)
- 《剑指offer》:[32]从1到n整数中1出现的次数
- 内存泄漏 OOM
- Spring Mvc那点事---(15)Spring Mvc之mybatis条件表达式
- 第十六周阅读程序-6
- 两个Activity跳转调用的方法
- 20条正则表达式
- Taglist:Exuberant ctags.......
- 单例模式
- 大数据知识(1)--zookeeper原理
- [Java类加载器]Java中classLoader浅析.
- Android 面试精华题目总结
- Java override与overload
- C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
- CodeForces 616A 大数的比较 字符串的使用
- Docker Blog List
- C#—实验11—GDI编程—1、2、4
- leetcode笔记--Minimum Depth of Binary Tree
- 5710 Digit-Sum(找规律)