- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2013-02-26 15:20 编辑
yulihua49 发表于 2013-02-26 14:50 ![]()
select服务器移植到UNIX啦,在solaris服务器上测试:4核8超线程的服务器:
平均时间: IFACE rxp ...
关于锁非常多的问题,这里是利用锁提高了select的效率。
select必须在调用时设置好fds。它进入后设置的任何状态都是无效的。因此每个线程归还fd后都要煽它一次。
那么许多线程就可能不断的煽它。造成低效。这时需要一个“聚束”的工作,大家设置好fds以后煽一次就行了。
见这一段代码:- pthread_mutex_lock(&beatLock);
- FD_SET(sock,&rfds);
- if (conn->woff > 0) FD_SET(sock,&wfds);
- // FD_SET(sock,&efds);
- pthread_mutex_unlock(&beatLock);
- if(!pthread_mutex_trylock(&beatLock)) {
- beatc='\n';
- write(beat[1],&beatc,1);
- pthread_mutex_unlock(&beatLock);
- }
复制代码 第6行,每个线程测试加锁,如果不能获取锁就拉倒。最后的线程获得了锁,煽了select。
这时一个无损聚束的动作,不需要聚束时间,哪怕只有一个线程也不会耽误。
效果嘛,你看看前边1000个连接的,每次都可以激活500-800个fds,虽然每次要遍历1024个fd,但是能够激活那么多fd,平均每个fd开销就不算大了,达到了接近epoll的水平。
前边100个连接的可以聚束到十几个。 |
|