select调用
- 用户空间的timeout会被拷贝到内核的end_time(设定时间)
- 内核空间会分配6个fdset,分别为in,out,exception(给用户输入用的),还有res_in, res_out, res_exception(3个相应的输出给用户的)
- 用户fd_set会被拷贝到内核in, out, exception
- 遍历所有fd, 调用sock_poll
- 遍历完后, 可能会返回一个mask掩码(如果有读写事件发生的话), 这mask是用来设置fd_set的
- 也有可能没有,要是调用时间没有超过timeout,就继续重新遍历,如果超过了就返回
- 将fd_set从内核拷贝给用户空间, 也有可能是什么事件都没有反而是超时返回
select的问题
7. select需要两次内核<---->用户户空间的拷贝过程, 要是fd的数量过大, 这个拷贝过程很消耗时间.
8. 而且遍历时间也相当耗时,遍历所有的fd,如果fd多了,就会很耗时.
9. fd的数量最大是1024(32bits OS), 2048(64bits OS)