select是Linux中最早的I/O多路复用实现方案:
在select中创建完fd_set rfds
后用bit位代替了正真的fd的值,可以大大的节省内存空间,然后执行select方法,参数有5个
在用户空间调用select方法后,内核空间要负责监听这些fd数据,因此在我们执行select方法的那一刻就需要把rfds拷贝到内核空间(也就是从用户态到内核态的切换),拷贝完后内核态就可以去监听这些fd了
内核态拿到这些数据后会先遍历一遍(从最低位开始遍历直到用户态传递的最大值为止),看看这些被标记了的fd就绪了还是没有就绪,如果没有就绪就休眠等待,只要有任意的fd可读就被唤醒
唤醒后就要把就绪的fd结果通过从头遍历fd_set的方式写到fd集合里面去
假设fd=1的数据就绪除了下标为1的赋值为1其他的赋为0
此时select方法会返回一个int的值就是告诉用户有几个fd就绪了,但是select只是返回了就绪fd的数量没有告诉就绪fd的位置
所以内核空间赋值完数组后会把fd_set数组覆盖掉用户空间的fd_set数组,也就是拷贝回去
然后用户空间再进行遍历fd_set数组来确认哪些fd就绪了
评论