码迷,mamicode.com
首页 > 其他好文 > 详细

关于select的困惑

时间:2018-02-28 22:59:37      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:set   处理   struct   select   some   time   strong   哪些   高手   

首先,我知道select是IO复用。以UDP为例,select流程大体如下:

 1     for(;;) {
 2         //通过FD_SET告诉内核你感兴趣的fd
 3         fd_set read_fds;
 4         FD_CLEAR(&read_fds);
 5         FD_SET(fd[0],&read_fds);
 6         ...
 7         FD_SET(fd[n-1],&read_fds);
 8         int maxfdp1 = max(fd[0],...,fd[n-1]) + 1; //获取最大的fd+1
 9 
10         //select采取轮训模式采取
11         struct timeval tv=0;
12         nready = select(maxfdp1 ,&fd_rds, NULL, NULL,&tv);
13         
14         //有FD可读
15         if (nready > 0) {
16             for (int i=0;i<n;i++) {
17                 if(FD_ISSET(fd[i], &read_fds)) {
18                     recvfrom();
19                     doSomething();    //没有多线程
20                 }
21             }
22         }
23     }

但是网上很多人都说这个框架使得服务端实现了并发。我很好奇的是,这个并发是怎么实现的?

因为select返回大于0后,开始检查read_fds,看是哪些FD已经可读。比如fd1和fd5可读了,我肯定先处理fd1的数据,这时候我可能处理的时间较长(比如说1秒),那么fd5就是要1s后才能处理,这样怎么就并发了呢?要是有100个FD可读,每个fd的数据都花了1秒处理,那么这个框架性能岂不是很差。

注意:我是想说在dosomething()没有多线程的情况下,不就是顺序执行的,一个一个FD按个处理。可能我对并发的理解也不到位,希望有高手能帮我答疑解惑。非常感谢。

关于select的困惑

标签:set   处理   struct   select   some   time   strong   哪些   高手   

原文地址:https://www.cnblogs.com/howo/p/8485903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!