嘉兴高端网站定制,网站模板下载后怎么使用,昆明网站优化建设,网站的开发设计的技术select: 轮询fd_set 1.采用fd_set存储fd#xff08;fd_set通过数组位图实现#xff09; 2.每次调用select#xff0c;都需要把fd集合从用户态拷贝到内核态#xff0c;fd越多开销越大 3.每次调用select#xff0c;都需要在内核遍历传递进来的fd#xff0c;开销大(轮询fd_set 1.采用fd_set存储fdfd_set通过数组位图实现 2.每次调用select都需要把fd集合从用户态拷贝到内核态fd越多开销越大 3.每次调用select都需要在内核遍历传递进来的fd开销大(轮询 4.select支持的fd数量太少102432个32位的整数也就是2的10次方受fd_setsize参数限制改变这个参数的话需要重新编译内核 具体想要突破fd_setsize参数限制的话有以下2个方法 1修改sys/types.h头文件中的fd_setsize值并且重新编译内核当然这并不是一个好的方法fd_setsize的值变大意味着我们轮询一次的时间需要加长 2通过多核CPU采用分而治之负载均衡的思想将连接注册在多个select上并发select不仅能突破fd_setsize限制而且能提高性能有点map -reduce的思想这里还有一个问题就是当一个轮询器poller上的最大轮询数量超过了1024还能不能注册的问题我们同样可以采用分而治之的多线程轮询策略来解决比如连接数2000线程1轮询0到1023线程2轮询1024-2000 5.调用select返回的是含有整个句柄的数组需要遍历整个数组才知道哪些句柄发生了事件轮询 6.select的触发是LT模式效率不高 poll轮询链表 1.采用链表存储fd没有了fd数量限制但是上述其他缺点依然存在 epoll红黑树双链表回调机制 1.红黑树挂载事件事件发生时通过回调机制将事件添加到双链表中 2.检查是否有事件发生时不需要轮询只需要检查双链表即可 3.保证每个fd只会被拷贝一次事件被加入到epoll中时fd就会被拷贝进入内核而不是在epoll_wait时拷贝使用了mmap加速内核与用户空间的消息传递无论是select还是poll都需要内核把fd消息通知给用户空间如何1避免不必要的内存拷贝就很重要在这点上epoll通过内核与用户空间mmap同一块内存实现 4.fd数量上限为最大可以打开的文件数目这个我们可以通过调整内核的参数来改变通过ulimit -n来调整或者setrlimit函数设置当然这个需要root权限但是一个系统能打开的文件最大数目也是有限制的取决于内存大小可以通过cat/proc/sys/fs/file-max查看 该双链表我们一般叫做就绪事件链表 当然以上的优缺点仅仅是在高并发且任一时间只有少数socket活跃的特定场景下的如果并发量高socket都比较活跃的情况下select就不见得会比epoll慢就像我们常常是快排比插入排序快但是在特定的情况下并不成立 什么情况下使用selectpoll的性能好于使用epoll 高并发少活跃socket的情况下select的轮询在于每次轮询都会轮询到不活跃的套接字从而浪费了时间导致效率慢 但是当高并发多活跃socket的情况下select的轮询每次都能很快的轮询到活跃的套接字这种情况下也是可以考虑使用select的 最后总结一下 并发低 socket活跃 select/poll 并发低 socket不活跃 select/poll 这两种情况使用epoll[红黑树链表回调机制]有点杀鸡用牛刀的感觉 并发高 socket活跃 select/poll的性能不一定比epoll差 并发高 socket不活跃 epoll //先码着后面准备自己实现一下这三种机制 转载于:https://www.cnblogs.com/yinbiao/p/10945624.html