select函数中的算法

先讨论与IO无关的东西.
调用select 的流程是
1 将要监听的文件描述符(集)a,b,c选入一个集合S
2 调用select,可以设置超时参数
4 函数内部设置S集合中的描述符
3 函数返回,解析S中还有哪些述符

怎样高效的来实现上述的过程.我们知道文件描述符是一个较小递增不重复的int,根据这个特点,我们可以用bitmap算法来实现,本质是一个映射关系.用几个较少的数来表示很多的数
首先我们来讨论一下怎么用一个数来表示多个数.比方数123里面有三个数字1,2,3.把5,6,7打包成一个数,即567,很简单.把56,7打包成一个数,也是567.是不是懵了.也就是说这种表示是有问题的,解包的时候不确定,而且你也不能把两个大数打包,这样会溢出.计算机都是二进制的世界.我们考虑一下二进制数.
比如1为1,2为10,4为100,8为1000
我们这么规定,给定一个二进制数(x)第几(n)位是1就表示包含该数(n)
比如101,我们就知道包含两个数1,3.
10110就包含三个数2,3,5
1000000只包含一个数7
1111111111就包含了1,2,3,4,5,6,7,8..
1111111.......包含1,2,3,4,5,6,7........
可以无限发展吗?要知道计算机里的数表示是有边界的
一个int只有32位,即最多包含32个数.由于32太多,为了书写起来方便,我们已8位来讨论边界问题
8个1能表示8个数,10000000表示数8.如果要表示数9怎么办,没有办法了吧.
再回到上面的集合S来,将一些较小的数选入集合,我们都是有办法来表示的
FD_SET(1,&set);
FD_SET(2,&set);
...
FD_SET(8,&set);
FD_SET(9,&set); //这里可能就要溢出了,因为set最多只能有8位了.
我们再借一个set来表示9可不可以.
FD_SET(1,&set[0]);
FD_SET(2,&set[0]);
...
FD_SET(8,&set[0]);

FD_SET(9,&set[1]);
FD_SET(10,&set[1]);
看到没,我们用第一个set来表示了
我们来正式讨论select函数中的文件描述符集
用尽可能多的1来盛装一个数,64位linux中用64位数来表示,也就是说一个set可以最大表示64个数,要想表示第65个,必须再起一个set.要想表示1024个数,则有64个set,第一个set[0]表示[0,63],第二个set[1]表示[64,127]....第16个set[15]表示[960,1023]
fd_set的结构实际上是__fds_bits[N]的数组N为Max/(sizeof(long int)*8) MAX为1024
为什么Max是1024,这个涉及到效率问题,底层控制太多的文件描述符也会降低效率.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值