原创

redis网络模型-IO多路复用之select


select是Linux中最早的I/O多路复用实现方案:

微信截图_20230212235316

在select中创建完fd_set rfds后用bit位代替了正真的fd的值,可以大大的节省内存空间,然后执行select方法,参数有5个

  • fd_set的最大fd + 1
  • 监听读事件的fd集合
  • 监听写事件的fd集合
  • 监听异常事件的fd集合
  • 超时时间(时间单位秒)

在用户空间调用select方法后,内核空间要负责监听这些fd数据,因此在我们执行select方法的那一刻就需要把rfds拷贝到内核空间(也就是从用户态到内核态的切换),拷贝完后内核态就可以去监听这些fd了

内核态拿到这些数据后会先遍历一遍(从最低位开始遍历直到用户态传递的最大值为止),看看这些被标记了的fd就绪了还是没有就绪,如果没有就绪就休眠等待,只要有任意的fd可读就被唤醒

微信截图_20230213001022

唤醒后就要把就绪的fd结果通过从头遍历fd_set的方式写到fd集合里面去

假设fd=1的数据就绪除了下标为1的赋值为1其他的赋为0

微信截图_20230213001259

此时select方法会返回一个int的值就是告诉用户有几个fd就绪了,但是select只是返回了就绪fd的数量没有告诉就绪fd的位置

所以内核空间赋值完数组后会把fd_set数组覆盖掉用户空间的fd_set数组,也就是拷贝回去

然后用户空间再进行遍历fd_set数组来确认哪些fd就绪了

微信截图_20230213002036

redis原理
网络模型
  • 作者:陌攻(联系作者)
  • 发表时间:2023-02-16 09:17
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论