C10问题

C10K问题是指服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是C0K这个名字的由来)。由于硬件成本幅度降低和硬件版本的提高,如果服务器能够解决多客户端的问题,那么也就意味着将降低每一个客户端的成本。

解决IO的策略:

1>用一个线程来同时为多个客户端服务,非阻塞IO以及水平触发的方式的就绪通知。

  所谓水平触发,是只要有数据就会触发,这种方式只需要将句柄设置成非阻塞的NO-BLOCK方式,通过selct/poll/epoll告诉应用层那个套接字需要进行处理,通过这种机制,内核告诉应用层那些文件句柄准备好了或者那些数据需要处理,如果是读操作表示缓冲区的数据一经准备好,不会发生阻塞状态,并且如果一次数据没有读取完成,内核就会不断的通知你来让应用层读取数据,如果是写操作,准备好了意味缓冲区一经准备好了,此时写操作也不会发生任何阻塞。

2>用一个线程来同时准备为多个客户端服务,非阻塞IO以及边缘触发的方式的就绪通知。

  边缘触发不同于水平触发,只有在文件描述符发生变化的时候内核才会通知你。当内核通知某个读描述符准备就绪后,当该缓冲区的所有数据被读出来状态才会改变,否则状态不发生改变。并且需注意,当客户端一次读取没有将客户端的数据读取完全,还有一部分数据在缓冲区里,这时内核不会通知应用层程序去读取,只有当下一次读取时,才会将数据读取出来。并且边缘触发有一个常见的bug,在某种情况下,内核一旦收到新的数据包的就绪通知,不管你上一次就绪的数据是否被应用层处理,所以如果某一次就绪通知的数据没有被正常的完整的处理,就开始下一个通知,那么下一次的就绪通知就会覆盖掉前面的数据,并且数据不可恢复。

原文地址:https://www.cnblogs.com/chenyang920/p/5574075.html