困惑

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

     for(;;) {
//通过FD_SET告诉内核你感兴趣的fd
fd_set read_fds;
FD_CLEAR(&read_fds);
FD_SET(fd[],&read_fds);
...
FD_SET(fd[n-],&read_fds);
int maxfdp1 = max(fd[],...,fd[n-]) + ; //获取最大的fd+1 //select采取轮训模式采取
struct timeval tv=;
nready = select(maxfdp1 ,&fd_rds, NULL, NULL,&tv); //有FD可读
if (nready > ) {
for (int i=;i<n;i++) {
if(FD_ISSET(fd[i], &read_fds)) {
recvfrom();
doSomething(); //没有多线程
}
}
}
}

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

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

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

解惑

我对并发有误解。并发和并行是不一样的。并行指的是同一时刻多个进程或线程同时处理。并发指的是一段时间内(比如30s)处理多个任务或fd。这样的话,疑惑就解开了。

题外话:IO复用究竟是什么

IO复用的本质是内核级别的对多个fd进行轮询,然后哪个好了就通知用户代码。这么的优点是,如果没有IO复用,用户需要自己去轮询哪个fd准备好了,亦或更糟糕一点,一个线程阻塞等待一个fd。因此IO复用只是在fd是否就绪这个问题上帮助用户代码,所谓就绪包括请求到来。但是真正处理请求。但是真正处理请求,是由用户自己的工作进程或工作线程来处理的,如果同时请求量过大,超过了单机处理的能力,那么需要我们自己设计多线程或者线程池排队或者分流机制,这个和IO复用不冲突,也没有关系。

select的缺点

老生长谈的问题了。

1、最大并发数限制:使用32个整数的32位,即32*32=1024来标识fd,虽然可修改,但是有以下第二点的瓶颈;

2、效率低:每次都会线性扫描整个fd_set,集合越大速度越慢;

3、内核/用户空间内存拷贝问题。把fd_set从用户态拷贝到内核态,然后又要拷贝出来,效率低。

最新文章

  1. flex布局
  2. Typescript 中类的继承
  3. Ruby-调用windows窗体
  4. mysql innodb存储引擎介绍
  5. 【持续集成】[Jenkins]Job中如何传递自定义变量
  6. SQL语句技巧(上个样式太差了)
  7. 三元运算+lambda表达式
  8. A*(A星)算法python实现
  9. Win Mingw-64获取
  10. DataContext 数据在F5刷新频繁,会出现数据读取错误
  11. MyXLS案例
  12. 关于ue上传图片到七牛云设置key
  13. 转:MySql的commit和rollback
  14. 卸载QTP
  15. Nis+Nfs+Autofs
  16. uva12519
  17. left join 连表时,on后多条件无效问题
  18. 如何查看selenium的版本号
  19. [转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
  20. iTOP-4418开发板Qt系统下运行摄像头测试程序

热门文章

  1. nodejs连接mongodb(密码)
  2. JAVA 基础编程练习题25 【程序 25 求回文数】
  3. layer弹框层学习笔记
  4. 建立第一个Django工程---linux中的python
  5. jQuery.fn.extend与jQuery.extend的区别
  6. Mysql按照设计顺序获得某个表的字段名称,字段类型,字段描述!!!!!
  7. selenium3 web自动化测试框架 五: 数据驱动简介及基础使用
  8. Django:(07)数据库
  9. “但行好事 莫问前程 只问耕耘 不问收获 成功不必在我 而功力必不唐捐” 科技袁人&#183;年终盛典——5G是科技时代非常重要的基础设施
  10. OpenGL.英文